一般的开发信息就不多说了,具体可以从官方文档了解。下面就记下我开发过程中遇到的一些奇葩坎和需要注意的地方。
微信与我提供的微信处理接收页面(官方称为服务器地址,目前仅支付80端口)的交互,分为两种请求方式post和get。
微信服务器配置启用的时候,也就是设置对微信请求的处理的页面的时候,这时候是一次get请求,返回随机字符串则表示验证通过,即启用成功。
用户使用微信发送的消息事件什么的都是用post方式的请求,与此同时也会用get的请求推送参数到处理页面用来验证是否为微信发送过来的请求。
那么,对于微信请求的消息返回我们想返回的消息给用户,就完成了与微信的交互。
用日志查看,上传一次程序,再看一眼日志……如此循环,心情糟糕透了。
用花生壳调试,不用上传,实时调试,效率提升了不少。资料:http://www.cnblogs.com/zskbll/p/4074855.html
另外,因为微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。所以当调试的时候,因为断点的停留,导致多个请求同时进来不好调试 ,所以用个变量把它限定在第一个请求。
private static int requestNum = 0;//测试的时候方便调试只用第一次请求的参数(微信无相应会重复请求3次的响应) public void ProcessRequest(HttpContext context) { requestNum++; if (requestNum == 1) { Auth(); } }
两种支付请求:
1.使用JS API发起支付请求
2.使用Native API发起支付请求
从官方下载了支付的C#demo,打开NativePayPage.aspx页面,即扫码支付(Native API)模式二,在发起“统一下单接口”请求的时候,在HttpService.Post处报错“连接不到远程服务器”,或者“请求超时”。
另外,在模式一扫码的时候,微信提示“获取商户订单信息超时或商户返回httpcode非200”
解决方法:在HttpService类里的Post和Get请求里注释以下代码(我不知道这个代理设置有什么用,反正注释掉就可以了,知道原因的麻烦告诉我)
//(代理暂不知道有何用,暂注释掉,否则请求报错) //设置代理 //WebProxy proxy = new WebProxy(); //proxy.Address = new Uri(WxPayConfig.PROXY_URL); //request.Proxy = proxy;
扫码模式(Native API):
模式一:线下二维码支付(我想应该是这样)
流程:
1.商户将商户订单ID生成二维码
2.用户扫码
3.微信处理扫码结果,请求商户设置Native原生支付的支付回调URL(在官方demo里的页面为NativeNotifyPage.aspx)
4.在NativeNotifyPage.aspx里调用微信的“统一下单接口”
5.弹出输入密码的支付界面,用户确认支付
6.微信请求支付结果通知回调url(在官方demo的WxPayConfig类里的NOTIFY_URL)
7.在NOTIFY_URL里做业务处理
模式二:线上扫码支付(比如官网接入扫码支付)
流程:
1.调用微信的“统一下单接口”生成二维码
2.用户扫码
3.弹出输入密码的支付界面,用户确认支付
4.微信请求支付结果通知回调url(在官方demo的WxPayConfig类里的NOTIFY_URL)
5.在NOTIFY_URL里做业务处理
扫码支付成功之后,对于未关注公众号的用户发送不了模板消息。在未关注公众号的情况下即使支付成功,并在支付成功界面勾选(默认勾选)关注公众号也不会发送消息。
发送“模板消息”后微信服务器会发送“模板消息”是否发送成功的消息给接收消息页面。但我不知道接收到消息之后要如何处理,如果发送失败是要写入异常日志呢,还是做其他用处。
1.报“redirect_uri参数错误”
原因:“网页授权获取用户基本信息”接口的授权回调页面域名未设置。
2.用官方提供的JS支付页面,支付成功后没有执行回调函数。
解决:官方提供页面里的submit按钮使用的是asp.net的服务器控件,另外改成<button></button>也不用,原因不详。改成<input type="button" />和<a>标签都可以使用,即执行回调函数。
3.报“不允许跨号支付”
解决:取消关注公众号,再重新关注后进行支付。
微信里的图片和微信内置浏览器均有缓存,导致更改了图片或样式后预览没有及时发生改变。
解决缓存的方法:
1.在文件后面加上参数,比如:/css/index.css?v=1221
2.另外博客园的网友说这样也可以,我觉得应该可以,没有印证。
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" />
自定义菜单里的key相当于一个标识,点击时会发送请求到商户设置的消息处理页面,我们则根据key做相关处理。