標籤:
FROM : http://blog.csdn.net/xiaoxiangzhu660810/article/details/17434907
參考文章連結:
(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等等,這裡就簡單介紹這麼多,關於產品一詞在此我們可以理解成遊戲道具即可;在蘋果看來所有付費都屬於產品 =。 =千萬不要糾結字眼哦~
OK,開啟iTunesConnect網站:https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa (注意:企業級的使用者必須使用公司主開發人員帳號登陸才可!)
成功登陸後的頁面如下:
這裡大概說下重要的一些項:
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形式返回。
蘋果AppStore線上的購買憑證驗證地址是https://buy.itunes.apple.com/verifyReceipt ,測試的驗證地址是:https://sandbox.itunes.apple.com/verifyReceipt
[轉]iOS 應用內付費(IAP)開發步驟