應(yīng)用內(nèi)購(gòu)買IAP

一垫蛆、IAP
In-App Purchase禽最,應(yīng)用內(nèi)購(gòu)買。注意袱饭,IAP與ApplePay不是同一回事川无,ApplePay純粹是一種支付方式,同微信支付虑乖、支付寶類似懦趋;而IAP是一種App內(nèi)部購(gòu)買的方式,購(gòu)買時(shí)付款的方式是需要提前在蘋果帳戶中設(shè)置的决左,可以選擇微信支付愕够、支付寶、ApplePay佛猛、銀行卡等。

二坠狡、4種商品類型
(1)消耗性商品:使用后就被消耗掉继找,需要再購(gòu)買的商品。比如逃沿,釣魚(yú)App中的魚(yú)食,App中的金幣;
(2)非消耗性商品:購(gòu)買后可永久使用的商品沸伏。比如须尚,讀書(shū)App中的書(shū)籍,購(gòu)買后可永久閱讀假消;游戲App中的賽道柠并;
(3)自動(dòng)續(xù)期訂閱商品:允許在固定時(shí)間段內(nèi)購(gòu)買動(dòng)態(tài)內(nèi)容的商品,如果購(gòu)買后不手動(dòng)取消富拗,將自動(dòng)續(xù)期自動(dòng)付費(fèi)臼予。比如,每月訂閱提供流媒體服務(wù)的App啃沪;
(4)非自動(dòng)續(xù)期訂閱商品:有時(shí)限性服務(wù)的商品粘拾,不自動(dòng)續(xù)期。比如创千,App提供的VIP特權(quán)服務(wù)缰雇;

三入偷、開(kāi)發(fā)步驟:
(1)在iTunesConnect中填寫協(xié)議、稅務(wù)械哟、銀行等信息疏之,創(chuàng)建配置內(nèi)購(gòu)商品,將商品添加到App中戒良;
(2)Xcode中配置內(nèi)購(gòu)
(3)編寫代碼
(4)沙箱測(cè)試
(5)提審上線

四体捏、內(nèi)購(gòu)流程:
(1)從本地或服務(wù)器獲取可購(gòu)買的商品ID列表;
(2)從App Store獲取商品ID對(duì)應(yīng)的商品信息糯崎;
(3)用戶選擇某一商品點(diǎn)擊購(gòu)買按鈕后几缭,請(qǐng)求服務(wù)端生成訂單
(4)應(yīng)用獲取訂單號(hào)后,向App Store發(fā)起交易請(qǐng)求沃呢,并監(jiān)聽(tīng)交易狀態(tài)年栓;
(5)App Store處理交易請(qǐng)求,從蘋果賬戶扣款薄霜;
(6)App Store交易成功某抓,應(yīng)用監(jiān)聽(tīng)到交易成功狀態(tài);交易失敗惰瓜,則移除交易并提示購(gòu)買失敺窀薄;
(7)應(yīng)用獲取到交易票據(jù)崎坊;
(8)應(yīng)用將票據(jù)和訂單號(hào)提交到服務(wù)器备禀,由服務(wù)器向App Store請(qǐng)求驗(yàn)證票據(jù)。注意對(duì)于沙盒環(huán)境和正式環(huán)境奈揍,App Store驗(yàn)證票據(jù)的URL是不同的曲尸;
(9)服務(wù)器判斷訂單號(hào)不存在,或票據(jù)中的交易號(hào)已存在男翰,則通知應(yīng)用移除交易另患,購(gòu)買失敗蛾绎;
(9)驗(yàn)證成功后昆箕,服務(wù)器保存用戶購(gòu)買記錄(訂單號(hào)、交易號(hào)秘通、用戶賬號(hào)等)为严,并向用戶發(fā)放相應(yīng)商品,即修改服務(wù)器上用戶的數(shù)據(jù)肺稀,并通知應(yīng)用購(gòu)買成功更新界面第股;如果驗(yàn)證失敗,也通知應(yīng)用话原;
(10)應(yīng)用收到票據(jù)驗(yàn)證成功的反饋后夕吻,標(biāo)記該交易完成狀態(tài)诲锹,提示用戶購(gòu)買成功,并更新界面涉馅,并刪除本地票據(jù)归园;
(11)應(yīng)用收到票據(jù)驗(yàn)證失敗的反饋后,如果錯(cuò)誤碼為21007稚矿,說(shuō)明當(dāng)前票據(jù)為沙盒測(cè)試票據(jù)庸诱,但卻連接App Store正式環(huán)境進(jìn)行了票據(jù)驗(yàn)證,故需要連接App Store沙盒環(huán)境再次驗(yàn)證票據(jù)晤揣;
(12)應(yīng)用收到票據(jù)驗(yàn)證失敗的反饋桥爽,如果確定票據(jù)無(wú)效,可提示購(gòu)買失敗昧识,并標(biāo)記交易完成钠四,以便將交易移出交易隊(duì)列;對(duì)于需要重新驗(yàn)證的票據(jù)跪楞,可以隔一段時(shí)間或者App重啟時(shí)重新請(qǐng)求驗(yàn)證缀去,直到驗(yàn)證成功才標(biāo)記交易完成。

