應(yīng)用內(nèi)支付 IAP支付流程 自動(dòng)續(xù)期訂閱 丟單處理 問(wèn)題 流程詳解

關(guān)于iOS的應(yīng)用內(nèi)支付(IAP), 我曾在項(xiàng)目開(kāi)發(fā)過(guò)程中接觸過(guò)兩次,本篇文章將詳細(xì)介紹一下整個(gè)的開(kāi)發(fā)流程, 我將會(huì)介紹IAP商品支付和驗(yàn)證流程

適用場(chǎng)景

IAP大量應(yīng)用于iOS系統(tǒng)中的游戲當(dāng)中,像一些游戲中的金幣肌厨,寶石的交易都是采用IAP支付鼻由。蘋(píng)果官方規(guī)定,當(dāng)APP涉及到虛擬貨幣的交易時(shí),只能使用IAP進(jìn)行支付,否則會(huì)在APP審核過(guò)程中被拒絕。而我們?cè)S多生活應(yīng)用使用微信支付论泛、支付寶支付卻仍可通過(guò)審核,是因?yàn)槎加糜诂F(xiàn)實(shí)物品的交易蛹屿。此外蘋(píng)果會(huì)收取虛擬貨幣盈利的百分之30屁奏。

類(lèi)型說(shuō)明

  • 消耗型商品
  • 非消耗型商品
  • 非續(xù)期訂閱
  • 自動(dòng)續(xù)期訂閱

消耗型商品

顧名思義, 可以消耗使用的商品, 比如游戲中的金幣, 鉆石等, 可以用來(lái)購(gòu)買(mǎi)應(yīng)用內(nèi)虛擬物品的貨幣

非消耗型商品

無(wú)法被消耗的商品,比如一些教育型APP中的課程, 再比如一些賽車(chē)游戲中的賽道, 這類(lèi)商品需要在審核添加恢復(fù)購(gòu)買(mǎi)按鈕, 用于用戶(hù)購(gòu)買(mǎi)過(guò)后再誤刪除或其他原因卸載APP后的恢復(fù)流程, 否則提交審核會(huì)被拒絕

非續(xù)期訂閱

此類(lèi)商品與消耗型商品類(lèi)似, 比如一個(gè)月的會(huì)員, 一個(gè)季度的會(huì)員等, 與消耗型商品的差異在于, 這類(lèi)商品在驗(yàn)證憑證時(shí)需要傳遞共享秘鑰

共享秘鑰.png

自動(dòng)續(xù)期訂閱

此類(lèi)商品網(wǎng)上介紹比較少, 這類(lèi)商品和其他商品的流程也有些許不同, 應(yīng)用比如視頻APP中的連續(xù)包月會(huì)員, 此類(lèi)商品到期會(huì)自動(dòng)扣費(fèi), 服務(wù)器的驗(yàn)證邏輯也會(huì)有所不同

以上為商品類(lèi)型的介紹說(shuō)明, 我會(huì)在下文中就這支付流程做詳細(xì)介紹

準(zhǔn)備工作

iTunes Connetct后臺(tái)創(chuàng)建商品, 建立沙盒測(cè)試賬號(hào)

項(xiàng)目類(lèi)型.png

整個(gè)IAP測(cè)試階段, 只能用沙盒測(cè)試賬號(hào)測(cè)試IAP支付, 且憑證驗(yàn)證只能發(fā)送至測(cè)試驗(yàn)證環(huán)境

由于本部分較為簡(jiǎn)單, 本文不做具體介紹, 直接在iTunes Connetct后臺(tái)創(chuàng)建按照說(shuō)明創(chuàng)建即可

需要注意的是如果應(yīng)用是第一次進(jìn)行IAP開(kāi)發(fā), 首先要完善蘋(píng)果商店內(nèi)的個(gè)人信息 (銀行卡信息错负、 稅務(wù)相關(guān)信息)才能創(chuàng)建相關(guān)商品, 而且需要在下一個(gè)發(fā)布版本中審核商品, 如果曾經(jīng)審核過(guò)IAP開(kāi)發(fā), 可直接在后臺(tái)進(jìn)行新增商品審核

支付驗(yàn)證流程

首先簡(jiǎn)單說(shuō)明一下整個(gè)流程, 此處以我們APP開(kāi)發(fā)為例, 說(shuō)明客戶(hù)端進(jìn)行支付, 服務(wù)器端進(jìn)行驗(yàn)證的邏輯, 保證整個(gè)IAP支付的安全性

