微信免签约支付的全栈开发

2018.06.21

前言

很早就想要开坑写一下微信的免签支付了,但是由于懒癌发作拖延了好久。微信免签约支付指的是利用个人收款二维码从而实现接入Web或APP的收款方式,此方式免与微信官方签约省时省力,方便用于小型网站的收款,接入后收到用户支付会自行通知网站进行业务处理。本文记录下开发过程中的各种坑。

技术栈

后端: PHP 7 / Redis / MySQL / Python
前端: React / HTML / jQuery

使用流程&用户体验

  1. 创建应用
  2. 创建指定金额二维码(关于创建二维码的方式,目前市面上的解决方案是保存下二维码进行上传。为了更好的用户体验我的解决方案即为通过微信扫码的api在移动端登陆支付平台扫描金额二维码直接进行添加)
  3. 配置微信授权
  4. 接入Web、App

运作流程

  1. 用户发起下单
  2. 服务端创建订单
  3. Python监听微信授权获取支付状态通知网关
  4. 网关更新订单状态
  5. 通知客户网站
  6. 完成

天坑

  1. 解决防止刷码的问题。刷码即假如我添加了3张个人收款二维码分别为金额:10.00、10.01、10.02,那用户1再下单的时候获取的10.00的二维码进行支付,此时要将用户1与10.00的二维码进行绑定,否则将会导致用户1刷新的时候获取10.01、10.02的二维码导致二维码全部被绑定别的用户无法进行支付,所以一个用户绑定一个金额的二维码到期时间为2分钟,此处采用后端的session id标识用户绑定二维码。
  2. 跨域问题。在获取二维码的时候我将提交我唯一的session id到服务器以保证2分钟内获取的金额二维码都是与我绑定的,所以一定要保证session被提交,客户网站与api服务是跨域请求,在我填了层层坑后发现,我的Android浏览器及Chrome已经成功提交session id但是在iOS上测试永远都是新的session id,故放弃此方法,采用客户端生成session id提交到api服务器以保证用户的唯一性,好处是请求由后端完成不会暴露api地址及其他配置信息。
  3. Python端监控问题。Python监控端的实现过程是这样子的,首先从api获取所有用户的授权信息然后向微信请求支付详情信息提交给后端,这里要用到多进程并且保证进程没有内存泄漏的问题,监控1分钟每获取到一个授权信息启动一个进程开始监听支付详情,这里没启动一个进程会存储授权信息作比对避免重复启动进程,但是如果用户将授权信息删除,Python端是不会删除进程的,这里有个坑没有填。做交叉比对太麻烦了,也许是我Python技能不精,以后还是用nodejs好了。