spinachcqb 2019-06-26
其实任何接口开发只要按照给出来的接口文档和例子开发基本上不会有太大问题的,一些问题都是出在杂七杂八的小细节上,现在分享一下微信支付开发中自己遇到的小细节。
按照文档做完开发前配置,比如JS安全域名配置、网页授权域名、公众号授权目录等等...
看完微信支付的文档,了解接口的规则,微信支付的流程基本是:获取openid -> 生成统一下单参数 -> 用户支付 -> 回调 ,其实没有太复杂
在配置上面说的东西的时候也会有一些小问题
文档中也有给出了例子,在example文件夹,当时在第一步获取openid就卡住了。
先讲一下我这边代码框架是前端vue + 后端thinkphp给出api接口实现数据交互这样的。
在第一步获取openid中,需要做header("Location:....")
重定向获取到code
然后跳转回来Curl访问access_token
接口获取到用户openid。
如果前端下单本身就是一个页面跳转那可以按照demo的写法直接用,但是如果是前端post请求是没法做重定向操作,所以获取openid和生成统一订单参数不能放在同一个方法内实现。
在前端异步的请求中会报Access-Control-Allow-Origin
的跨域问题,而且是报api.weixin.qq.com
不能跨域到api.weixin.qq.com
。
所以如果遇到以上跨域问题~那就是你的前端异步请求和获取openid写到一起了,但是异步请求无法响应header重定向的原因。
如果你的项目中在其他地方已经获取到openid那这部分就不存在问题了
生成统一订单参数要严格对照 参数文档的参数写,example
文件夹的例子中有写好的组装参数方法,可以直接调用没有太大问题,但是要注意的有以下几点
attach
值的最大长度是127
WeixinJSBridge.invoke
的getBrandWCPayRequest
请求中,注意是对象!!!对象!!!对象!!! 我跟前端开发沟通的过程中前端就把参数转成字符串写到getBrandWCPayRequest
里面了,我加班好久查资料最后才发现是这里的问题在这一步会遇到以下报错:
支付缺少参数:appId
(因为整个参数组不是一个对象所以报错)chooseWXPay:fail
(不能在开发者工具上调试微信支付,在工具上会报这个错误。其实去网上查的一大堆资料都说的解决都是在说这个原因)支付回调的例子里面有重写NotifyProcess
的方法,如果你要另外写业务可以吧notify.php写成一个文件然后再写另外的回调接口来请求这个类。
我这边的话就重写了一下方法返回回调数据。
回调的坑在于你回调业务处理完了之后要在最后加上以下:
return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
否则的话微信没有收到你的回调成功返回,会不断重复回调5次然后停止,如果回调中写了业务那就会重复操作了。
这个坑就是:要注意回调结束要返回成功的xml响应