1. IOS 內購掉單問題
向伺服器請求OrderID,向ios發起內購時傳遞給payment:
在付款成功時applicationUsername會被ios返回,取出orderid連同收據傳給伺服器。
問題就出在那個orderid上,不知道為什麼總有用戶的orderID為null,導致充值失敗。
多方查找後確定原因如下:
目前暫無替代方案。
另:App處於審核狀態時,該測試版本無法進行內購操作是正常的,不必驚慌。
2. swift 內購
a. 消耗型商品:只可以使用一次的產品,使用以後即失效,必須再次購買。
示例:小說App購買的書幣書券。
b. 非消耗型商品:只需購買一次,不會過時或隨著使用而減小的產品。
示例:游戲 App 的賽道。
c. 自動續期訂閱:容許用戶在固定時間段內購買動態內容的產品。除非用戶選擇取消,不然此類訂閱會自動續期。
示例:每個月訂閱提供流媒體服務的 App。
d. 非續期訂閱:容許用戶購買有時限性服務的產品。此 App 內購買項目的內容能夠是靜態的。此類訂閱不會自動續期。
示例:為期一年的已歸檔文章目錄訂閱。
a. 客戶端向Appstore請求購買產品(假設產品信息已經取得),Appstore驗證產品成功後,從用戶的Apple賬戶余額中扣費。
b. Appstore向客戶端返回一段receipt-data,裡面記錄了本次交易的證書和簽名信息。
c. 客戶端向我們可以信任的伺服器提供receipt-data
d. 伺服器對receipt-data進行一次base64編碼
e. 把編碼後的receipt-data發往itunes.appstore進行驗證
f. itunes.appstore返回驗證結果給伺服器
g. 伺服器對商品購買狀態以及商品類型,向客戶端發放相應的道具與推送數據更新通知
a. 驗證蘋果自動續費的合理性: 是否是切換了賬號了,是否是同一個賬號下有2個不同的appleid訂閱(訂閱類型會進行此校驗,消耗性直接走b)
b. 後台校驗成功後,創建後台訂單
c. 訂單生成後,傳入proctID發起購買請求,蘋果伺服器驗證產品成功後,從用戶的Apple賬戶余額中扣費並向客戶端返回憑證(receipt-data)
d. 客戶端拿到憑證後,向伺服器發起憑證校驗,伺服器拿到憑證進行一次base64編碼,發到蘋果伺服器進行校驗並返回結果給伺服器。
e. 伺服器對商品購買狀態以及商品類型,向客戶端發放相應的道具與推送數據更新通知
解決掉單問題前,我們要先簡單把從支付請求開始到結束的步驟按照順序排列出來,然後分析每一個步驟可能存在的調單情況。
調單的處理可分為在拿到交易訂單之後調用 IPA 創建一個 IPA 交易,並且添加到支付隊列,收到回調前跟收到回調後。
在創建後台訂單時,此時後台會把訂單信息回調,並將其已模型的形式存入Keychain中(存入Keychain中數據不會因卸載app等操作丟失)
通過校驗隊列中的transactions進行判斷,沒有的話就是沒有發起支付請求,那麼此時需要重新發起支付的請求。
通過校驗隊列中的transactions進行判斷,有的話就是已經發起支付請求但是沒有收到回調,此時需要做SKPaymentQueue.default().restoreCompletedTransactions()(恢復已經完成的 交易)
首先將transactionId和憑證更新到已存入的Keychain中,通過校驗Keychain中的transactionId是否存在,來確定是否已經收到回調,此時需要拿著存入Keychain中的憑證等到後台去校驗。