10票據(jù)驗(yàn)證:
(1)兩種票據(jù)內(nèi)容甸祭。一種是付費(fèi)下載的App的票據(jù)缕碎;另一種是App內(nèi)部購(gòu)買商品的票據(jù);
(2)從App Store安裝App后池户,會(huì)自動(dòng)在App的沙盒的StoreKit目錄下創(chuàng)建票據(jù)文件receipt阎曹;
(3)票據(jù)文件receipt中,內(nèi)購(gòu)項(xiàng)目可能為空煞檩,也可能同時(shí)存在多個(gè)內(nèi)購(gòu)項(xiàng)目,只要數(shù)據(jù)正確栅贴,驗(yàn)證票據(jù)都會(huì)成功斟湃;
(4)對(duì)于購(gòu)買的訂閱類商品、非消耗性商品檐薯,購(gòu)買信息會(huì)永久保存在票據(jù)文件中凝赛;
(5)對(duì)于消耗性商品,購(gòu)買信息在交易付款后保存到票據(jù)中坛缕,一旦交易被標(biāo)識(shí)為完成墓猎,該信息會(huì)在請(qǐng)求刷新票據(jù),或者下次交易更新票據(jù)時(shí)被清除掉赚楚;
(6)iOS7以后毙沾,票據(jù)數(shù)據(jù)可以從沙盒中讀取宠页;iOS7以前左胞,票據(jù)數(shù)據(jù)可以從交易對(duì)象的transactionReceipt屬性中獲瓤懿帧;如果本地沒(méi)有票據(jù)數(shù)據(jù)烤宙,可以向App Store請(qǐng)求票據(jù)數(shù)據(jù)遍烦;

App Store票據(jù)驗(yàn)證接口參數(shù):
(1)"receipt-data":base64編碼的票據(jù)數(shù)據(jù)data;
(2)"password": 共享密碼躺枕,僅在購(gòu)買自動(dòng)續(xù)期訂閱商品時(shí)需要服猪;

App Store票據(jù)驗(yàn)證返回JSON格式:
(1)"status": 0為驗(yàn)證成功;
(2)"receipt": 提交的票據(jù)原數(shù)據(jù)拐云;

Receipt票據(jù)數(shù)據(jù)格式:
{
"adam_id" = 0;
"app_item_id" = 0;
"application_version" = 1;
"bundle_id" = "com.test.xxx";
"download_id" = 0;
"in_app" = (
{
"is_trial_period" = false;
"original_purchase_date" = "2017-12-14 07:18:56 Etc/GMT";
"original_purchase_date_ms" = 1513235936000;
"original_purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles";
"original_transaction_id" = 1000000359369424;
"product_id" = "com.test.product1";
"purchase_date" = "2017-12-14 07:18:56 Etc/GMT";
"purchase_date_ms" = 1513235936000;
"purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000359369424;
},
...
);
"original_application_version" = "1.0";
"original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
"original_purchase_date_ms" = 1375340400000;
"original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles";
"receipt_creation_date" = "2017-12-14 07:18:56 Etc/GMT";
"receipt_creation_date_ms" = 1513235936000;
"receipt_creation_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles";
"receipt_type" = ProductionSandbox;
"request_date" = "2017-12-14 07:19:23 Etc/GMT";
"request_date_ms" = 1513235963829;
"request_date_pst" = "2017-12-13 23:19:23 America/Los_Angeles";
"version_external_identifier" = 0;
};

服務(wù)端驗(yàn)證接口參數(shù):
(1)base64編碼的票據(jù)數(shù)據(jù)字符串罢猪;
(2)服務(wù)端訂單號(hào);
(3)驗(yàn)證環(huán)境標(biāo)識(shí)(沙盒環(huán)境或正式環(huán)境)慨丐;
(4)用戶ID坡脐;
(5)所有接口參數(shù)應(yīng)該加密后傳輸;

