1. 程式人生 > >iOS 應用內付費(IAP)開發步驟

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的基本資訊 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客  完成之後同意一個協議並提交 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客 之後頁面中會出現Contracts In Process. 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客   2.這時,分別來設定Contact Info、Tax Info和Bank Info (1)、Contact 點選Contact Info下的“Set Up”,進入Contact Information頁面,並點選“Add New Contact”來增加新的contact 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客   填寫好裡面對應的資訊,點Save儲存就可以了 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客   然後回到Contact Information頁面,剛增加的Contact就會出現在下拉框中,將對應的Role設定對應的Contact然後點Done完成 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客   (2)、Bank 回到Contracts, Tax, and Banking主頁面,選擇Bank Info下面的”Set Up“,進入Bank Information 頁面。選擇“Add Bank Account”來增加一個銀行資訊 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客   選擇你銀行卡開戶所在哪個國家,這裡有China了,呵呵 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客     下一步設定銀行的CNAPS Code,這個號有的地方說是聯行號,可以理解為每個銀行支行的唯一ID吧,這個可以打電話問你銀行卡開戶行,就是他們那的一個唯一12位的標示號碼,也可以通過蘋果的Look up Transit Number去搜索。 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客    不過,我覺得蘋果的搜尋全英文的,都不知道國內銀行的英文名叫什麼,什麼支行的英文又是什麼。好吧,那就用下面這個網站去查詢也是可以的https://e.czbank.com/CORPORBANK/WebBank?&tranFlag=0&dse_operationName=wgQueryUnionBankSrvOp 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客  複製獲取的現代化支付系統行號,粘帖到上面蘋果頁面中的CNAPS Code項。點選下一步,蘋果會根據你寫的那個程式碼讀出對應的銀行資訊,這在你可以驗證一下你寫的銀行號是否正確。 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客    再下一步就設定你的卡號,賬戶名以及幣種(人民幣是CNY,當初還以為是RMB呢,找了半天,納悶。當然,如果你的卡支援美元什麼的也可以選擇別的幣種)  蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客 這步設定完後就是顯示你設定的所有資訊,這在你可以核對一下是否有誤,問沒題的話點“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” 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客   B. 是否美國公民、或美國公司什麼的,這個選擇“No”就可以了,不然後面要你設定稅號的,這個,真心木有。 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客   C. 有沒有美國商業活動.這個也用“No”吧,這個神馬的太遙遠了,呵呵
蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客    D. 設定Tax Infomation。設定一下基本的資訊 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客 設定好後點“Confirm”就完成了  同樣的,把World也設定一下。設定完成後會需要一個處理時間,理論值會在24小時內完成。 蘋果開發——設定iTunes Connect中的Contracts, Tax, and Banking - 過☆客 - 過☆客

第四步:在專案中申請購買產品程式碼以及監聽;

一、開發工作(ios端)

1、 在工程中引入 storekit.framework 和 #import <StoreKit/StoreKit.h>

2、 獲得所有的付費Product ID列表。這個可以用常量儲存在本地,也可以由自己的伺服器返回。

3、 製作一個介面,展示所有的應用內付費專案。這些應用內付費專案的價格和介紹資訊可以是自己的伺服器返回。但如果是不帶伺服器的單機遊戲應用或工具類應用, 則可以通過向App Store查詢獲得。我在測試時發現,向App Store查詢速度非常慢,通常需要2-3秒鐘,所以不建議這麼做,最好還是搞個自己的伺服器吧。

