1. 程式人生 > >解決微信支付出現OUT_TRADE_NO_USED:商戶訂單號重復

解決微信支付出現OUT_TRADE_NO_USED:商戶訂單號重復

image 現在 對待 行修改 沒有 col 業務 界面 描述

在這裏和大家說一下微信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 進群說找小黑就行了!

技術分享圖片

解決微信支付出現OUT_TRADE_NO_USED:商戶訂單號重復