IAP開發(fā)指南

IAP流程

介紹

這里介紹的IAP使用服務(wù)器模式:

  1. 調(diào)用服務(wù)器接口創(chuàng)建一個(gè)商品的訂單
  2. 請求Apple的商品列表
  3. 選取商品調(diào)用蘋果支付
  4. 支付成功(會返回憑證)
  5. 把支付成功的返回憑證上傳到APP服務(wù)器(帶上訂單的ID,有利于后臺判斷是哪個(gè)訂單支付成功)
  6. APP服務(wù)器保存該憑證等數(shù)據(jù)并像蘋果服務(wù)器發(fā)起憑證驗(yàn)證柬批,驗(yàn)證成功則發(fā)送商品

配置

iTunesConnect上創(chuàng)建內(nèi)購項(xiàng)目啸澡。


開發(fā)流程

客戶端流程

1.初始化,添加一個(gè)交易隊(duì)列觀察者

    [[SKPaymentQueue defaultQueue] addTransactionObserver:xxxx];

IAP支付的機(jī)制,每次支付行為或每筆交易被認(rèn)為是一個(gè)SKPaymentTransation,只有當(dāng)SKPaymentTransation被finishTransaction:,這次支付(交易)行為才算是正常結(jié)束了氮帐。即使這次支付途中被中斷,其實(shí)也并沒有丟失嗅虏。假設(shè)支付沒有完成 App 就退出了(比如崩潰),那么當(dāng)下次 App 重啟之后,只要設(shè)置了監(jiān)聽addTransactionObserver:,之前被中斷的支付就會接著進(jìn)行。

2.去蘋果服務(wù)器請求產(chǎn)品信息

    NSSet* set = [NSSet setWithObjects:productId, nil];
    SKProductsRequest* skr = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
    self.skProductsRequest = skr;
    self.skProductsRequest.delegate = self;
    [self.skProductsRequest start];

3.請求回調(diào)

請求到IAP產(chǎn)品信息上沐,發(fā)起購買

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    if (response.products.count == self.arrayFromatProducts.count) {
        [self parseFromattingPriceData:response.products];
    }else{
        SKPayment* p = [SKPayment paymentWithProduct:[response.products objectAtIndex:0]];
        [[SKPaymentQueue defaultQueue] addPayment:p];
    }
}


請求失斊し:

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
    if (self.requestProductFailure) {
        self.requestProductFailure(error);
    }
}

購買結(jié)果:

#pragma mark SKPaymentTransactionObserver
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
    
    for (SKPaymentTransaction *transaction in transactions){
        
        switch (transaction.transactionState){
            case SKPaymentTransactionStatePurchased:{
                NSLog(@"transaction.payment.productIdentifier:%@",transaction.payment.productIdentifier);
                [self verifyPuschase:transaction];
                break;
            }
            case SKPaymentTransactionStateRestored:{//已經(jīng)購買過該商品
                [self verifyPuschase:transaction];
                break;
            }
            case SKPaymentTransactionStateFailed:{
                [[SKPaymentQueue defaultQueue]finishTransaction:tran];
                if(transaction.error.code != SKErrorPaymentCancelled) {
                    NSLog(@"購買失敗");
                } else {
                    NSLog(@"用戶取消交易");
                }                
                break;
            }
            default:
                break;
        }
    }
}

購買結(jié)果發(fā)送到服務(wù)端。服務(wù)端再到蘋果服務(wù)器驗(yàn)證憑證

收到

- (void)verifyPurchase:(SKPaymentTransaction *)transaction {
        //先發(fā)服務(wù)端驗(yàn)證
        
        //收到服務(wù)端驗(yàn)證成功后参咙,完成蘋果訂單龄广。
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

}

退出時(shí)移除觀察者

