背景:公司系統想要實現微信查詢功能,但是公司服務器么有申請80端口,由於測試階段,還不想去申請(主要怕麻煩)
由於自己有一個網絡空間,之前的解決方案是將微信的相關處理寫在我的空間里面,公司系統里面提供一個接口,然后我自己調用這個接口得到數據再返回給微信(因為微信不支持非80或443端口,而公司服務器么有開通響應端口)
遇到問題:首先自己網站項目多了一些沒必要的東西不說,開發調試的時候麻煩,因為是兩個項目,一個公司系統,一個自己的。。。
現在想如果把微信相關處理寫在公司系統里面,這樣就不用每次打開兩個項目了,微信既然不能直接連接到公司的非80端口系統,那么我在自己空間里面寫一個處理,將微信調用的各種參數以原樣的方式傳送到公司系統接口里面獲取數據,再原樣返回
(個人覺得有點委托的意思)
廢話不多說,正文開始:
方案流程:
項目中新建一個一般處理程序,用於微信調用:
代碼如下:
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //獲得URL參數 string URLParam = HttpContext.Current.Request.Url.Query; string URL = ConfigurationManager.AppSettings["XAQYURL"];//從配置文件獲取URL //URL = "http://localhost:7067/WX/WXInterface.ashx";本地測試,要把服務器地址重新定義,發布的時候注釋掉即可 string NewURL = String.Format("{0}{1}", URL, URLParam);//得到新的帶參數的URL地址 string result; if (context.Request.HttpMethod == "GET")//如果是Get請求,直接以Get方式調用自己的接口,一般用在微信接入驗證 { result = NetData.GetData(NewURL); } else//Post請求,一般用在發送消息 { context.Request.InputStream.Position = 0; StreamReader reader = new StreamReader(context.Request.InputStream); string sReqData = reader.ReadToEnd();//加密XML信息 result = NetData.Post(NewURL, sReqData); } HttpContext.Current.Response.Write(result); }
此時已經完成了跳轉
本地接收處理段代碼略,(前面有講過,詳見:《微信企業號開發日志》之企業號接入)
接下來本地測試下效果!
成功了,這樣我完成了微信鏈接非80端口的橋梁,理想情況下我上傳到FTP后就不用管了,我只是在我之前有80端口的項目上加了一個一般處理程序WXInterface.ashx,簡介了不少
把微信相關處理都放在了公司非80端口系統里面,以后工資申請了80端口以后,也不需要改動,直接微信上改動就行了
公司項目改動:
各自上傳,然后更改微信驗證地址:
附上NetData.GetData和NetData.Post的方法
public string PostWithParm(string url, string data) { string returnData = null; try { byte[] buffer = Encoding.UTF8.GetBytes(data); HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(url); webReq.Method = "POST"; webReq.ContentType = "application/x-www-form-urlencoded"; webReq.ContentLength = buffer.Length; Stream postData = webReq.GetRequestStream(); webReq.Timeout = 99999999; //webReq.ReadWriteTimeout = 99999999; postData.Write(buffer, 0, buffer.Length); postData.Close(); HttpWebResponse webResp = (HttpWebResponse)webReq.GetResponse(); Stream answer = webResp.GetResponseStream(); StreamReader answerData = new StreamReader(answer); returnData = answerData.ReadToEnd(); } catch (Exception ex) { return "獲取錯誤:" + ex.Message; } return returnData.Trim() + "\n"; } public string GetWebData(string URL) { String ReCode = string.Empty; try { HttpWebRequest wNetr = (HttpWebRequest)HttpWebRequest.Create(URL); HttpWebResponse wNetp = (HttpWebResponse)wNetr.GetResponse(); wNetr.ContentType = "text/html"; wNetr.Method = "Get"; Stream Streams = wNetp.GetResponseStream(); StreamReader Reads = new StreamReader(Streams, Encoding.UTF8); ReCode = Reads.ReadToEnd(); //封閉臨時不實用的資料 Reads.Dispose(); Streams.Dispose(); wNetp.Close(); } catch (Exception ex) { return ex.Message; } return ReCode; }
本節到此結束