1
第一次遇到的坑,是客户支付时,正好进来个电话,支付成功了,但是我们这边没有收到返回信息,因为当时网断了。
解决方案:使用云函数异步接收订单结果。
2
不料又遇到一个坑,突然出现两笔一模一样的订单号。两笔都标记成功了,但其实只有一笔支付成功。
头一次出现这情况,没有复现。
解决方案:把防止二次提交优化一下,做得更加严谨,并且支付的异步回调函数获取订单改成倒序,按订单号查询最新的一条,做二次防范。
3
以为这样应该没问题了,哪曾想,又出问题了,有一笔订单没支付成功,但是被标记成功了。原因是 wx.requestPayment 这个接口的 success 只是通信成功,而不是支付成功(文档害人,注释上写支付成功)。
最终解决方案总结:
- 小程序端发起支付,创建一个未支付订单;
- 通信成功后跳转到支付结果页,这一步前端不做 status 的修改,而是让回调的云函数根据支付结果去修改订单 status;
- 跳转到支付结果页先检查订单 status,如果是未支付状态,则请求 CloudPay.queryOrder 接口,查询支付结果,修改订单 status。
这样就把修改订单 status 的操作统一交给后端,前端只负责展示。这个流程也符合文档里给出的最佳实践。
发表评论