要想處理丟單,就要搞清楚哪些環(huán)節(jié)會出現丟單的情況革娄。
首先來理一下支付流程:
1.調用IAP接口發(fā)起支付
2.支付成功翘地,獲取App Receipt票據,調用充值接口驗證
3.驗證通過滚粟,給用戶充值虛擬貨幣并回調給 App
在IAP支付的機制中寻仗,每次支付行為或每筆交易被認為是一個SKPaymentTransation,只有當SKPaymentTransation被finishTransaction:凡壤,這次支付(交易)行為才算是正常結束了署尤。即使這次支付途中被中斷,其實也并沒有丟失亚侠。假設支付沒有完成 App 就退出了(比如崩潰)曹体,那么當下次 App 重啟之后,只要設置了監(jiān)聽addTransactionObserver:盖奈,之前被中斷的支付就會接著進行混坞。
1.第一步,客戶端發(fā)起支付之后钢坦,蘋果那邊正在處理支付,客戶端由于某種原因被kill了啥酱,支付結果并不能返回到客戶端爹凹,但是蘋果那邊確實扣款成功。
2.第二步镶殷,客戶端拿到支付結果和支付憑證之后禾酱,向服務端發(fā)送App Receipt票據之前,客戶端被kill绘趋,也會導致扣款成功颤陶,服務端訂單狀態(tài)沒有修改。
針對第一種情況陷遮,可以在 App 一啟動就設置監(jiān)聽滓走,如果有未完成的支付,則會回調- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;這個方法帽馋,在這個方法里調用接口充值搅方。
針對第二種情況,客戶端可以在收到蘋果返回支付成功绽族,獲取支付憑證App Receipt票據之后姨涡,將訂單號辱魁,App Receipt票據緩存到本地吱肌,待發(fā)起驗證訂單請求,服務端返回正確結果之后氢橙,將該緩存結果刪除检诗,結束本次交易匈仗。每次app啟動之后底哗,就檢查是否有未刪除的訂單,如果有锚沸,就向服務端重試驗證支付結果跋选,服務端返回正確結果之后,將該緩存結果刪除哗蜈,結束本次交易前标。