Archives for : 六月2021

第172天:微信支付交易流程的坑

1

第一次遇到的坑,是客户支付时,正好进来个电话,支付成功了,但是我们这边没有收到返回信息,因为当时网断了。

解决方案:使用云函数异步接收订单结果。

2

不料又遇到一个坑,突然出现两笔一模一样的订单号。两笔都标记成功了,但其实只有一笔支付成功。

头一次出现这情况,没有复现。

解决方案:把防止二次提交优化一下,做得更加严谨,并且支付的异步回调函数获取订单改成倒序,按订单号查询最新的一条,做二次防范。

3

以为这样应该没问题了,哪曾想,又出问题了,有一笔订单没支付成功,但是被标记成功了。原因是 wx.requestPayment 这个接口的 success 只是通信成功,而不是支付成功(文档害人,注释上写支付成功)。

最终解决方案总结:

  1. 小程序端发起支付,创建一个未支付订单;
  2. 通信成功后跳转到支付结果页,这一步前端不做 status 的修改,而是让回调的云函数根据支付结果去修改订单 status;
  3. 跳转到支付结果页先检查订单 status,如果是未支付状态,则请求 CloudPay.queryOrder 接口,查询支付结果,修改订单 status。

这样就把修改订单 status 的操作统一交给后端,前端只负责展示。这个流程也符合文档里给出的最佳实践。