本来是项目上线后平静的一天,正在等待下一个需求会评审,结果我们的运营同学发来了一段录屏:"新商品购买后没反应啊!退出清后台重进也不行。"
一下子炸锅了,测试开始拉会,找复现步骤,我作为app开发的前端,很快就猜到了原因,用户在微信支付完后台返回app的时候,我们正在支付的loading一直在等待,支付成功的回调一直没有触发,商品没有购买解锁成功。
不能啊!用户钱都花出去了,怎么会没购买成功呢?后端立刻在数据库查到了订单号,商品购买成功了,但是购买成功后有一步解锁的动作,依赖前端在支付成功的回调里主动解锁。流程卡在了没有解锁成功。
这个流程设计的就很有问题,不过我一直以为前端和后端支付成功用的一个回调,虽然感觉不对劲,但是后续测试也没发现问题,就忙着开发其它功能了。仔细看代码排查后才发现,前端支付成功依赖微信sdk的回调,在支付这一步,从发起支付到支付成功都不和后端通信,后端只给了一个订单号,前端用这个订单号调微信sdk主动发起支付。
坑啊,这时候也找到了复现步骤,只要支付成功后,不点击微信支付成功页面的“返回商家”按钮,微信就不给支付成功的回调,用户钱都花出去了,前端还在回调里傻傻等待。
找到问题后立即开始讨论怎么做修复,因为我们是app上架的应用商店,也没有回滚机制,只能先从后端入手,把这个不合理的流程改掉,解锁操作放在后端支付成功后进行,并且下一次在页面请求中返回解锁后的参数。还好之前设计的解锁和未解锁用的同一个接口,不然只能发版对用户做强更了。后端做修复后用户下一次进入页面即可看见付费解锁后的参数,经过boss拍板不需要发修复版本,在下个版本前端在支付返回到页面展示时主动请求接口。
太坑了!虽然支付成功的回调确实应该和服务器做沟通,但是微信前端的sdk也不能支付成功还要点按钮才算支付成功吧。在网上查了一下,这个问题最早17年就有人提出来了,一直没有做过修复,在微信小程序的支付里同样也有这个问题,后续还要对所有的支付代码做重构,增加了好多代码量o(╥﹏╥)o