分享一下这两周爬微信支付的坑~希望有借鉴作用(PHP)

spinachcqb 2019-06-26

前言

其实任何接口开发只要按照给出来的接口文档和例子开发基本上不会有太大问题的,一些问题都是出在杂七杂八的小细节上,现在分享一下微信支付开发中自己遇到的小细节。
按照文档做完开发前配置,比如JS安全域名配置、网页授权域名、公众号授权目录等等...

坑一: 配置

看完微信支付的文档,了解接口的规则,微信支付的流程基本是:获取openid -> 生成统一下单参数 -> 用户支付 -> 回调 ,其实没有太复杂
在配置上面说的东西的时候也会有一些小问题

支付授权目录需要配置到接口的上一级目录,斜杠(/)结尾,必须是斜杠结尾,而且是你写的后端接口的请求路径,不管是否做了路由跳转之类的

坑二: 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那这部分就不存在问题了

第一个坑的结果:如果前端是异步请求数据的话,openid不能和统一下单写在一起~openid需要做一次重定向来获取。

坑二: 生成统一订单

生成统一订单参数要严格对照 参数文档的参数写,example文件夹的例子中有写好的组装参数方法,可以直接调用没有太大问题,但是要注意的有以下几点

  • 严格 大小写
  • 参数必须是 字符串
  • 附加参数attach值的最大长度是127
  • 前端接收到参数后,必须组成对象写到WeixinJSBridge.invokegetBrandWCPayRequest请求中,注意是对象!!!对象!!!对象!!! 我跟前端开发沟通的过程中前端就把参数转成字符串写到getBrandWCPayRequest里面了,我加班好久查资料最后才发现是这里的问题

在这一步会遇到以下报错:

  • 支付缺少参数:appId (因为整个参数组不是一个对象所以报错)
  • chooseWXPay:fail (不能在开发者工具上调试微信支付,在工具上会报这个错误。其实去网上查的一大堆资料都说的解决都是在说这个原因)
这个坑的问题就在于:各种参数要对照文档写好而且格式正确。

坑三:支付成功回调

支付回调的例子里面有重写NotifyProcess的方法,如果你要另外写业务可以吧notify.php写成一个文件然后再写另外的回调接口来请求这个类。
我这边的话就重写了一下方法返回回调数据。
回调的坑在于你回调业务处理完了之后要在最后加上以下:

  • return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';

否则的话微信没有收到你的回调成功返回,会不断重复回调5次然后停止,如果回调中写了业务那就会重复操作了。

这个坑就是:要注意回调结束要返回成功的xml响应

END

这几天做微信支付暂时遇到的问题就这么多,只能说注意细节吧,爬过的坑记录下来以后遇到就懂处理了。
哦,还有微信支付的相关问题网上能搜到很多...但是不一定跟自己遇到的能匹配上,而且大部分都是很久的了....
这个略坑

相关推荐