之前一直不知道這2種狀態到底有什么不同。支付寶中擔保交易和即時到賬交易對其的描述為:
- TRADE_SUCCESS 交易成功(或支付成功)
- TRADE_FINISHED 交易完成
一頭霧水。。。。。。OK,找例子來說明吧:
例子一:
- 即時到賬普通版。 普通版不支持支付完成后的退款操作,即用戶充值完成后,該交易就算是完成了,這筆交易就不能再做任何操作了。
- 即時到賬高級版。 這個版本在用戶充值完成后,賣家可以執行退款操作進行退款,即該交易還沒有徹底完成,賣家還可以修改這筆交易。
OK,開測。當用戶在支付寶網站上充值完成后,這個時候支付寶的通知消息中,如果是即時到賬普通版,那么這時的交易狀態值為: TRADE_FINISHED;如果是即時到賬高級版,此時的交易狀態值就為:TRADE_SUCCESS。
我第一次接入的時候在我網站中判斷用或來做,即如果是交易成功或者交易完成則發貨。這時就錯大了。。。。。。因為作為即時到賬高級版,在TRADE_SUCCESS完成后過了三個月,支付寶又會主動再推送一個消息為TRADE_FINISHED。所以如果我用以上的邏輯來做發貨,那么我接入即時到賬高級版的話,就會發貨2次。
這個問題是因為我沒有徹底理解清楚這2種關系造成的。
仔細琢磨了一下,發現了它們兩者最本質的差別。TRADE_SUCCESS狀態代表了充值成功,也就是說錢已經進了支付寶(擔保交易)或賣家(即時到賬);這時候,這筆交易應該還可以進行后續的操作(比如三個月后交易狀態自動變成TRADE_FINISHED),因為整筆交易還沒有關閉掉,也就是說一定還有主動通知過來。而TRADE_FINISHED代表了這筆訂單徹底完成了,不會再有任何主動通知過來了。
綜上所述,收到TRADE_FINISHED請求后,這筆訂單就結束了,支付寶不會再主動請求商戶網站了;收到TRADE_SUCCESS請求后,后續一定還有至少一條通知記錄,即TRADE_FINISHED。所以,在做通知接口時,切記使用判斷訂單狀態用或的關系。