继上次的《第三方支付订单修改金额的踩坑经历》之后,我又发现了新的坑。
背景:我们的系统接入了微信App支付、微信公众号支付以及微信小程序支付(至于为什么要接这么多微信支付,此处只需脑补:这个需求很简单,怎么实现我不管,不服你就找老板。PS:在微信浏览器中进行微信支付,只能使用微信公众号支付。在微信小程序中支付,只能使用微信小程序支付。在App内进行App支付,只能使用微信App支付。)
产生的原因:有客户在某个微信渠道下了订单,未进行支付。然后又去另一个渠道支付这个订单,结果支付不了,忘记当时微信那边报什么提示了,不知道是不是“订单已存在”之类的。
排查的过程:我开始接到这个反馈的时候真的一头雾水(当时并不知道客户进行了多渠道操作),测试的时候并未发现这个问题。因为测试都是同一渠道下单支付的。怎么办?向让客服同事向客户了解了他的操作过程,结果这个人说他记不得了。没办法,只能自己和测试一起复现。最终种种迹象表明是多渠道下单的问题,并成功复现(真是一把辛酸泪)。
这里微信支付就挺让人费解的,当初接微信支付的时候,就被各种参数appId和mchId搞晕了。后来理清之后,对应关系就是多个的支付渠道对应同一个商户id,因此猜测不同渠道创建支付单,支付单的判重纬度是根据商户id走的。因此,只能自行在自己的系统中解决多渠道支付同一订单的问题。
因此我采取的方案如下:
对应金额确定的支付单,在系统中只存在一个。当用户发起支付请求时,向第三方系统下单时,在支付单号后面拼接支付渠道,保证同一支付单不同支付渠道在微信商户中对应不同的订单,这样就解决了多渠道重复下单问题。不过,需要注意的是在支付结果通知以及退款时,都需要对微信测返回的支付单号进行解析,然后对应到自己的系统的支付单上。