iOS 應用內付費(IAP)開發步驟
參考文章連結:
(1)http://mobile.51cto.com/iphone-389249.htm
(2)http://blog.csdn.net/xiaominghimi/article/details/6937097
(3)http://zengwu3915.blog.163.com/blog/static/2783489720137485857701/
步驟如下:
第一步:你需要在iTunesConnect中建立個新的App,然後為這個App設定一些產品(付費道具)等;
OK,這裡Himi稍微解釋下,iTunesConnect是蘋果提供的一個平臺,主要提供AP釋出和管理App的,最重要的功能是建立管理專案資訊,專案付費產品(道具)管理、付費的測試賬號、提交App等等,這裡就簡單介紹這麼多,關於產品一詞在此我們可以理解成遊戲道具即可;在蘋果看來所有付費都屬於產品 =。 =千萬不要糾結字眼哦~
成功登陸後的頁面如下:
這裡大概說下重要的一些項:
Contracts, Tax, and Banking : 管理銀行賬號、聯絡人以及稅等等;這裡要根據提示完成對應的資訊填寫!一定要詳細填寫喔~
Manage Users :管理使用者的,比如主賬號以及測試付費的(測試App)賬號;
Manage Your Applictions:管理應用程式的,你所有釋出的應用和每個應用的狀態都在這裡面;
下面我們新建一個App專案,大家放心,我們這裡建立的是不會直接提交給App稽核的,所以放心建立,只要控制好App的狀態不要是待稽核狀態即可,不過即使你不小心將專案提交了,也沒事,直接更改App狀態即可了;
選擇Manage Your Applictions選項,然後新建一個專案:【Add New App】,根據提示來填寫吧,這裡就不細緻說明了~
建立好一個App之後,在點選Manage Your Applictions後的介面應該如下:
這裡你將看到自己建立的App,點選你建立的App專案,這裡Himi建立的專案名字叫”ProjectForBuyTest“,點選你的App進入如下介面:
(注意:這裡的Bundle ID一定要跟你的專案中的info.plist中的Bundle ID保證一致!!!!)
這裡可以管理你的專案的資訊、狀態、是否嵌入GameCenter等等選項,那麼本章我們重點介紹如何使用IAp沙盒測試程式內付費,所以這裡我們點選右上角的”Manage In-App Purchases
上圖中的下方看到Himi建立過的四個產品(道具)了,你可以點選”Create New“選項新建一個產品(付費道具),點選新建如下介面:
上圖中Himi沒有截圖出所有的選項,這裡大概介紹下,這個介面是選擇你的消費道具的種類,種類說明如下:
型別選擇有四種選擇:
1.Consumable(消耗品): 每次下載都需要付費;
2.Non-consumable(非消耗品): 僅需付費一次;
3.Auto-Renewable Subscriptions:自動訂閱;
4.Free Subscription:免費訂閱
最下方是你沙盒測試的截圖,暫且不管即可;
這裡Himi選擇Consumable選項,比如很多遊戲都是購買金幣啦這樣子就可以選擇這個;然後出現如下介面:
Reference Name: 付費產品(道具的)參考名稱
Product ID(產品ID): 你產品的唯一id。通常格式是 com.xx.yy,但它可以是任何形式,不要求以程式的App ID作為字首。
Add Language: 新增產品名稱與描述語言;
Price Tier:選擇價格,這裡你選擇價格後,會出現如上圖最下方的價格對照表
Screenshot(截圖): 展示你產品的截圖。(這個直接無視,測試App務必要管這個的)
Product ID(產品ID)可以建立多個,比如我想遊戲中分為0.99$ 、1.99$等道具那就建立對應多個產品ID!
我們填寫好了”Reference Name“與”Product ID“以及”Price Tier“後,點選”Add Language“選項然後出現如下介面:
上圖中的選項:
Language:語言
Displayed Name(顯示名稱): 使用者看到的產品名稱。
Description(描述): 對產品進行描述。
Ok,一路 Save儲存回到”Manage In-App Purchases“介面中會看到我們新建的產品(道具)如下:
大家可以看到新建的產品(道具)ID:這裡Himi建立的產品ID是com.himi.wahaha ,這裡要記住這個產品ID哦~
第二步:申請測試帳號,利用沙盒測試模擬AppStore購買道具流程;
回到itunesconnect主頁中,選擇“Manage Users”然後選擇“Test User”,然後出現的介面如下圖:
這裡Himi已經建立了兩個測試賬號了,點選介面中的 “Add New User”進行建立即可;記住賬號和密碼哈,記不住就刪掉重新建 娃哈哈~(切記:不能用於真正的AppStore中使用此賬號,不僅不能用,而且一旦AppStore發現後果你懂得~)
第三步:填寫相關的稅務,銀行,聯絡人資訊;
1.這裡需要先設定一下。 點選“Request”,填寫一下Legal Entity的基本資訊 完成之後同意一個協議並提交 之後頁面中會出現Contracts In Process. 2.這時,分別來設定Contact Info、Tax Info和Bank Info (1)、Contact 點選Contact Info下的“Set Up”,進入Contact Information頁面,並點選“Add New Contact”來增加新的contact 填寫好裡面對應的資訊,點Save儲存就可以了 然後回到Contact Information頁面,剛增加的Contact就會出現在下拉框中,將對應的Role設定對應的Contact然後點Done完成 (2)、Bank 回到Contracts, Tax, and Banking主頁面,選擇Bank Info下面的”Set Up“,進入Bank Information 頁面。選擇“Add Bank Account”來增加一個銀行資訊 選擇你銀行卡開戶所在哪個國家,這裡有China了,呵呵 下一步設定銀行的CNAPS Code,這個號有的地方說是聯行號,可以理解為每個銀行支行的唯一ID吧,這個可以打電話問你銀行卡開戶行,就是他們那的一個唯一12位的標示號碼,也可以通過蘋果的Look up Transit Number去搜索。 不過,我覺得蘋果的搜尋全英文的,都不知道國內銀行的英文名叫什麼,什麼支行的英文又是什麼。好吧,那就用下面這個網站去查詢也是可以的https://e.czbank.com/CORPORBANK/WebBank?&tranFlag=0&dse_operationName=wgQueryUnionBankSrvOp 複製獲取的現代化支付系統行號,粘帖到上面蘋果頁面中的CNAPS Code項。點選下一步,蘋果會根據你寫的那個程式碼讀出對應的銀行資訊,這在你可以驗證一下你寫的銀行號是否正確。 再下一步就設定你的卡號,賬戶名以及幣種(人民幣是CNY,當初還以為是RMB呢,找了半天,納悶。當然,如果你的卡支援美元什麼的也可以選擇別的幣種) 這步設定完後就是顯示你設定的所有資訊,這在你可以核對一下是否有誤,問沒題的話點“Save”儲存,儲存後就回到前面的Choose Bank頁面,選擇剛才設定的這個銀行“Save”完成銀行設定 (3)、Tex 回到Contracts, Tax, and Banking主頁面,選擇Tex Info下面的”Set Up“,進入Tex Information 頁面。如果上面有你所在的國家就選,沒有的都選擇U.S. Tax Forms。下面就來設定一下在天朝的情況: A. 選擇第一個U.S Tax Forms,點選下面的“Set Up” B. 是否美國公民、或美國公司什麼的,這個選擇“No”就可以了,不然後面要你設定稅號的,這個,真心木有。 C. 有沒有美國商業活動.這個也用“No”吧,這個神馬的太遙遠了,呵呵
D. 設定Tax Infomation。設定一下基本的資訊 設定好後點“Confirm”就完成了 同樣的,把World也設定一下。設定完成後會需要一個處理時間,理論值會在24小時內完成。
第四步:在專案中申請購買產品程式碼以及監聽;
一、開發工作(ios端)
1、 在工程中引入 storekit.framework 和 #import <StoreKit/StoreKit.h>
2、 獲得所有的付費Product ID列表。這個可以用常量儲存在本地,也可以由自己的伺服器返回。
3、 製作一個介面,展示所有的應用內付費專案。這些應用內付費專案的價格和介紹資訊可以是自己的伺服器返回。但如果是不帶伺服器的單機遊戲應用或工具類應用, 則可以通過向App Store查詢獲得。我在測試時發現,向App Store查詢速度非常慢,通常需要2-3秒鐘,所以不建議這麼做,最好還是搞個自己的伺服器吧。
4、當用戶點選了一個IAP專案,我們先查詢使用者是否允許應用內付費,如果不允許則不用進行以下步驟了。程式碼如下:
- if ([SKPaymentQueue canMakePayments]) {
- // 執行下面提到的第5步:
- [self getProductInfo];
- } else {
- NSLog(@"失敗,使用者禁止應用內付費購買.");
- }
5、 我們先通過該IAP的ProductID向AppStore查詢,獲得SKPayment例項,然後通過SKPaymentQueue的 addPayment方法發起一個購買的操作。
- // 下面的ProductId應該是事先在itunesConnect中新增好的,已存在的付費專案。否則查詢會失敗。
- - (void)getProductInfo {
- NSSet * set = [NSSet setWithArray:@[@"ProductId"]];
- SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
- request.delegate = self;
- [request start];
- }
- // 以上查詢的回撥函式
- - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
- NSArray *myProduct = response.products;
- if (myProduct.count == 0) {
- NSLog(@"無法獲取產品資訊,購買失敗。");
- return;
- }
- SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];
- [[SKPaymentQueue defaultQueue] addPayment:payment];
- }
6、 在viewDidLoad方法中,將購買頁面設定成購買的Observer。
- - (void)viewDidLoad {
- [super viewDidLoad];
- // 監聽購買結果
- [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
- }
- - (void)viewDidUnload {
- [super viewDidUnload];
- [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
- }
7、 當用戶購買的操作有結果時,就會觸發下面的回撥函式,相應進行處理即可。
- - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
- for (SKPaymentTransaction *transaction in transactions)
- {
- switch (transaction.transactionState)
- {
- case SKPaymentTransactionStatePurchased://交易完成
- NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
- [self completeTransaction:transaction];
- break;
- case SKPaymentTransactionStateFailed://交易失敗
- [self failedTransaction:transaction];
- break;
- case SKPaymentTransactionStateRestored://已經購買過該商品
- [self restoreTransaction:transaction];
- break;
- case SKPaymentTransactionStatePurchasing: //商品新增進列表
- NSLog(@"商品新增進列表");
- break;
- default:
- break;
- }
- }
- }
- - (void)completeTransaction:(SKPaymentTransaction *)transaction {
- // Your application should implement these two methods.
- NSString * productIdentifier = transaction.payment.productIdentifier;
- NSString * receipt = [transaction.transactionReceipt base64EncodedString];
- if ([productIdentifier length] > 0) {
- // 向自己的伺服器驗證購買憑證
- }
- // Remove the transaction from the payment queue.
- [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
- }
- - (void)failedTransaction:(SKPaymentTransaction *)transaction {
- if(transaction.error.code != SKErrorPaymentCancelled) {
- NSLog(@"購買失敗");
- } else {
- NSLog(@"使用者取消交易");
- }
- [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
- }
- - (void)restoreTransaction:(SKPaymentTransaction *)transaction {
- // 對於已購商品,處理恢復購買的邏輯
- [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
- }
8、伺服器驗證憑證(Optional)。如果購買成功,我們需要將憑證傳送到伺服器上進行驗證。考慮到網路異常情況,iOS端的傳送憑證操作應該進行持久化,如果程式退出,崩潰或網路異常,可以恢復重試。
二、開發工作(服務端)
服務端的工作比較簡單,分4步:
- 接收ios端發過來的購買憑證。
- 判斷憑證是否已經存在或驗證過,然後儲存該憑證。
- 將該憑證傳送到蘋果的伺服器驗證,並將驗證結果返回給客戶端。
- 如果需要,修改使用者相應的會員許可權。
考慮到網路異常情況,伺服器的驗證應該是一個可恢復的佇列,如果網路失敗了,應該進行重試。
與蘋果的驗證介面文件在這裡。簡單來說就是將該購買憑證用Base64編碼,然後POST給蘋果的驗證伺服器,蘋果將驗證結果以JSON形式返回。