為你的應用添加內置收費 In App Purchase
自從09年10月16日蘋果發送給所有開發者的那一封信,通知了程序內購買將可用于免費應用,我認為這也宣告了pTE版的時代結束。
成千上萬的免費版的軟件或游戲,將作為限制了功能的完整版免費發售,如果用戶覺得有意購買,可以直接解鎖完整版的功能或購買附加內容。
本文講闡述如何為你現有的應用或游戲添加程序內購買(In App Purchase)功能。
閱讀前提:假設了你擁有一定的iPhone SDK開發基礎,和App Store實踐經驗。
你的程序需要***的Bundle ID, 如果已經發布的程序使用了通配符,那么就不能直接添加該功能。如果擁有了***的ID,請在program portal中添加你的app id,允許程序使用內購買(Enable In App Purchase)。
在設計好你的程序內購買的功能以后,首先需要定義元數據。來到iTunes Connect,在Manage Your In App Purchases中為你的程序添加一個程序內購買的商品。
上面***個部分是添加的內部信息。參考名稱,ID,類型,和價格。以及各種本地化信息。
這里簡單說一下類型的選擇,其他信息,以及In App Purchase支持什么類型的商品請查看Getting Started with In App Purchase。
Non-consumable 默認類型,非消耗品,具有持久性,特點是一次性購買,可用在所有設備。例如解鎖游戲的儲存關卡功能。
Consumable 消耗品,用完或使用后消失,可多次購買,不能用在所有的設備,例如游戲中的血瓶或技能書。
Subscription 訂閱,和消耗品一樣,除了可以在設備之間共享。
創建購買流程
大致可以分為十個步驟:
驗證App Store存取權限 這樣做是因為,家長控制或一些公司的配置文件阻止了此功能,使用支付隊列的查詢功能canMakePayments來確定用戶是否有權限購買,返回值 YES代表可以購買/NO代表沒有權限購買。
載入目錄 載入儲存在本地或者遠程的商品目錄。
獲得商品本地化信息 程序向App Store發起查詢請求獲得目錄中商品的本地化信息:
- myPossibleProds = [NSSet setWithObjects: @”myProd1”, @”myProd2”, @”myProd3, nil];
- myProdRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: myPossibleProds];
- myProdRequest.delegate = myProductsRequestDelegate; [myProdRequest start];
程序接收來自App Store的回應: -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response response包含可能的信息 response.products //產品信息 response.invapdProductIdentifiers //錯誤的產品標示符 錯誤的產品可能由下面的原因導致:
商品未在 iTunes Connect中錄入。
商品沒有選擇“Cleared for Sale”。
商品還沒有傳播到所有服務器。
創建商品信息 前面的步驟獲得了產品信息的數組用以呈現:
- myAvailableProductsArray = response.products;
- for (SKProduct* aProduct in myAvailableProductsArray) {
- diplayTitle = aProduct.locapzedTitle;
- displayDesc = aProduct.locapzedDescription;
- displayPrice = aProduct.price;
- }
呈現商品信息 在UI中顯示前面獲得的信息
請求支付
- myPayment = [SKPayment paymentForProductIdentifier: selectedProdID userInfo: nil];
- myPayment = [SKPayment paymentForProduct: selectedProduct userInfo: nil];
然后提交到隊列
- defaultPaymentQueue = [SKPaymentQueue defaultQueue]; [defaultPaymentQueue addTransactionObserver: myObserver]; [defaultPaymentQueue addPayment: myPayment];
- [defaultPaymentQueue addPayment: myRequest];
- - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
驗證支付的事務
- for(SKPaymentTransaction *aTransaction in transactions) {
- switch (aTransaction.transactionState )
- {
- // 商品進入購買流程
- case SKPaymentTransactionStatePurchasing: ... break;
- // 成功購買商品
- case SKPaymentTransactionStatePurchased: ... break;
- // 已經購買過該商品
- case SKPaymentTransactionStateRestored: ... break;
- // 用戶取消交易
- case: SKPaymentTransactionStateFailed ... break;
- }
Used to vapdate e-commerce transaction
Cryptographically signed chunk of data
Contains information about the purchase
Can vapdate using Web-based API
收到交易回執以后可以傳送到你的服務器處理該交易。
你的服務器可以向蘋果發送交易驗證信息。 蘋果的交易驗證地址:https://buy.itunes.apple.com/verifyReceipt 驗證數據格式:{ receipt-data : &helpp;} 蘋果的返回值如果是{ status : 0 } 那么交易是正確,如果返回任何其他值 { status : any_other_value } 交易就是不成立。 你的服務器收到蘋果的驗證成功信息以后,返回給應用程序類似于解鎖功能等消息。
解鎖內置物品火提供遠程存取地址 需要注意的地方
用戶可能隨時退出程序。
Store Kit 的交易隊列是持久化的。
交易是持久化的。
驗證存取。
移除交易。
- [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
儲存購買 需要將非消耗的購買記錄在服務器上,以供用戶更換設備或刪除程序以后重新安裝時再次解鎖功能。
提供物品恢復 前面的代碼中,已經購買過該商品的處理就是直接解鎖。 defaultPaymentQueue = [SKPaymentQueue defaultQueue]; [defaultPaymentQueue restoreCompletedTransactions];
測試沙盒環境
只供給測試用戶,并且設備上才有效,不能使用模擬器測試。
可以為每個國家的商店添加測試帳號。
不能用來測試其他的iTunes Store特性。
需要為每個測試添加***的email地址,可以考慮使用+
payam+usa@example.com—測試美國的商品
payam+uk@example.com—測試英國的商品
payam+jp@example.com—測試日本的商品
測試步驟,需要在設備的設置菜單中iTunes Store登出原有帳戶。
然后不要在設置菜單中登錄測試帳號,而是直接打開需要測試的程序進行測試。
在這之前需要在iTunes Connect的Manage Users菜單中添加In App Purchase測試用戶。
財務報表
收入和應用程序同樣的規則
你獲得總收入的70%。
支付日程,使用稅,報表等全部都一樣。
報表
一樣的報表格式。
販賣的標示符欄顯示物品的產品ID。
所有者標示符欄顯示程序的ID。