2021-11-22 685
问题描述:
在当我们做微信支付的时候调用接口时,在支付页面,由于用户第一次去发起支付,但是用户因为取消或者余额不足导致本次没有进行支付。这时订单已经生成,订单状态是“待支付状态”等我们再去支付时候,却发现微信那边返回“201商户订单号重复”的错误。
问题原因:
第一次支付失败、取消,我们再次支付时候,前端将商品描述(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小站” 唯一官方服务平台,请勿相信其他任何渠道。
工具 2022-01-12
Java 2021-12-09
数据库 2021-12-19
分布式中间件 2022-02-18
微信生态圈 2021-11-22
随记 2021-10-12
Java 2021-10-13
Linux 2021-10-13
Linux 2021-10-12
Linux 2022-04-18
扫码二维码
获取最新动态
分享:
支付宝
微信