一、支付类型
目前微信基础支付类型有:JSAPI支付、APP支付、H5支付、Native支付、小程序支付、合单支付、付款码支付。
二、问题描述
1、比如有个项目,包含网页和APP端,都接入了微信支付,用户在微信内打开网页,并下了订单,此时的支付类型为JSAPI,但由于种种原因没有付款,取消了支付。
2、然后用户打开了APP,在订单列表中看到这笔未支付的订单,此时用户想要再次支付,支付类型变成了APP,在调起微信支付时,却弹出了“201 商户订单号重复”的错误。
三、原因
待支付的订单号(即商户订单号:out_trade_no),再次发起支付时,商品描述的字段和内容必须与上次请求时的字段和内容保持完全一致。
比如上面的情况,用户在网页中通过JSAPI方式下单,然后又到APP内发起支付,这时支付类型trade_type由JSAPI变成APP,根据同一个订单号在一个商户号下需要保持唯一的规则,即同一个订单号,通过JSAPI或H5下单后,就不能再使用该订单号调用APP支付接口。
微信支付统一下单接口,有下面这些必填参数:
根据微信支付的规则,上面这些必填参数中,已生成的订单,除随机字符串和终端IP可以变化外,其它任何参数发生改变,都会提示“201 商户订单号重复”。
另外,经过实际测试,首次下单时若携带选填参数,再次发起支付时,选填参数被去掉或值发生改变,也会提示“201 商户订单号重复”。
四、解决方案
可以在商户自己的订单系统中,生成两个订单号,一个对外展示,何时都不变,另一个用作支付,当再次发起支付时,若发现某个参数发生变化,重新生成一个订单号。
五、注意事项
1、我们把第一次生成的订单号称为旧订单号,把重新生成的订单号称为新订单号。
2、在第一次生成订单号时,把生成订单的所有参数,包括支付类型,全部保存起来,再支付时,若发现参数有变化,就重新生成一个订单号。
3、重新生成订单号后,同时需要把数据库中有关联的表,同步更新替换成新订单号。
上一篇:kdevtmpfsi挖矿病毒处理
下一篇:最后一页