1. 程式人生 > >iOS內購實現流程和丟單優化

iOS內購實現流程和丟單優化

客戶端流程(這裡只做個總結,網上有很多詳細的介紹,這裡就不多講):

1.itc新增商品

2.itc新增沙盒測試賬號

3.新增銀行資訊(這一步一定要有,不然呼叫支付會出現invalid productID情況)

4.啟動支付介面

5.支付成功後,會返回一個json資料串receipt,把這個receipt用Base64加密一下丟給伺服器驗單

6.驗單完成之後客戶端重新整理支付情況(例如增加金幣)


坑:

1.只遇到一個坑,就是沒有新增銀行資訊,然後支付出現invalid productID的返回


優化:

防丟單:

     iOS內購在正常CS模型中,大部分工作都是由客戶端完成,包括支付成功返回的receipt,要重點說一下這個receipt,它是客戶端支付成功後,iOS系統返回給客戶端的驗單資訊,是一份json資料流,其中最長的receipt是通過base64加密過的訂單資訊,可以通過解密檢視receipt訂單資訊的詳細情況。找ios驗單也是通過receipt來的。

     1.那麼,這麼重要的receipt放在客戶端是不安全的,很容易丟單。例如,使用者支付完成後,在客戶端還未向伺服器驗單之前斷網了,這個驗單流程就丟掉了。

     解決方法也很簡單,在本地儲存一個receipt棧,每次支付完成都把receipt入棧,驗單完成後出棧。如果檢查到不是空棧,就要取出棧頂一個receipt找伺服器驗單。由於是先進先出,即時棧內有未驗單的塊,再次呼叫支付入棧的receipt也不會紊亂。

     2.但是,有一個情況出現就不好處理了,通常,APP儲存在本地的內容都是與App共存的,如果在棧內有未完成的任務,使用者又由於某種原因解除安裝了App,儲存的棧也會丟失,這時候就完全丟單了。

      解決方案:在下單之前,先通知自己伺服器準備下單,伺服器儲存這份訂單,在丟單之後,使用者拿著iOS支付憑證和這個準備下單表做對比,若果確實是準備支付而且憑證屬實,應該為使用者恢復資料。