服務(wù)端驗(yàn)證邏輯:
(1)解密接口參數(shù)房揭,提取出票據(jù)數(shù)據(jù)备闲、訂單號(hào)、驗(yàn)證環(huán)境捅暴、用戶ID恬砂;
(2)如果票據(jù)數(shù)據(jù)為空,或驗(yàn)證環(huán)境參數(shù)錯(cuò)誤蓬痒,返回參數(shù)錯(cuò)誤的錯(cuò)誤碼泻骤;否則進(jìn)行下一步;
(3)查詢訂單是否存在:
(3.1)如果訂單存在且已完成(訂單對(duì)應(yīng)交易ID已存在)梧奢,則無(wú)需再驗(yàn)證票據(jù)數(shù)據(jù)狱掂。如果用戶ID與訂單所屬用戶相同,則返回用戶的所有商品信息和重復(fù)驗(yàn)證票據(jù)的返回碼亲轨,否則只返回重復(fù)驗(yàn)證票據(jù)的返回碼而不返回用戶所有商品信息趋惨;
(3.2)如果訂單存在且未完成(訂單對(duì)應(yīng)交易ID不存在),則進(jìn)入下一步驗(yàn)證票據(jù)數(shù)據(jù)惦蚊;
(3.3)如果訂單不存在器虾,則查詢票據(jù)中交易ID是否已有對(duì)應(yīng)訂單。如果沒(méi)有訂單蹦锋,則返回訂單不存在的錯(cuò)誤碼兆沙;如果有訂單,則進(jìn)入下一步驗(yàn)證票據(jù)數(shù)據(jù)莉掂;
(4)驗(yàn)證票據(jù)數(shù)據(jù)葛圃。調(diào)用蘋果提供的票據(jù)驗(yàn)證接口進(jìn)行驗(yàn)證。沙盒環(huán)境驗(yàn)證接口:https://sandbox.itunes.apple.com/verifyReceipt,正式環(huán)境驗(yàn)證接口:https://buy.itunes.apple.com/verifyReceipt装悲。如果驗(yàn)證失敗昏鹃,將蘋果返回的狀態(tài)碼作為錯(cuò)誤碼返回給客戶端,如果驗(yàn)證成功诀诊,則向訂單對(duì)應(yīng)用戶發(fā)放商品洞渤;如果驗(yàn)證成功(狀態(tài)碼為0)且用戶ID與訂單所屬用戶相同,則同時(shí)返回用戶所有商品信息属瓣;

服務(wù)端驗(yàn)證接口返回?cái)?shù)據(jù):
(1)用戶當(dāng)前已購(gòu)買的所有商品信息载迄;
(2)接口錯(cuò)誤信息;
(3)錯(cuò)誤碼:一類是服務(wù)器自身的報(bào)錯(cuò)抡蛙;另一類是App Store返回的錯(cuò)誤碼护昧。

漏單處理:
漏單,即用戶付款成功粗截,但沒(méi)有收到購(gòu)買的商品的情況惋耙。如果交易在App Store中尚未完成,則應(yīng)用定時(shí)或重啟后會(huì)繼續(xù)處理該交易熊昌。如果交易已完成绽榛,則用戶只能向客服反饋,提供蘋果賬號(hào)和單號(hào)婿屹,確認(rèn)漏單后補(bǔ)發(fā)商品灭美。

注意點(diǎn):
(1)內(nèi)購(gòu)必須使用真機(jī)測(cè)試,測(cè)試時(shí)先退出真機(jī)上的AppleID昂利,在App內(nèi)購(gòu)買時(shí)填寫沙箱測(cè)試賬號(hào)届腐;
(2)游客模式下,App中不要出現(xiàn)商品相關(guān)信息蜂奸;
(3)等待請(qǐng)求交易的時(shí)候犁苏,如果App重啟,則重啟后App Store仍會(huì)向監(jiān)聽(tīng)對(duì)象發(fā)送交易狀態(tài)反饋扩所;如果交易成功后沒(méi)有被標(biāo)識(shí)為finished傀顾,App Store仍會(huì)向監(jiān)聽(tīng)對(duì)象發(fā)送交易狀態(tài);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碌奉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寒砖,更是在濱河造成了極大的恐慌赐劣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哩都,死亡現(xiàn)場(chǎng)離奇詭異魁兼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)漠嵌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門咐汞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盖呼,“玉大人,你說(shuō)我怎么就攤上這事化撕〖肝睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵植阴,是天一觀的道長(zhǎng)蟹瘾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)掠手,這世上最難降的妖魔是什么憾朴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮喷鸽,結(jié)果婚禮上众雷,老公的妹妹穿的比我還像新娘。我一直安慰自己做祝,他們只是感情好砾省,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著剖淀,像睡著了一般纯蛾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵隔,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天翻诉,我揣著相機(jī)與錄音,去河邊找鬼捌刮。 笑死碰煌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绅作。 我是一名探鬼主播芦圾,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俄认!你這毒婦竟也來(lái)了个少?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眯杏,失蹤者是張志新(化名)和其女友劉穎夜焦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體岂贩,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茫经,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卸伞。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抹镊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荤傲,到底是詐尸還是另有隱情垮耳,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布弃酌,位于F島的核電站氨菇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏妓湘。R本人自食惡果不足惜查蓉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榜贴。 院中可真熱鬧豌研,春花似錦、人聲如沸唬党。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驶拱。三九已至霜浴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓝纲,已是汗流浹背阴孟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留税迷,地道東北人永丝。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像箭养,于是被迫代替她去往敵國(guó)和親慕嚷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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