自動更新的訂閱服務(wù)
In-App Purchase提供了自動更新型訂閱服務(wù)的標(biāo)準(zhǔn)方式渐扮。自動更新型訂閱有如下新的顯著特征:
1. 當(dāng)你在iTunes Connect中配置自動更新型訂閱服務(wù)時惹恃,需要同時指定更新周期和其他的促銷選項陵刹。
2. 自動更新型訂閱服務(wù)會被自動恢復(fù)(使用Store Kit中恢復(fù)非消費型商品一樣的函數(shù))。原始的交易信息會和更新的交易信息一起發(fā)送給你的程序鲫剿。詳情請查看“Restoring Transactions”一節(jié)。
3. 當(dāng)你的服務(wù)器向App Store驗證收據(jù)(receipt),訂閱服務(wù)被激活并更新時护盈,App store會向你的app返回更新后的收據(jù)信息。
3.為你的商店添加自動更新型訂閱服務(wù)
按以下步驟來實現(xiàn)自動更新型訂閱服務(wù):
1. 連接iTunes Connect網(wǎng)站羞酗,并創(chuàng)建一個共享密鑰腐宋。共享密鑰是一個密碼,你的服務(wù)器在驗證自動更新型訂閱服務(wù)的時候必須提供這個密碼檀轨。共享密鑰為App Store的交易增加了一層保護胸竞。(詳情,請參考iTunes Connect Developer Guide文檔)
2. 在iTunes Connect中創(chuàng)建并配置新的自動更新型訂閱服務(wù)商品参萄。
3. 修改服務(wù)器端關(guān)于驗證收據(jù)部分的代碼卫枝,添加共享密鑰到驗證信息用的JSON數(shù)據(jù)中。服務(wù)器的驗證代碼需要可以解析App store的返回數(shù)據(jù)以判斷訂閱是否過期讹挎。如果訂閱服務(wù)已經(jīng)被用戶更新剃盾,最新的收據(jù)也會返回給你的server。
設(shè)計iOS客戶端
大多數(shù)情況下淤袜,iOS客戶端程序應(yīng)做出最小新改來支持自動更新型訂閱服務(wù)痒谴。事實上,客戶端程序需要做的更簡單铡羡,你可以使用非消費型(non-consumable)商品的流程來做自動更新型訂閱服務(wù)的事情积蔚。你的程序在不同時期會收到單獨的交易信息來告知訂閱已被更新。程序應(yīng)該單獨驗證每一條收據(jù)烦周。
驗證自動更新型訂閱服務(wù)的收據(jù)
驗證自動更形型訂閱服務(wù)的收據(jù)和之前講到的“驗證收據(jù)”的方式一致尽爆。你的程序創(chuàng)建一個JSON對象并把它發(fā)送給App Store怎顾。自動更新型訂閱服務(wù)的JSON對象必須包含另外的參數(shù)——就是你在iTunes Connect中創(chuàng)建的共享密鑰。
{
“receipt-data” : “(actual receipt bytes here)”
“password” : “(shared secret bytes here)”
}
返回內(nèi)容包含了狀態(tài)信息漱贱,用來標(biāo)識收據(jù)是否驗證有效槐雾。
{
“status” : 0,
“receipt” : { … }
“l(fā)atest_receipt” : “(base-64 encoded receipt)”
“l(fā)atest_receipt_info” : { … }
}
如果用戶的收據(jù)是有效的,訂閱被激活幅狮,則status的值為0募强。receipt對應(yīng)的值為解碼后的收據(jù)信息。如果你的服務(wù)器收到了非零值的狀態(tài)碼崇摄,對照表7-1查看:
表7-1 自動更新型訂閱服務(wù)返回狀態(tài)碼
狀態(tài)碼 描述
21000 App Store無法讀取你提供的JSON數(shù)據(jù)
21002 收據(jù)數(shù)據(jù)不符合格式
21003 收據(jù)無法被驗證
21004 你提供的共享密鑰和賬戶的共享密鑰不一致
21005 收據(jù)服務(wù)器當(dāng)前不可用
21006 收據(jù)是有效的擎值,但訂閱服務(wù)已經(jīng)過期。當(dāng)收到這個信息時逐抑,解碼后的收據(jù)信息也包含在返回內(nèi)容中
21007 收據(jù)信息是測試用(sandbox)鸠儿,但卻被發(fā)送到產(chǎn)品環(huán)境中驗證
21008 收據(jù)信息是產(chǎn)品環(huán)境中使用,但卻被發(fā)送到測試環(huán)境中驗證
注意:在這里的非零狀態(tài)碼只是針對自動更新型訂閱服務(wù)厕氨,不能將這些狀態(tài)碼用在測試其他類型產(chǎn)品的返回值中进每。
JSON數(shù)據(jù)中的receipt欄位包含了解析過的收據(jù)信息。自動更新型訂閱服務(wù)包含了一些新加的信息命斧。請參考表7-2:
表7-2 自動更新型訂閱服務(wù)的信息:
鍵名 描述
expires_date 訂閱的過期時間田晚,顯示方式是從Jan 1, 1970, 00:00:00 GMT計算到過期時間的毫秒數(shù)。這個鍵不包含在恢復(fù)的交易信息中冯丙。
original_transaction_id 初次購買的交易標(biāo)識肉瓦。所有訂閱的更新和恢復(fù)交易都共享這個標(biāo)識
original_purchase_date 初次購買(訂閱)的日期。
purchase_date 交易的日期胃惜。對于更新訂閱的交易來說泞莉,這個日期表示更新日期。如果從App Store解析的數(shù)據(jù)是最新的訂閱收據(jù)船殉,這個值表示最近更新訂閱的日期鲫趁。
除了receipt-Data信息外,返回內(nèi)容還可能包含另外兩個信息利虫。如果用戶的訂閱服務(wù)被激活并更新挨厚。則latest_receipt信息會被以base-64方式編碼并包含在返回內(nèi)容中。解碼后的新的收據(jù)信息也會在latest_expired_receipt_info包含糠惫。你的服務(wù)器可以使用新的收據(jù)來維護最新更新訂閱的信息疫剃。
4.?如果交易是恢復(fù)過來的(restore),我們用這個方法來處理:
– (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
[self recordTransaction: transaction];
[self provideContent: transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
這個過程完成購買的過程類似硼讽。 恢復(fù)的購買內(nèi)容提供一個新的交易信息巢价,這個信息包含了新的transaction的標(biāo)識和receipt數(shù)據(jù)。 如果需要的話,你可以把這些信息單獨保存下來壤躲,供追溯審(我們的)查之用城菊。但更多的情況下,在交易完成時碉克,你可能需要覆蓋原始的transaction數(shù)據(jù)凌唬,并使用其中的商品標(biāo)識。
參看網(wǎng)址:http://www.cnblogs.com/spiderdzl/p/4768824.html