背景:公司系统想要实现微信查询功能,但是公司服务器么有申请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() + " "; } 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; }
本节到此结束