一.使用輪子SwiftyStoreKit ?SwiftStoreKit
二.方法
在程序入口didFinishLaunchingWithOptions? //程序啟動時在AppDelegate添加觀察者葛家,監(jiān)測購買結(jié)果狀態(tài)火欧,并根據(jù)需求作出相應處理怖现。
1.監(jiān)聽自動續(xù)費訂單
因為自動訂閱類型,除了第一次購買行為是用戶主動觸發(fā)的流译。后續(xù)續(xù)費都是Apple自動完成的,一般在要過期的前24小時開始,蘋果會嘗試扣費蹲蒲,扣費成功的話會在APP下次啟動的時候主動推送給APP涩哟。所以索赏,APP啟動的時候一定要添加上面的那句話。
用到SwiftyStoreKit.completeTransactions
這里的監(jiān)聽只是在重新進入app調(diào)用贴彼,將蘋果放在隊列里的訂單監(jiān)聽到潜腻,然后你可以在回調(diào)里做相應的處理
2.訂單支付?SwiftyStoreKit.purchaseProduct
這里面要傳一個?productId (產(chǎn)品ID ) 這個id是你在app創(chuàng)建內(nèi)購時填寫的產(chǎn)品id,即你要支付那個訂單锻弓,就直接填寫對應的產(chǎn)品id就行
3.需要注意的問題砾赔,
(1)漏單怎么處理,我們的處理方式時添加一個恢復權(quán)益的按鈕青灼,點擊時暴心,將收據(jù)Receipt傳給后臺,后臺去appstore請求所有的訂單杂拨,然后將訂單信息同步到我們的數(shù)據(jù)庫专普,并且同步會員信息
(2)AppleID 怎么跟用戶關(guān)聯(lián) 后臺獲取到的訂單信息json里 latest_receipt_info字典里有一個?original_transaction_id 這個id是跟appleID關(guān)聯(lián)的,so弹沽,你可以用original_transaction_id跟用戶關(guān)聯(lián)
(3)服務器驗證收據(jù)?http://www.reibang.com/p/aba2edbb7871
(4)恢復以前的購買
使用restorepurchase方法恢復已完成的事務檀夹。當成功時筋粗,該方法返回所有非消耗品購買,以及所有自動更新的訂閱購買炸渡,而不管它們是否已過期娜亿。
(5)獲取收據(jù)(已加密)
?SwiftyStoreKit.fetchReceipt(forceRefresh:true, completion: <#T##(FetchReceiptResult) -> Void#>)
如果為forceRefresh = false,則從文件返回本地收據(jù)蚌堵,如果丟失买决,則刷新它。
如果為forceRefresh = true吼畏,則始終刷新收據(jù)督赤。
(6)收據(jù)驗證的環(huán)境
在sandbox中驗證receipt:https://sandbox.itunes.apple.com/verifyReceipt
在生產(chǎn)環(huán)境中驗證receipt:https://buy.itunes.apple.com/verifyReceipt
(7)識別沙盒環(huán)境下收據(jù)的方法有兩種:
1.根據(jù)收據(jù)字段 environment = sandbox。
2.根據(jù)收據(jù)驗證接口返回的狀態(tài)碼泻蚊。如果status=21007躲舌,則表示當前的收據(jù)為沙盒環(huán)境下收據(jù)
蘋果反饋的狀態(tài)碼:
21000 App Store無法讀取你提供的JSON數(shù)據(jù)
21002 收據(jù)數(shù)據(jù)不符合格式
21003 收據(jù)無法被驗證
21004 你提供的共享密鑰和賬戶的共享密鑰不一致
21005 收據(jù)服務器當前不可用
21006 收據(jù)是有效的,但訂閱服務已經(jīng)過期性雄。當收到這個信息時没卸,解碼后的收據(jù)信息也包含在返回內(nèi)容中
21007 收據(jù)信息是測試用(sandbox),但卻被發(fā)送到產(chǎn)品環(huán)境中驗證
21008 收據(jù)信息是產(chǎn)品環(huán)境中使用毅贮,但卻被發(fā)送到測試環(huán)境中驗證