整個(gè)流程大體為

  1. 客戶(hù)端請(qǐng)求商品訂單
  2. 獲取IAP商品id
  3. IAP商品查詢(xún)
  4. 用戶(hù)支付
  5. 客戶(hù)端發(fā)送訂單號(hào)+支付憑證到服務(wù)器
  6. 服務(wù)器驗(yàn)證憑證是否合法
  7. 返回結(jié)果到客戶(hù)端
  8. 客戶(hù)端業(yè)務(wù)邏輯處理

下面我會(huì)針對(duì)非續(xù)期訂閱以及自動(dòng)續(xù)期訂閱做詳細(xì)說(shuō)明, 消耗型商品和非續(xù)期訂閱類(lèi)似且相對(duì)簡(jiǎn)單

非續(xù)期訂閱支付流程(以一個(gè)月會(huì)員為例)

首先向服務(wù)器下單, 攜帶后臺(tái)創(chuàng)建的商品id, 向自己服務(wù)器下單, 在成功回調(diào)中獲取單號(hào)并存儲(chǔ)

/**
 下vip訂單

@param params 參數(shù)  @"item_id" : @(itemID),
@param success 成功回調(diào)
@param fail 失敗回調(diào)
 */
- (void)makeVipOrderWithParams:(NSDictionary *)params
                   success:(RequestOrderSuccess)success
                      fail:(RequestOrderfailBlock)fail;

下單成功后, 對(duì)商品進(jìn)行支付, 這里支付過(guò)程網(wǎng)絡(luò)上demo較多, 不做說(shuō)明, 具體參考github上的工具類(lèi) IAPHelper

/**
購(gòu)買(mǎi)對(duì)應(yīng)商品identifier后的回調(diào)

 @param identifier 商品identifier
 @param completion 回調(diào)
 */
- (void)payProductsWithIdentifier:(NSString *)identifier
                   completion:(IAPbuyProductCompleteResponseBlock)completion;

當(dāng)用戶(hù)支付成功后, 在回調(diào)中獲取到憑證, 以憑證 訂單號(hào) 用戶(hù)uid等為參數(shù)請(qǐng)求服務(wù)器, 服務(wù)器向蘋(píng)果服務(wù)器驗(yàn)證憑證是否支付

/**
查詢(xún)vipIAP支付結(jié)果

 @param orderID 訂單ID
 @param receipt 憑證
 @param uid 用戶(hù)uid
 @param success 成功回調(diào)
@param fail 失敗回調(diào)
*/
- (void)requestIAPResultWithOrderID:(long long)orderID
                        receipt:(NSString *)receipt
                            uid:(NSString *)uid
                        success:(RequestQuerySuccess)success
                           fail:(RequestQueryFail)fail;

此處, 服務(wù)器驗(yàn)證憑證時(shí), 因?yàn)闉榉抢m(xù)期訂閱支付, 需攜帶上文中的共享秘鑰和憑證進(jìn)行驗(yàn)證, 蘋(píng)果驗(yàn)證結(jié)果會(huì)返回訂單的詳細(xì)信息, 服務(wù)器根據(jù)返回信息來(lái)進(jìn)行業(yè)務(wù)處理

屏幕快照 2017-06-09 下午3.59.05.png

客戶(hù)端在收到驗(yàn)證結(jié)果后, 刷新界面即完成整個(gè)流程

自動(dòng)續(xù)期訂閱支付流程(連續(xù)包月)

支付流程和上方一致, 不同的特殊處理是, 服務(wù)器在驗(yàn)證成功后會(huì)儲(chǔ)存用戶(hù)的這個(gè)憑證,當(dāng)用戶(hù)此階段會(huì)員到期時(shí), 再次查詢(xún)憑證, 當(dāng)查詢(xún)憑證有效期發(fā)生了變化, 根據(jù)具體請(qǐng)求結(jié)果, 為用戶(hù)延長(zhǎng)一個(gè)月的會(huì)員, 否則, 到期取消會(huì)員

丟單處理

由于IAP服務(wù)器無(wú)法保證質(zhì)量, 或者自己服務(wù)器驗(yàn)證憑證出現(xiàn)問(wèn)題時(shí), 可能會(huì)出現(xiàn)丟單(用戶(hù)付費(fèi)成功, 但是憑證無(wú)法成功向自己服務(wù)器驗(yàn)證)的情況, 對(duì)于這種情況, 我們可以這樣處理

在用戶(hù)下單成功后, 儲(chǔ)存訂單&uid&憑證