4、當用戶點選了一個IAP專案,我們先查詢使用者是否允許應用內付費,如果不允許則不用進行以下步驟了。程式碼如下:

  1. if ([SKPaymentQueue canMakePayments]) { 
  2.     // 執行下面提到的第5步:
  3.     [self getProductInfo]; 
  4. else { 
  5.     NSLog(@"失敗,使用者禁止應用內付費購買."); 

5、 我們先通過該IAP的ProductID向AppStore查詢,獲得SKPayment例項,然後通過SKPaymentQueue的 addPayment方法發起一個購買的操作。

  1. // 下面的ProductId應該是事先在itunesConnect中新增好的,已存在的付費專案。否則查詢會失敗。
  2. - (void)getProductInfo { 
  3.   NSSet * set = [NSSet setWithArray:@[@"ProductId"]]; 
  4.   SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set]; 
  5.   request.delegate = self; 
  6.   [request start]; 
  7. // 以上查詢的回撥函式
  8. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { 
  9.     NSArray *myProduct = response.products; 
  10.     if (myProduct.count == 0) { 
  11.         NSLog(@"無法獲取產品資訊,購買失敗。"); 
  12.         return
  13.     } 
  14.     SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]]; 
  15.     [[SKPaymentQueue defaultQueue] addPayment:payment]; 
  16. }

6、 在viewDidLoad方法中,將購買頁面設定成購買的Observer。

  1. - (void)viewDidLoad { 
  2.     [super viewDidLoad]; 
  3.     // 監聽購買結果
  4.     [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
  5. - (void)viewDidUnload { 
  6.     [super viewDidUnload]; 
  7.     [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 

7、 當用戶購買的操作有結果時,就會觸發下面的回撥函式,相應進行處理即可。

  1. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 
  2.     for (SKPaymentTransaction *transaction in transactions) 
  3.     { 
  4.         switch (transaction.transactionState) 
  5.         { 
  6.             case SKPaymentTransactionStatePurchased://交易完成
  7.                 NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier); 
  8.                 [self completeTransaction:transaction]; 
  9.                 break
  10.             case SKPaymentTransactionStateFailed://交易失敗
  11.                 [self failedTransaction:transaction]; 
  12.                 break
  13.             case SKPaymentTransactionStateRestored://已經購買過該商品
  14.                 [self restoreTransaction:transaction]; 
  15.                 break
  16.             case SKPaymentTransactionStatePurchasing:      //商品新增進列表
  17.                 NSLog(@"商品新增進列表"); 
  18.                 break
  19.             default
  20.                 break
  21.         } 
  22.     } 
  23. - (void)completeTransaction:(SKPaymentTransaction *)transaction { 
  24.     // Your application should implement these two methods.
  25.     NSString * productIdentifier = transaction.payment.productIdentifier; 
  26.     NSString * receipt = [transaction.transactionReceipt base64EncodedString]; 
  27.     if ([productIdentifier length] > 0) { 
  28.         // 向自己的伺服器驗證購買憑證
  29.     } 
  30.     // Remove the transaction from the payment queue.
  31.     [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
  32. - (void)failedTransaction:(SKPaymentTransaction *)transaction { 
  33.     if(transaction.error.code != SKErrorPaymentCancelled) { 
  34.         NSLog(@"購買失敗"); 
  35.     } else { 
  36.         NSLog(@"使用者取消交易"); 
  37.     } 
  38.     [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
  39. - (void)restoreTransaction:(SKPaymentTransaction *)transaction { 
  40.   // 對於已購商品,處理恢復購買的邏輯
  41.     [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

8、伺服器驗證憑證(Optional)。如果購買成功,我們需要將憑證傳送到伺服器上進行驗證。考慮到網路異常情況,iOS端的傳送憑證操作應該進行持久化,如果程式退出,崩潰或網路異常,可以恢復重試。

二、開發工作(服務端)

服務端的工作比較簡單,分4步:

  1. 接收ios端發過來的購買憑證。
  2. 判斷憑證是否已經存在或驗證過,然後儲存該憑證。
  3. 將該憑證傳送到蘋果的伺服器驗證,並將驗證結果返回給客戶端。
  4. 如果需要,修改使用者相應的會員許可權。

考慮到網路異常情況,伺服器的驗證應該是一個可恢復的佇列,如果網路失敗了,應該進行重試。

與蘋果的驗證介面文件在這裡。簡單來說就是將該購買憑證用Base64編碼,然後POST給蘋果的驗證伺服器,蘋果將驗證結果以JSON形式返回。