蘋果內購IAP防掉單處理

莊稼漢寫程式碼發表於2018-01-18

因為使用者網路情況、蘋果伺服器穩定情況、以及其他不確定因素,內購不可避免的總是出現掉單情況,這是非常影響使用者體驗的,所以防掉單機制是非常有必要的。

內購的基本流程

1.客戶端下單,下單成功後獲取的訂單號

2.獲取到訂單號後,開始內購

  • 監聽購買流程
  • 根據productID獲取到具體product物件
  • 構建購買物件SKMutablePayment(SKMutablePayment區別與SKPayment可以設定applicationUsername,通過該欄位儲存訂單號,用來處理掉單時候關聯訂單業務)
  • 開始購買
  • 處理購買的回撥結果,然後結束購買事務[[SKPaymentQueue defaultQueue] finishTransaction: transaction]

3.如果購買成功可以拿到一個購買憑證

4.將購買憑證傳送給伺服器,伺服器跟蘋果伺服器通訊以驗證憑證的有效性

5.伺服器將驗證結果返回給客戶端,客戶端根據驗證結果處理業務

以上為內購基本流程

掉單的場景

1.使用者付款中或者付款後,客戶端因為某種原因程式結束

2.APP客戶端和自己伺服器通訊失敗

3.自己的伺服器和蘋果的伺服器通訊失敗

客戶端工作

客戶端需要在APP啟動時候,新增[[SKPaymentQueue defaultQueue] addTransactionObserver:manager]監聽操作,當還有未完成購買事務(未完成是購買事務並不會因為客戶端的解除安裝重灌丟失),將會啟動- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions代理方法,我們遍歷處理transactions

伺服器工作

伺服器在和蘋果伺服器通訊中,如果失敗應該設定重啟驗證的措施。同時伺服器應該在驗證購買憑證之前,先通過訂單號,判斷該訂單是否已經生效,如果沒有生效再執行驗證操作,驗證通過後寫入資料庫使訂單生效,防止一個訂單被重複的驗證生效。

三方驗證

做好以上措施,可以很大程度降低掉單的發生率,但是完全避免還是無法做到,所以我們有時候還是需要通過運營幫忙,拿到使用者的購買憑證資訊、蘋果開發者平臺中該APP的內購收入資訊,以及我們自己伺服器的訂單資訊,三方核對。

如果有認識不全面或者錯誤的地方,歡迎大家評論指出

程式碼後續會給出...

相關文章