? ? ? ?最近幾個星期,應產品需求開發了應用內支付流程,即IAP。提筆寫下大致過程,分享與大家交流。我這里是從development開發者中心創建證書和配置文件,在iTunes后天創建應用,創建虛擬商品,接入OC代碼這樣一套邏輯來寫的,如果新手不太明白具體內容,建議先看看蘋果官方文檔的中文翻譯版本,了解一二!!!
1,配置Developer.apple.com
(1)登錄到Developer.apple.com,創建證書,即開發者開發證書
(2)為應用建立建立一個不帶通配符的App ID
(3)用該App ID生成和安裝相應的Provisioning Profile文件
(4)添加真機測試的手機
2,配置iTunes Connect
(1)登錄到iTunes Connet,用該App ID創建一個新的應用,大致信息填寫
(2)在功能模塊,創建虛擬物品
這里的產品ID,最好寫的有意義,在后面代碼接入購買的時候用到
(3)設置稅務和銀行卡信息
我這邊是經理事先填好的,需要的話,請看這里http://openfibers.github.io/blog/2015/02/28/in-app-purchase-walk-through/
(4)創建應用的沙盒測試賬號
點擊用戶與職能
點擊+號,根據具體信息填寫
3,接入代碼
(1)設置bundleID,填加證書和配置文件,保證能在手機上跑起來
(2)普及一個,我這邊學到的知識
IAP的支付流程分為兩種,一種是有服務器參與的,一種是沒有服務器參與的。有服務器參與就是說,在購買之前,需要把產品的相關信息發送到服務器,服務器驗證購買憑證,如果成功,我們能拿到訂單字符串,發起支付購買,完成之后,蘋果服務器返回結果,我們拿到結果在跟服務器驗證,驗證成功后,可以由服務器發放具體的商品;沒有服務器參與的話,就是跳過了驗證過程,是由客戶端自己處理邏輯。具體在看代碼吧。
官方的兩張圖,有服務器和無服務器
(3)需要在工程中引入 Storekit.framework框架
? ? ? ? ? 支付控制器中 #import <StoreKit/StoreKit.h>
? ? ? ? ? 遵守兩個代理協議 SKProductsRequestDelegate 和 SKPaymentTransactionObserver, 前者是獲取產品信息的回調,后者是購買的觀察者。
(4)創建一個獲取產品信息的請求
NSSet * set = [NSSet setWithArray:@[prodectId]]; // 這個就是產品ID,在iTunes后臺創建
SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers: set];
request.delegate = self; // 遵守SKProductsRequestDelegate代理
[request start];
查詢產品信息的回調函數
- ?(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
? ? ? ? ? ? NSArray *myProduct = response.products; ? ?// 獲取到的商品數組
? ? ? ? ? ? if (myProduct.count == 0) {
? ? ? ? ? ? ? ? ? ? // 沒有獲取到
? ? ? ? ? ?{
// 代碼到此,就是有商品了。這時就有兩種操作,一種是向服務器驗證購買憑證,獲取訂單字符串,發起購買;一種是直接拿商品ID發起購買。
? ? ? ? ? ? SKMutablePayment *mPayment = [[SKMutablePayment alloc] init];
? ? ? ? ? ? mPayment.productIdentifier = productID; // 產品ID
? ? ? ? ? ? [[SKPaymentQueue defaultQueue] addPayment:mPayment]; ?// 調起支付界面,發起購買
}
(5)把控制器設置為監聽購買操作的觀察者,這一步,在ViewDidLoad中設置
? ?[[SKPaymentQueue defaultQueue] ?addTransactionObserver: self];
購買結果的回調
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray*)transactions {
? ? ? ? ? ?for (SKPaymentTransaction *transaction in transactions) {
? ? ? ? ? ? ? ? ? ? ? ? ? switch (transaction.transactionState) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case SKPaymentTransactionStatePurchasing:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"商品加入列表,正在購買中...");?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case SKPaymentTransactionStatePurchased:? ? // 購買完成
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"購買完成");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [self finishedTransaction:transaction];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case SKPaymentTransactionStateFailed:? ? ? // 交易失敗
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[self failedTransaction:transaction];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?case SKPaymentTransactionStateRestored: //已經購買過該商品
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"已經購買過該商品");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [self alreadyBuyWithTransaction:transaction];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?default:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ?}
}
注: 完成購買的操作中,如果有服務器,需要向服務器驗證購買結果,如果沒有,就直接完成。
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
調起支付后,輸入注冊的沙盒賬號即可點擊購買。
注:這里有幾個注意事項
一,測試支付的ipa必須使用[App-Store]證書
二,越獄機器無法測試IAP
三,用SandBox賬號測試支付的時候,必須把在系統[設置]里面把[Itunes Store 與 App Store]登錄的非 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SandBox賬號注銷掉,否則向蘋果服務器請求不到訂單信息
四,Sandbox賬號不要在正式支付環境登陸支付,登陸過的正式支付環境的SandBox賬號會失效
五,所有在itunes上配置的商品都必須可購買,不能有某些商品根據商戶自己的服務器的數據在某個時期出現免費的情況
六,商品列表不能按照某些特定條件進行排序(比如說下載量)
七,非消耗型商品必須的有恢復商品功能
八,非消耗類型的商品不要和商戶自己的服務器關聯