iOS應用內支付(IAP)的開發經驗交流

? ? ? ?最近幾個星期,應產品需求開發了應用內支付流程,即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上配置的商品都必須可購買,不能有某些商品根據商戶自己的服務器的數據在某個時期出現免費的情況

六,商品列表不能按照某些特定條件進行排序(比如說下載量)

七,非消耗型商品必須的有恢復商品功能

八,非消耗類型的商品不要和商戶自己的服務器關聯

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • iOS應用內付費(IAP)開發步驟 1.蘋果iTunes Connect內購產品信息錄入。 1)創建app內購買項...
    MillerWang閱讀 11,116評論 0 7
  • 在我們應用開發中我們經常在自己的項目中使用到支付,下面我們來談談iOS這塊的支付;iOS支付主要分為兩類,第三方支...
    Hither閱讀 8,320評論 9 42
  • iOS支付 iOS支付分為兩類,第三方支付和應用內支付(內購)。 第三方支付包括:支付寶支付、微信支付、銀聯支付、...
    sillen閱讀 1,404評論 0 1
  • iOS支付 iOS支付分為兩類,第三方支付和應用內支付(內購)。 第三方支付包括:支付寶支付、微信支付、銀聯支付、...
    帥不過oneS閱讀 2,912評論 2 8
  • 腦子清醒得像上了發條 好像是25年來第一次 認認真真得剖析自己對感情的態度 我遇見你 一個暫時還未讓我心動的人 ...
    0803號島嶼閱讀 280評論 1 0