微信支付报商户订单号重复的解决办法

 2021-11-22    685  

问题描述:

    在当我们做微信支付的时候调用接口时,在支付页面,由于用户第一次去发起支付,但是用户因为取消或者余额不足导致本次没有进行支付。这时订单已经生成,订单状态是“待支付状态”等我们再去支付时候,却发现微信那边返回“201商户订单号重复”的错误。

    商户报错.jpg

问题原因:

    第一次支付失败、取消,我们再次支付时候,前端将商品描述(body)、数量、价格(后端获取的)等给改变了。我们再次支付时候会报商户订单号重复的,因为在微信是一个商户订单号(out_trade_no)对应一个微信支付信息,所以请求信息稍微一点不同就不行,微信会认为不同的支付,就会要求我们用不同的商户订单号(out_trade_no)。

    本人之前就犯了这个错误,因为是新做了个项目才刚开始做需求不是很多,想着省事直接用业务订单号当做商户订单号,然后就出问题了。因为我们的逻辑是这样的:前端会传业务订单号、数量字段给后端,当然价格是不传的,得后端获取。因为我们小程序付款页面会有个选择数量,也是这个数量让我发现了这个Bug。先选一个进行支付,然后再第二次选多个发现支付不了,去进行排查 发现商户订单号重复(因为图省事直接用业务订单号当做商户订单号,像这种业务订单号当商户订单号只适用于每次发的body啥都不改变的情况下。)。

解决办法:

    话说回来了,一般是有两种方法解决这个问题。

                1. 在订单表加个商户订单号(out_trade_no)每次发送支付请求替换,适用于业务不复杂的时候,极小项目。

    详解:就是之前的商户订单号(out_trade_no)不要了,每次发送支付交易存储新的商户订单号(out_trade_no),这个商户订单号一定得存储好,不然回调时就找不到商户订单号了,后续可能还需要业务逻辑处理。  

                2.新增一个支付详细表专门存支付每一次的发送(不管支付成功还是失败),适用于业务复杂的项目、需要看每次详细的时候。

    详解:说白了就是业务订单号关联支付详细表,每次支付(不管成功还是失败)都关联业务订单号,然后回调时支付成功再去改业务表的支付成功状态。这样的好处也是可追溯的,所以一般稍大型项目都是必须的这么做。

  •  标签:  

原文链接:https://www.joancn.xyz/?id=9

=========================================

https://www.joancn.xyz/ 为 “Joan小站” 唯一官方服务平台,请勿相信其他任何渠道。


分享:

支付宝

微信