- (void)dealloc {
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
服務(wù)端流程

服務(wù)端收到購買成功,發(fā)送到蘋果服務(wù)器驗(yàn)證蕴侧。

//沙盒測試環(huán)境驗(yàn)證
#define SANDBOX @"https://sandbox.itunes.apple.com/verifyReceipt"
//正式環(huán)境驗(yàn)證
#define AppStore @"https://buy.itunes.apple.com/verifyReceipt"

沙盒測試

  1. 在用戶與職能中添加沙箱測試賬號择同。


  2. xcode配置項(xiàng)目的bundleid與Apple后臺配置的bundleid一致。打開In App Purchase

  3. 退出iPhone的App Store賬號(因?yàn)槲覀冃枰褂蒙澈匈~號登錄)

  4. xcode運(yùn)行App戈盈,購買商品奠衔,系統(tǒng)會讓你進(jìn)行登錄,這里我們點(diǎn)擊“使用現(xiàn)有的AppleID”就可以沙盒測試賬號進(jìn)行登錄了塘娶。

image

image

image

重試機(jī)制

IAP在實(shí)際使用中會有用戶返回內(nèi)購丟單的情況归斤。分析在整個(gè)流程中會有兩個(gè)環(huán)節(jié)失敗的情況。

  • Apple支付成功后刁岸,客戶端沒有收到Apple支付的回調(diào)脏里,無法發(fā)起服務(wù)端驗(yàn)證。

【解決辦法】:App啟動(dòng)后要注冊對Apple支付結(jié)果回調(diào)的觀察虹曙。這樣Apple還會恢復(fù)支付狀態(tài)更新的回調(diào)迫横。

  • 收到Apple支付成功后,發(fā)起服務(wù)端驗(yàn)證失敗酝碳。這樣在Apple那里已經(jīng)支付完成了矾踱,但是用戶卻沒有收到購買的商品。

【解決辦法】:增加重試, 延遲對蘋果訂單的確認(rèn)疏哗。

  • 1呛讲、發(fā)起服務(wù)端驗(yàn)證接口失敗(網(wǎng)絡(luò)錯(cuò)誤或者業(yè)務(wù)錯(cuò)誤時(shí)),立即間隔一段時(shí)間重試
  • 2贝搁、延遲對蘋果訂單的確認(rèn)吗氏,充值完成才確認(rèn)蘋果訂單。App啟動(dòng)的時(shí)候雷逆,對于未驗(yàn)證成功的支付弦讽,再次發(fā)起服務(wù)端驗(yàn)證。

參考文檔

iOS Apple內(nèi)購及掉單問題

iOS開發(fā)-內(nèi)購丟單處理方式

iOS—處理蘋果內(nèi)購(IAP)掉單的坑

收據(jù)驗(yàn)證編程指南

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膀哲,一起剝皮案震驚了整個(gè)濱河市往产,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌某宪,老刑警劉巖捂齐,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缩抡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)包颁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瞻想,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娩嚼,你說我怎么就攤上這事蘑险。” “怎么了岳悟?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵佃迄,是天一觀的道長。 經(jīng)常有香客問我贵少,道長呵俏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任滔灶,我火速辦了婚禮普碎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘录平。我一直安慰自己麻车,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布斗这。 她就那樣靜靜地躺著动猬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪表箭。 梳的紋絲不亂的頭發(fā)上赁咙,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天歌殃,我揣著相機(jī)與錄音,去河邊找鬼致盟。 笑死岩梳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猿涨。 我是一名探鬼主播握童,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叛赚!你這毒婦竟也來了澡绩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俺附,失蹤者是張志新(化名)和其女友劉穎肥卡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事镣,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡步鉴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了璃哟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氛琢。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖随闪,靈堂內(nèi)的尸體忽然破棺而出阳似,到底是詐尸還是另有隱情,我是刑警寧澤铐伴,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布撮奏,位于F島的核電站,受9級特大地震影響当宴,放射性物質(zhì)發(fā)生泄漏畜吊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一户矢、第九天 我趴在偏房一處隱蔽的房頂上張望定拟。 院中可真熱鬧,春花似錦逗嫡、人聲如沸青自。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽延窜。三九已至,卻和暖如春抹锄,著一層夾襖步出監(jiān)牢的瞬間逆瑞,已是汗流浹背荠藤。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留获高,地道東北人哈肖。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像念秧,于是被迫代替她去往敵國和親淤井。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容