微信公众号支付(JSAPI)遇到的坑
微信公众号支付(JSAPI)遇到的坑
-
微信浏览器内支付属于微信公众号支付
-
配置内容:
- 接口权限:网页授权回调域名(保证文件可访问)
- 公众号设置--功能设置:JS接口安全域名,业务域名
- 微信支付--开发配置:支付授权目录,测试授权目录,测试白名单
其中1 2都为域名,而且不需要http等内容,直接XXX.XXX.com即可,可以为二级域名
1只能设置一个,因此,为了保证测试环境和线上环境都可以同时使用,请注意项目部署。
2 3域名可以为多个,因此,可以忽略项目部署情况。
支付授权目录配置注意事项:这里很重要我就是在这里折腾了很久。怎么设置呢,首先要看你支付的当前页面URL 比如是:http://www.taidupa.com/wxpay/js_api_call.php 你就必须填写: http://www.taidupa.com/wxpay/ 假如是:http://www.taidupa.com/wxpay/order/id/56.html 你就必须写:http://www.taidupa.com/wxpay/order/id/ 看出规律了吧,就是把最后一个反斜杠后面的内容去掉就OK了。
-
流程
- 网页授权获取用户openId
-
oauth方式获取code
注意:redirect_uri需要进行UrlEncode编码
坑:#wechat_redirect 该内容有可能会丢失, 需要用encodeURIComponent编码
坑:网页回调域名和JS安全域名,都不用加http://location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx79382fc60975273b&redirect_uri='+encodeURIComponent(xxxxxx)+'&response_type=code&scope=snsapi_base&state=123'+ encodeURIComponent('#wechat_redirect');
-
根据code获取openId
-
- 根据openId等信息调用预下单接口生成预下单id
- 根据预下单id,在页面内调起微信支付
用多种设备尝试测试,有些提示会不同,但是原因是相同的,可以综合考虑得出正确结论。(重要)
生成签名的时候,需要所有不为空的参数参与生成 - 网页授权获取用户openId
-
预支付接口,body为中文时,会出现签名错误的问题。在调用接口时,发送的参数,需要进行以下编码
Response response = HttpUtils.post( this.url + "/pay/unifiedorder" , new String(xml.getBytes(), "ISO8859-1") , "text/xml" , HttpUtils.DEFAULT_CHARSET_NAME );