支付系統(tǒng)設(shè)計(jì):應(yīng)用內(nèi)支付(五)
![](http://image.woshipm.com/wp-files/img/95.jpg)
應(yīng)用內(nèi)支付指使用手機(jī)操作系統(tǒng)自帶的支付功能來(lái)支持支付。目前國(guó)內(nèi)主要的應(yīng)用內(nèi)支付有 Google Pay、Apple Pay、小米支付、華為支付等。 其中Apple Pay是典型的一個(gè)應(yīng)用內(nèi)支付,Android平臺(tái)的各種支付也一般是沿用Apple Pay的設(shè)計(jì)。
為什么要IAP
相對(duì)來(lái)說(shuō),應(yīng)用內(nèi)支付的用戶體驗(yàn),和微信支付、支付寶相比,還是有一定差距的,但是為什么要開(kāi)發(fā)應(yīng)用內(nèi)支付呢? 這個(gè)和蘋(píng)果的AppStore的審核政策有關(guān)。 在官方的 (App Store Review Guidelines) 中, 有如下幾條意見(jiàn):
1.2 Apps utilizing a system other than the In-App Purchase API (IAP) to purchase content, functionality, or services in an App will be rejected.
在 App 內(nèi)使用非 IAP 的系統(tǒng)來(lái)購(gòu)買(mǎi)內(nèi)容、功能或服務(wù)將被拒絕。
11.3 Apps using IAP to purchase physical goods or goods and services used outside of the App will be rejected.
IAP 購(gòu)買(mǎi)實(shí)物或者應(yīng)用外的商品或服務(wù)將會(huì)被拒絕;
11.4 Apps that use IAP to purchase credits or other currencies must consume those credits within the App
通過(guò) IAP 購(gòu)買(mǎi)的積分或者其他貨幣必須只在 App 內(nèi)使用。
這問(wèn)題就來(lái)了,如果要購(gòu)買(mǎi)的服務(wù),即在IOS內(nèi)使用,也在Android等IOS系統(tǒng)外使用, 那應(yīng)該是使用規(guī)則11.2或者規(guī)則11.3來(lái)執(zhí)行? 比如說(shuō)視頻網(wǎng)站,視頻既可以在IOS上看,也可以在Android上看,那是否是需要通過(guò)IAP來(lái)購(gòu)買(mǎi)? 蘋(píng)果公司在這一點(diǎn)上采取模糊的策略。 愛(ài)奇藝、騰訊視頻,在IOS上購(gòu)買(mǎi)會(huì)員,只能用IAP支付。這就和蘋(píng)果公司的審核有關(guān)。
IAP支付流程
一般IAP支付的開(kāi)發(fā)流程,首先需要一些準(zhǔn)備工作,包括:
- 在developer.apple.com上配置一個(gè)App ID,使用該ID生成和安裝相應(yīng)的Provisioning Profile文件。
- 登錄到iTunes Connect,使用App ID創(chuàng)建一個(gè)新的應(yīng)用,在該應(yīng)用中,創(chuàng)建應(yīng)用內(nèi)付費(fèi)項(xiàng)目,設(shè)置好價(jià)格和Product ID以及購(gòu)買(mǎi)介紹和截圖。
- 添加一個(gè)用于在sandbox付費(fèi)的測(cè)試用戶,填寫(xiě)相關(guān)的稅務(wù),銀行,聯(lián)系人信息。
完成這些準(zhǔn)備工作后,既可以進(jìn)入正式的開(kāi)發(fā),開(kāi)發(fā)代碼我們這里就不說(shuō)了,流程如下:
- 用戶選擇要購(gòu)買(mǎi)的內(nèi)容并點(diǎn)擊購(gòu)買(mǎi)按鈕;
- 用戶通過(guò)App Store賬戶驗(yàn)證
- 蘋(píng)果服務(wù)器驗(yàn)證用戶請(qǐng)求
- 蘋(píng)果服務(wù)器從用戶帳號(hào)扣款
- 蘋(píng)果向用戶返回購(gòu)買(mǎi)成功信息
- 軟件接收并顯示用戶購(gòu)買(mǎi)信息
老司機(jī)都能看出來(lái),這里有好多好多的坑。
用戶訪問(wèn)AppStore時(shí)使用的是Apple的賬號(hào),不是應(yīng)用系統(tǒng)的賬號(hào)。 也就是說(shuō),我們并不知道到底是誰(shuí)在購(gòu)買(mǎi)這個(gè)內(nèi)容。 比如在應(yīng)用中有兩個(gè)賬號(hào)A和B,用A賬號(hào)登錄后,上IAP買(mǎi)了東西,然后用B賬號(hào)來(lái)登錄,也上IAP買(mǎi)東西, 這兩次購(gòu)買(mǎi),用的是同一個(gè)Apple賬號(hào)。蘋(píng)果也不會(huì)告訴你,到底是哪個(gè)賬號(hào)付了錢(qián)。 賬號(hào)坑在單次購(gòu)買(mǎi)中還沒(méi)什么問(wèn)題,但碰到訂閱的情況,得好好處理下。在訂閱章節(jié)中會(huì)詳細(xì)說(shuō)明。從上述流程可以看出,蘋(píng)果服務(wù)器都是和客戶端打交道的,這里面似乎沒(méi)有應(yīng)用服務(wù)器什么事情。 只有在客戶端接收到蘋(píng)果返回信息后,才可以把這個(gè)信息轉(zhuǎn)發(fā)給應(yīng)用服務(wù)器。 如果用戶一直不打開(kāi)手機(jī)上的應(yīng)用,那應(yīng)用服務(wù)器就一直收不到通知了。 好在后來(lái)蘋(píng)果提供了一個(gè)驗(yàn)證功能,應(yīng)用服務(wù)器可以把接收到的返回信息(加密后的字符串)發(fā)送給蘋(píng)果服務(wù)器來(lái)驗(yàn)證和解密。
IAP訂閱
IAP Subscription又是一個(gè)大坑。 官方的文檔在這里。內(nèi)容不多,沒(méi)有說(shuō)明的東西卻很多。
續(xù)費(fèi)周期的計(jì)算
IAP主要提供給周期性訂閱的音樂(lè)、電子書(shū)等內(nèi)容使用。 一般就按月來(lái)計(jì)算周期。蘋(píng)果是以自然月來(lái)算權(quán)益周期。比如在1月3號(hào)買(mǎi)了權(quán)益,到2月3號(hào),這個(gè)權(quán)益就過(guò)期啦,需要在此之前完成續(xù)費(fèi)。 那問(wèn)題來(lái)了,1月31號(hào)買(mǎi)的權(quán)益,到幾號(hào)過(guò)期?以自然月算,這個(gè)權(quán)益會(huì)在3月1日前到期,如果2月份,3月份都續(xù)費(fèi)了,到4月份,也是享受到4月30日了。
自動(dòng)續(xù)費(fèi)
應(yīng)用開(kāi)發(fā)應(yīng)該不需要關(guān)心續(xù)費(fèi)的細(xì)節(jié)。蘋(píng)果會(huì)做自動(dòng)處理。在權(quán)益到期前10天,蘋(píng)果檢查用戶賬戶是否可以扣款,商品價(jià)格是否有變動(dòng)。在權(quán)益到期前24小時(shí),蘋(píng)果開(kāi)始扣款,如果失敗,會(huì)多次重試,直到成功。問(wèn)題來(lái)了,這個(gè)重試,會(huì)延續(xù)到用戶權(quán)益過(guò)期后一小段時(shí)間,蘋(píng)果沒(méi)有說(shuō)這段時(shí)間該算是有權(quán)益還是沒(méi)有,但開(kāi)發(fā)人員需要注意應(yīng)該如何處理。
免費(fèi)試用
免費(fèi)試用不是強(qiáng)制需求,但這有利于用戶判斷是否值得購(gòu)買(mǎi)這個(gè)物品。免費(fèi)試用期是在itunes connect中設(shè)置。 當(dāng)用戶第一次購(gòu)買(mǎi)這個(gè)東西的時(shí)候, 客戶端接收到的Receipt中包含免費(fèi)試用信息。在免費(fèi)期快到的時(shí)候,蘋(píng)果發(fā)起第一次扣款。整個(gè)過(guò)程和自動(dòng)續(xù)費(fèi)類(lèi)似,唯一區(qū)別是第一個(gè)月是免費(fèi)的。
Receipt 驗(yàn)證
客戶端接收到 Receipt 之后,需要提交到服務(wù)器端進(jìn)行處理,開(kāi)通權(quán)益。 這就來(lái)了個(gè)問(wèn)題:Receipt應(yīng)該在客戶端還是服務(wù)器端解析?當(dāng)然需要在服務(wù)器端處理,這樣可以防止越獄后的一些插件,如IAP Cracker、IAP Free等偽造交易憑證,欺騙蘋(píng)果服務(wù)器,開(kāi)通權(quán)益。 此外,還需注意,客戶端和服務(wù)器端之間需通過(guò)HTTPS以及參數(shù)簽名等方式來(lái)確保通訊安全。 服務(wù)器端接收到Receipt之后,首先驗(yàn)證請(qǐng)求的有效性, 然后將Receipt發(fā)送到蘋(píng)果服務(wù)器上進(jìn)行驗(yàn)證和解析。 接收到蘋(píng)果處理結(jié)果后, 將Receipt中的user_id, product_id、purchase_date、transaction_id等做驗(yàn)證和處理。
IAP破解和防御
既然Iap的驗(yàn)證主要是在蘋(píng)果服務(wù)器端和手機(jī)客戶端進(jìn)行,并且是使用域名。這簡(jiǎn)直是為攻擊打開(kāi)了一扇大門(mén),而不僅僅是漏洞。 早期的IAP內(nèi)購(gòu)解鎖工具IAP cracker對(duì)IAP的破解比較簡(jiǎn)單粗暴。寫(xiě)過(guò)IAP程序的人都知道, 程序中基本都是用transactionState來(lái)判斷交易是否成功。
transactionState 有四個(gè)狀態(tài):
- SKPaymentTransactionStatePurchasing
- SKPaymentTransactionStatePurchased
- SKPaymentTransactionStateFailed
- SKPaymentTransactionStateRestored
SKPaymentTransactionStatePurchased 表示購(gòu)買(mǎi)成功了。 只要修改這個(gè)變量值,如果客戶端應(yīng)用直接根據(jù)交易狀態(tài)來(lái)處理業(yè)務(wù)流程,那就會(huì)收到這個(gè)假的交易成功信息,接下來(lái)用戶就能不花錢(qián)得到所買(mǎi)的物品。這個(gè)過(guò)程,甚至都不需要接入網(wǎng)絡(luò)。
另一個(gè)工具IAPfree功能更強(qiáng)大,安裝使用也復(fù)雜很多。它是通過(guò)修改DNS,讓客戶端訪問(wèn)黑客提供的服務(wù)器來(lái)取代訪問(wèn)蘋(píng)果服務(wù)器,實(shí)現(xiàn)所謂的MITM中間人攻擊。當(dāng)用戶在客戶端觸發(fā)購(gòu)買(mǎi)流程時(shí),會(huì)被引導(dǎo)到偽裝的蘋(píng)果服務(wù)器上,不扣款而直接返回扣款成功收據(jù)。用戶不需要支付任何資金,客戶端能夠拿到完整的收據(jù)。如果是在客戶端處理收據(jù)驗(yàn)證也沒(méi)有任何問(wèn)題。為了避免用戶所使用的設(shè)備被封,這些軟件甚至可以提供偽造UDID的功能。 為此,蘋(píng)果特別說(shuō)明,一定要在服務(wù)器端驗(yàn)證用戶購(gòu)買(mǎi)信息,驗(yàn)證內(nèi)容包括收據(jù)簽名,證書(shū),產(chǎn)家信息等,確保收據(jù)無(wú)誤后,才能授予權(quán)益。如果發(fā)現(xiàn)有詐,則將用戶拉黑。
兩套賬戶體系
蘋(píng)果支付的賬戶體系,當(dāng)然是以apple id為基礎(chǔ)的,它允許用戶在多臺(tái)設(shè)備上共用一個(gè)賬戶。一臺(tái)設(shè)備上,一般只有一個(gè)激活賬戶。但對(duì)應(yīng)用系統(tǒng)來(lái)說(shuō),大部分是允許多個(gè)賬號(hào)登陸的。這對(duì)續(xù)費(fèi)來(lái)說(shuō)就是個(gè)大問(wèn)題。 用戶以賬戶a登錄后,發(fā)起續(xù)費(fèi),獲得權(quán)益。然后以賬號(hào)B登錄了,顯然,A的權(quán)益不會(huì)衍生給B。過(guò)幾天A開(kāi)始續(xù)費(fèi)了,續(xù)費(fèi)之后,切換到B賬號(hào)登錄,客戶端在B賬號(hào)登錄時(shí)得到續(xù)費(fèi)的收據(jù)并發(fā)送給應(yīng)用服務(wù)器。那這算是誰(shuí)的續(xù)費(fèi)請(qǐng)求?當(dāng)然是A的。在這個(gè)apple id發(fā)起的續(xù)費(fèi)請(qǐng)求,所有的收據(jù)都會(huì)有一個(gè)相同的原始交易號(hào)original transaction Id。在用戶發(fā)起訂閱時(shí),需要記錄這個(gè)id和賬號(hào)的關(guān)系,每次續(xù)費(fèi),需要在解析收據(jù)后,根據(jù)原始交易號(hào)從這里獲取真正的充值賬戶,不能從客戶端提交的用戶id作為憑據(jù)。
還是這個(gè)坑,如果在賬戶b登錄后也發(fā)起訂閱請(qǐng)求,會(huì)怎么樣?這個(gè)調(diào)用將會(huì)失敗,所以需要阻止用戶發(fā)起這樣的請(qǐng)求?;蛘咴O(shè)置多個(gè)產(chǎn)品副本來(lái)讓用戶購(gòu)買(mǎi)。
分成,定價(jià)和國(guó)際化
在iTunes中的給的產(chǎn)品定價(jià)必須是稅前的,蘋(píng)果和商家的分成,也是按稅前算。商家給出在一個(gè)主要銷(xiāo)售國(guó)家和地區(qū)(比如國(guó)內(nèi)的基本就是中國(guó)了)的價(jià)格,即基準(zhǔn)價(jià)格。在其他地區(qū)的銷(xiāo)售價(jià)格,蘋(píng)果會(huì)自動(dòng)根據(jù)當(dāng)前的匯率來(lái)?yè)Q算成當(dāng)?shù)氐呢泿拧.?dāng)然,也可以自己修改設(shè)定在這些國(guó)家或者地區(qū)的當(dāng)?shù)貎r(jià)格。目前是支持到155個(gè)國(guó)家。還要特別注意版權(quán)問(wèn)題。
基準(zhǔn)價(jià)格調(diào)整,如果是往高了調(diào)整, 則在用戶下一次續(xù)費(fèi)時(shí),需要用戶確認(rèn)。如果往低了調(diào),那就不需要用戶確認(rèn),直接扣款了。
蘋(píng)果對(duì)商家的產(chǎn)品價(jià)格體系有分組(Group)的概念,同國(guó)內(nèi)說(shuō)的價(jià)格體系,比如白金會(huì)員、黃金會(huì)員、貴賓等,在同一個(gè)Group里面,用戶只能選擇一個(gè)檔,比如用戶要么是白金要么是黃金會(huì)員,不會(huì)同時(shí)是。
在同一個(gè)分組中,如果用戶訂閱時(shí)間超過(guò)一年(365天),則商家可以得到來(lái)自這個(gè)用戶收益的更多的分成,目前是85%。這個(gè)訂閱時(shí)間不包括免費(fèi)試用期。 同時(shí)可以有60天的寬限。也就是說(shuō),這一年中,如果用戶曾經(jīng)停止續(xù)費(fèi),然后又開(kāi)始繼續(xù)續(xù)費(fèi),只要中間不續(xù)費(fèi)的時(shí)間不超過(guò)60天就行。
更多的坑
目前用的是IOS 10.0 版本, 這個(gè)版本和IAP有關(guān)的坑,先記錄下:
- 沙盒環(huán)境,沒(méi)法做取消訂閱操作。 只能在線上模擬。 所以產(chǎn)品設(shè)計(jì)和開(kāi)發(fā)時(shí),盡量不要依賴取消訂閱操作,也應(yīng)該不依賴于這個(gè)操作。
- 沙盒環(huán)境下,有些receipt可能會(huì)收不到transaction id,線上的暫未發(fā)現(xiàn)這個(gè)問(wèn)題。
- 蘋(píng)果提供單個(gè)收據(jù)和列表收據(jù)兩種格式。推薦使用列表數(shù)據(jù),但問(wèn)題是,這個(gè)列表收據(jù)的長(zhǎng)度,蘋(píng)果也不知道最多會(huì)有多少。
Android IAP
好吧,用這個(gè)話題作總結(jié),不是太好。IOS上用蘋(píng)果支付是被逼的,android上用IAP是圖什么?支付寶和微信支付有這么多用戶基數(shù),接入也很方便,費(fèi)用比IAP便宜多了。如果你有接入android IAP經(jīng)驗(yàn),期待分享。
相關(guān)閱讀
支付系統(tǒng)設(shè)計(jì):支付系統(tǒng)的賬戶模型(一)
支付系統(tǒng)設(shè)計(jì):對(duì)賬處理(二)
支付系統(tǒng)設(shè)計(jì):銀行卡支付(三)
支付系統(tǒng)設(shè)計(jì):綁卡、簽約和身份驗(yàn)證(四)
作者:鳳凰牌老熊,程序員 & 架構(gòu)師,來(lái)自中科大的本科,研究生在軟件所學(xué)習(xí)。先后在中科輔龍、三星(中國(guó))研究院和國(guó)內(nèi)一些大型的互聯(lián)網(wǎng)公司呆過(guò)。在中科輔龍公司負(fù)責(zé)電子政務(wù)內(nèi)容管理系統(tǒng)建設(shè),負(fù)責(zé)研發(fā)龍馭系列產(chǎn)品的研發(fā),這款產(chǎn)品最終實(shí)施到2000多個(gè)電子政務(wù)網(wǎng)站上,期間也參與了一些支付反洗錢(qián)以及支付系統(tǒng)的建設(shè)。之后在三星中國(guó)研究院,負(fù)責(zé)自然語(yǔ)言處理(NLP)以及智能家居相關(guān)項(xiàng)目。智能家居項(xiàng)目在2014CES消費(fèi)電子展上作為三星重點(diǎn)項(xiàng)目推介。2014年開(kāi)始加入愛(ài)奇藝公司,負(fù)責(zé)數(shù)據(jù)倉(cāng)庫(kù)和支付系統(tǒng)的建設(shè)。
本文由@鳳凰牌老熊(微信公眾號(hào):shamphone) 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理 。未經(jīng)許可,禁止轉(zhuǎn)載。
有徒弟不,微信:wwwwcwdsj
感謝~
有幫助,謝謝
連續(xù)這么多篇,作者辛苦了 寫(xiě)的很專(zhuān)業(yè)