1.0 內購類型
a. 消耗型商品:只可以使用一次的產品,使用以后即失效蚂踊,必須再次購買仗谆。
示例:小說App購買的書幣書券。
b. 非消耗型商品:只需購買一次扒吁,不會過時或隨著使用而減小的產品火鼻。
示例:游戲 App 的賽道。
c. 自動續(xù)期訂閱:容許用戶在固定時間段內購買動態(tài)內容的產品雕崩。除非用戶選擇取消魁索,不然此類訂閱會自動續(xù)期。
示例:每個月訂閱提供流媒體服務的 App盼铁。
d. 非續(xù)期訂閱:容許用戶購買有時限性服務的產品粗蔚。此 App 內購買項目的內容能夠是靜態(tài)的。此類訂閱不會自動續(xù)期饶火。
示例:為期一年的已歸檔文章目錄訂閱鹏控。
2.0 內購的通用流程
a. 客戶端向Appstore請求購買產品(假設產品信息已經取得),Appstore驗證產品成功后肤寝,從用戶的Apple賬戶余額中扣費当辐。
b. Appstore向客戶端返回一段receipt-data,里面記錄了本次交易的證書和簽名信息鲤看。
c. 客戶端向我們可以信任的服務器提供receipt-data
d. 服務器對receipt-data進行一次base64編碼
e. 把編碼后的receipt-data發(fā)往itunes.appstore進行驗證
f. itunes.appstore返回驗證結果給服務器
g. 服務器對商品購買狀態(tài)以及商品類型缘揪,向客戶端發(fā)放相應的道具與推送數據更新通知
3.0 實際應用中的內購流程(自己產品為例)
a. 驗證蘋果自動續(xù)費的合理性: 是否是切換了賬號了,是否是同一個賬號下有2個不同的appleid訂閱(訂閱類型會進行此校驗义桂,消耗性直接走b)
b. 后臺校驗成功后找筝,創(chuàng)建后臺訂單
c. 訂單生成后,傳入productID發(fā)起購買請求慷吊,蘋果服務器驗證產品成功后袖裕,從用戶的Apple賬戶余額中扣費并向客戶端返回憑證(receipt-data)
d. 客戶端拿到憑證后,向服務器發(fā)起憑證校驗溉瓶,服務器拿到憑證進行一次base64編碼急鳄,發(fā)到蘋果服務器進行校驗并返回結果給服務器。
e. 服務器對商品購買狀態(tài)以及商品類型嚷闭,向客戶端發(fā)放相應的道具與推送數據更新通知
內購的遇到的問題
a攒岛、掉單問題
解決掉單問題前,我們要先簡單把從支付請求開始到結束的步驟按照順序排列出來胞锰,然后分析每一個步驟可能存在的調單情況灾锯。
- 發(fā)起支付請求 ---> 2. 扣費成功,得到receipt(支付憑據)---> 3. 去后臺驗證憑據獲取e豆 ---> 4. 返回數據嗅榕,前端刷新數據
調單的處理可分為在拿到交易訂單之后調用 IPA 創(chuàng)建一個 IPA 交易顺饮,并且添加到支付隊列吵聪,收到回調前跟收到回調后。
在創(chuàng)建后臺訂單時兼雄,此時后臺會把訂單信息回調吟逝,并將其已模型的形式存入Keychain中(存入Keychain中數據不會因卸載app等操作丟失)
情況1 創(chuàng)建訂單完成,并沒有發(fā)起支付請求
通過校驗隊列中的transactions進行判斷赦肋,沒有的話就是沒有發(fā)起支付請求块攒,那么此時需要重新發(fā)起支付的請求。
情況2 收到回調前(此時未拿到transactionId佃乘、憑證)
通過校驗隊列中的transactions進行判斷囱井,有的話就是已經發(fā)起支付請求但是沒有收到回調,此時需要做SKPaymentQueue.default().restoreCompletedTransactions()(恢復已經完成的 交易)
情況2 收到回調后
首先將transactionId和憑證更新到已存入的Keychain中趣避,通過校驗Keychain中的transactionId是否存在庞呕,來確定是否已經收到回調,此時需要拿著存入Keychain中的憑證等到后臺去校驗程帕。