/**
存儲(chǔ) 訂單&uid&憑證

@param orderID 訂單
@param uid 用戶(hù)uid
@param receipt 憑證
@param saveKey 儲(chǔ)存key
*/
- (void)saveOrderReceiptWithOrderID:(long long)orderID
                            uid:(NSString *)uid
                        receipt:(NSString *)receipt
                        saveKey:(NSString *)saveKey;

在用戶(hù)向服務(wù)器驗(yàn)證成功后或者非網(wǎng)絡(luò)原因造成的失敗后, 刪除此條記錄,

/**
刪除 訂單&憑證

@param orderID 訂單
@param receipt 憑證
@param saveKey 儲(chǔ)存key
*/
- (void)removeOrderReceiptWithOrderID:(long long)orderID
                          receipt:(NSString *)receipt
                          saveKey:(NSString *)saveKey;

這樣如果由于網(wǎng)絡(luò)問(wèn)題或者服務(wù)器出現(xiàn)問(wèn)題造成丟單, 我們可以在下一次用戶(hù)啟動(dòng)APP再次去進(jìn)行驗(yàn)證這筆訂單, 重復(fù)上面流程

/**
 核對(duì)支付成功但是驗(yàn)證失敗的訂單
*/
- (void)checkLocalLostVipOrder;

偽造訂單處理

IAP支付難免會(huì)出現(xiàn)一些偽造憑證的驗(yàn)證, 對(duì)此, 服務(wù)器端對(duì)于憑證的驗(yàn)證一定要十分謹(jǐn)慎, 我們APP曾收到過(guò)偽造憑證的驗(yàn)證, 可以參考一下驗(yàn)證:

  1. 核對(duì)憑證驗(yàn)證后itemID
  2. 核對(duì)憑證是否為正式環(huán)境的憑證
  3. 核對(duì)憑證的有效時(shí)間
  4. 對(duì)于越獄用戶(hù)的處理, 之前做消耗品IAP支付的時(shí)候, 對(duì)于越獄用戶(hù)由于有一些IAP插件的存在, 我們選擇對(duì)于越獄用戶(hù)直接進(jìn)行微信支付, 隨著后來(lái)判斷邏輯的增加, 對(duì)于越獄用戶(hù)也啟用了IAP支付

審核需知

IAP審核時(shí), 需要提供沙盒測(cè)試賬號(hào)和一個(gè)APP的測(cè)試賬號(hào), 在審核過(guò)程時(shí), 我們整個(gè)流程都已經(jīng)切換為正式環(huán)境, 但審核人員仍然使用測(cè)試憑證去進(jìn)行驗(yàn)證, 我們服務(wù)器需要在審核階段, 對(duì)于此uid的憑證仍然去測(cè)試驗(yàn)證接口去驗(yàn)證, 否則會(huì)被拒絕通過(guò)

具體審核問(wèn)題詳見(jiàn)我寫(xiě)的這篇文章應(yīng)用內(nèi)支付自動(dòng)續(xù)費(fèi) 連續(xù)包月 審核注意問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坟瓢,一起剝皮案震驚了整個(gè)濱河市勇边,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌折联,老刑警劉巖粒褒,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诚镰,居然都是意外死亡奕坟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)怕享,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)执赡,“玉大人镰踏,你說(shuō)我怎么就攤上這事函筋。” “怎么了奠伪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵跌帐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绊率,道長(zhǎng)谨敛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任滤否,我火速辦了婚禮脸狸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藐俺。我一直安慰自己炊甲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布欲芹。 她就那樣靜靜地躺著卿啡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菱父。 梳的紋絲不亂的頭發(fā)上颈娜,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音浙宜,去河邊找鬼官辽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粟瞬,可吹牛的內(nèi)容都是我干的同仆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亩钟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乓梨!你這毒婦竟也來(lái)了鳖轰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扶镀,失蹤者是張志新(化名)和其女友劉穎蕴侣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體臭觉,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昆雀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝠筑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狞膘。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖什乙,靈堂內(nèi)的尸體忽然破棺而出挽封,到底是詐尸還是另有隱情,我是刑警寧澤臣镣,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布辅愿,位于F島的核電站,受9級(jí)特大地震影響忆某,放射性物質(zhì)發(fā)生泄漏点待。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一弃舒、第九天 我趴在偏房一處隱蔽的房頂上張望癞埠。 院中可真熱鬧,春花似錦聋呢、人聲如沸苗踪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)徒探。三九已至,卻和暖如春喂窟,著一層夾襖步出監(jiān)牢的瞬間测暗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工磨澡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碗啄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓稳摄,卻偏偏與公主長(zhǎng)得像稚字,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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