微信支付报错 ” 201 商户订单号重复 “ 原因及解决方法

在开发微信支付时遇到了如下现象:

下单后发起支付统一下单,可以成功;然后取消支付,在订单中再次添加商品,支付金额发生了变动,再次发起支付报错“201 商户订单号重复”;而支付金额不变的订单再次发起支付可以成功。

导致这个问题出现的原因:

微信要求同一个订单重复支付需要所有参数一致才行。

在同一个订单多次请求微信统一下单接口时,如果订单号相同,但其它参数中存在不相同的情况!比如trade_type、 total_fee、attach、product_id等等参数,就会报错:201 商户订单号重复

例如:

用户向微信端创建了订单,但未支付, 业务需要传入了attach参数, attach未作持久化而是动态传入的, 刷新当前支付页面,那么就报"重复单号了";

用户向微信端创建了订单,因某些业务修改了金额,再次使用相同订单号请求下单接口,显然total_fee给修改了;

用户在微信浏览器创建了订单,但未支付,这时你的接口请求参数应该是 trade_typoe是jsapi 。用户又因某些原因到 PC端打开了该未支付订单,进行支付, 这样你系统调起传入的tarde_type应该是native扫码支付, trade_type 值给修改了, 同时 native扫码支付又会传入 product_id ,那么就存在两个参数不一样了;

解决方法

1、参数发生变动后,同时修改订单号

2、在统一下单接口中的订单号中拼接变动的参数,如 trade_type_{order_number}, 在数据库中还是记录 order_number, 在支付回调中将订单号拆分出来即可