在这里和大家说一下微信APP支付时出现的一个问题!
在APP调起支付的时候出现了错误码:OUT_TRADE_NO_USED:商户订单号重复!
1 xxxxxxx312 xxxxxxx
因为我之前在后台已经将微信APP支付的服务端SDK集成进项目了,然后预支付成功后将签名返回给APP端,他们也调起来了,并成功收到异步回调通知!
但过了几天后就出现这个 "商户订单号重复" 这个问题! 后来经过调试,发现立即支付的单不会有这个问题,只有待付款的订单才会出现这个问题!
待付款的单指的是: 使用微信支付,在微信支付界面,由于余额不足等原因,没有进行支付并关闭了支付页面,此时订单状态为“待付款”
但是又不是全部的待付款订单才会出现这个问题,后来再经过调试才知道,原来是项目里商家可以在后台里直接对待付款订单进行修改价格!所以,基本确定问题了,就是我们在微信的服务器生成预支付后的订单后,微信的服务器是有记录这个预支付单的,单号,单的价格,单的商品描述等信息.... 然后我们去修改这个订单的商品描述或者订单价格后, 然后对待付款订单进行付款而再次调起支付的时候,这时候,待付款的订单号(即商户订单候,号,out_trade_no)再上一次已经在微信服务器生成预支付单了,现在去改变了价格后又再次向微信服务器生成预支付单,这时微信那边是不承认同一个商户订单号不同商品描述或不同订单价格的,所以在返回签名sign后给app端才出现的报错!!
解决办法:
在服务端支付SDK内封装商户订单号out_trade_no 字段的时候,我们需要对订单号做一下处理,如图:
意思就是我们支付首先要生成订单信息的,那订单号还是按照我们之前那规则去生成(一般淘宝订单是随机数字字符串,长度为20,保持唯行), 然后我们生成订单后要做的就是去将订单信息带入微信APP支付服务端SDK内进行封装,上面图就是在封装商户订单号字段的时候将我们原本订单号后面拼接上 "_随机字符串" 这样的做法就是我们在微信服务器创建的预支付订单每次都是不一样的!!! 假如现在我去支付订单,我第一次生成预支付单号是 666_1122 然后还是这个单,我再去支付,生成预支付单号是666_1124, 这样就能避免重复提交相同的订单号了,但是,别认为这样就可以了! 记住,还有个异步通知回调请求, 因为我们在微信服务器生成的预支付单号和我们数据库的单号是不一致的, 所以我们要在回调接口内拿到商户订单号参数进行切割字符串处理,如图:
切割后就能获取我们原本的订单号了,拿到原本订单号才能根据订单号在我们数据库去查对应的订单,然后在做业务处理!!!
这样基本就成了! 然后我们可以创建一张订单支付记录信息表,在每次回调的时候把未切割的订单号给记录起来,就是微信服务器那边的预支付订单号 "666_1123" 这样做是为了以防万一支付出现故障还是某些BUG导致交易损失,出现这类情况,我们就可以拿数据库的订单支付记录信息表的数据拿到支付流水号(预支付订单号)去跟微信后台对账!(这类情况我还没遇过),只是堤防!
OK!那到此结束吧! 如果有什么问题可以在评论处留言,如果我工作忙没时间回复可以加下此QQ群:575501906 进群说找小黑就行了!