支付系統設計:應用內支付(五)

2021-01-07 雷鋒網

為什麼要IAP

相對來說,應用內支付的用戶體驗,和微信支付、支付寶相比,還是有一定差距的,但是為什麼要開發應用內支付呢? 這個和蘋果的AppStore的審核政策有關。在官方的 (App Store Review Guidelines) 中, 有如下幾條意見:

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 內使用非IAP的系統來購買內容、功能或服務將被拒絕。

11.3 Apps using IAP to purchase physical goods or goods and services used outside of the App will be rejected.

IAP 購買實物或者應用外的商品或服務將會被拒絕;

11.4 Apps that use IAP to purchase credits or other currencies must consume those credits within the App.

通過 IAP 購買的積分或者其他貨幣必須只在App內使用。

這問題就來了,如果要購買的服務,即在IOS內使用,也在Android等IOS系統外使用,那應該是使用規則11.2或者規則11.3來執行? 比如說視頻網站,視頻既可以在IOS上看,也可以在Android上看,那是否是需要通過IAP來購買?蘋果公司在這一點上採取模糊的策略。愛奇藝、騰訊視頻,在IOS上購買會員,只能用IAP支付。這就和蘋果公司的審核有關。

IAP支付流程

一般IAP支付的開發流程,首先需要一些準備工作,包括:

在developer.apple.com上配置一個App ID,使用該ID生成和安裝相應的Provisioning Profile文件。

登錄到iTunes Connect,使用App ID創建一個新的應用,在該應用中,創建應用內付費項目,設置好價格和Product ID以及購買介紹和截圖。

添加一個用於在sandbox付費的測試用戶,填寫相關的稅務,銀行,聯繫人信息。

完成這些準備工作後,既可以進入正式的開發,開發代碼我們這裡就不說了,流程如下:

用戶選擇要購買的內容並點擊購買按鈕;

用戶通過App Store帳戶驗證

蘋果伺服器驗證用戶請求

蘋果伺服器從用戶帳號扣款

蘋果向用戶返回購買成功信息

軟體接收並顯示用戶購買信息

老司機都能看出來,這裡有好多好多的坑。

用戶訪問AppStore時使用的是Apple的帳號,不是應用系統的帳號。也就是說,我們並不知道到底是誰在購買這個內容。比如在應用中有兩個帳號A和B,用A帳號登錄後,上IAP買了東西,然後用B帳號來登錄,也上IAP買東西, 這兩次購買,用的是同一個Apple帳號。蘋果也不會告訴你,到底是哪個帳號付了錢。帳號坑在單次購買中還沒什麼問題,但碰到訂閱的情況,得好好處理下。從上述流程可以看出,蘋果伺服器都是和客戶端打交道的,這裡面似乎沒有應用伺服器什麼事情。只有在客戶端接收到蘋果返回信息後,才可以把這個信息轉發給應用伺服器。如果用戶一直不打開手機上的應用,那應用伺服器就一直收不到通知了。好在後來蘋果提供了一個驗證功能,應用伺服器可以把接收到的返回信息(加密後的字符串)發送給蘋果伺服器來驗證和解密。

IAP訂閱

IAP Subscription又是一個大坑。官方的文檔在這裡。內容不多,沒有說明的東西卻很多。

續費周期的計算

IAP主要提供給周期性訂閱的音樂、電子書等內容使用。 一般就按月來計算周期。蘋果是以自然月來算權益周期。比如在1月3號買了權益,到2月3號,這個權益就過期啦,需要在此之前完成續費。 那問題來了,1月31號買的權益,到幾號過期?以自然月算,這個權益會在3月1日前到期,如果2月份,3月份都續費了,到4月份,也是享受到4月30日了。

自動續費

應用開發應該不需要關心續費的細節。蘋果會做自動處理。在權益到期前10天,蘋果檢查用戶帳戶是否可以扣款,商品價格是否有變動。在權益到期前24小時,蘋果開始扣款,如果失敗,會多次重試,直到成功。問題來了,這個重試,會延續到用戶權益過期後一小段時間,蘋果沒有說這段時間該算是有權益還是沒有,但開發人員需要注意應該如何處理。

免費試用

免費試用不是強制需求,但這有利於用戶判斷是否值得購買這個物品。免費試用期是在itunes connect中設置。 當用戶第一次購買這個東西的時候, 客戶端接收到的Receipt中包含免費試用信息。在免費期快到的時候,蘋果發起第一次扣款。整個過程和自動續費類似,唯一區別是第一個月是免費的。

Receipt 驗證

客戶端接收到 Receipt 之後,需要提交到伺服器端進行處理,開通權益。 這就來了個問題:Receipt應該在客戶端還是伺服器端解析?當然需要在伺服器端處理,這樣可以防止越獄後的一些插件,如IAP Cracker、IAP Free等偽造交易憑證,欺騙蘋果伺服器,開通權益。 此外,還需注意,客戶端和伺服器端之間需通過HTTPS以及參數籤名等方式來確保通訊安全。 伺服器端接收到Receipt之後,首先驗證請求的有效性, 然後將Receipt發送到蘋果伺服器上進行驗證和解析。 接收到蘋果處理結果後, 將Receipt中的user_id, product_id、purchase_date、transaction_id等做驗證和處理。

IAP破解和防禦

既然Iap的驗證主要是在蘋果伺服器端和手機客戶端進行,並且是使用域名。這簡直是為攻擊打開了一扇大門,而不僅僅是漏洞。早期的IAP內購解鎖工具IAP cracker對IAP的破解比較簡單粗暴。寫過IAP程序的人都知道, 程序中基本都是用transactionState來判斷交易是否成功。

transactionState 有四個狀態:

SKPaymentTransactionStatePurchasing

SKPaymentTransactionStatePurchased

SKPaymentTransactionStateFailed

SKPaymentTransactionStateRestored

SKPaymentTransactionStatePurchased 表示購買成功了。只要修改這個變量值,如果客戶端應用直接根據交易狀態來處理業務流程,那就會收到這個假的交易成功信息,接下來用戶就能不花錢得到所買的物品。這個過程,甚至都不需要接入網絡。

另一個工具IAPfree功能更強大,安裝使用也複雜很多。它是通過修改DNS,讓客戶端訪問黑客提供的伺服器來取代訪問蘋果伺服器,實現所謂的MITM中間人攻擊。當用戶在客戶端觸發購買流程時,會被引導到偽裝的蘋果伺服器上,不扣款而直接返回扣款成功收據。用戶不需要支付任何資金,客戶端能夠拿到完整的收據。如果是在客戶端處理收據驗證也沒有任何問題。為了避免用戶所使用的設備被封,這些軟體甚至可以提供偽造UDID的功能。為此,蘋果特別說明,一定要在伺服器端驗證用戶購買信息,驗證內容包括收據籤名,證書,產家信息等,確保收據無誤後,才能授予權益。如果發現有詐,則將用戶拉黑。

兩套帳戶體系

蘋果支付的帳戶體系,當然是以apple id為基礎的,它允許用戶在多臺設備上共用一個帳戶。一臺設備上,一般只有一個激活帳戶。但對應用系統來說,大部分是允許多個帳號登陸的。這對續費來說就是個大問題。用戶以帳戶a登錄後,發起續費,獲得權益。然後以帳號B登錄了,顯然,A的權益不會衍生給B。過幾天A開始續費了,續費之後,切換到B帳號登錄,客戶端在B帳號登錄時得到續費的收據並發送給應用伺服器。那這算是誰的續費請求?當然是A的。在這個apple id發起的續費請求,所有的收據都會有一個相同的原始交易號original transaction Id。在用戶發起訂閱時,需要記錄這個id和帳號的關係,每次續費,需要在解析收據後,根據原始交易號從這裡獲取真正的充值帳戶,不能從客戶端提交的用戶id作為憑據。

還是這個坑,如果在帳戶b登錄後也發起訂閱請求,會怎麼樣?這個調用將會失敗,所以需要阻止用戶發起這樣的請求,或者設置多個產品副本來讓用戶購買。

分成,定價和國際化

在iTunes中的給的產品定價必須是稅前的,蘋果和商家的分成,也是按稅前算。商家給出在一個主要銷售國家和地區(比如國內的基本就是中國了)的價格,即基準價格。在其他地區的銷售價格,蘋果會自動根據當前的匯率來換算成當地的貨幣。當然,也可以自己修改設定在這些國家或者地區的當地價格。目前是支持到155個國家。還要特別注意版權問題。

基準價格調整,如果是往高了調整, 則在用戶下一次續費時,需要用戶確認。如果往低了調,那就不需要用戶確認,直接扣款了。

蘋果對商家的產品價格體系有分組(Group)的概念,同國內說的價格體系,比如白金會員、黃金會員、貴賓等,在同一個Group裡面,用戶只能選擇一個檔,比如用戶要麼是白金要麼是黃金會員,不會同時是。

在同一個分組中,如果用戶訂閱時間超過一年(365天),則商家可以得到來自這個用戶收益的更多的分成,目前是85%。這個訂閱時間不包括免費試用期。 同時可以有60天的寬限。也就是說,這一年中,如果用戶曾經停止續費,然後又開始繼續續費,只要中間不續費的時間不超過60天就行。

更多的坑

目前用的是IOS 10.0 版本, 這個版本和IAP有關的坑,先記錄下:

沙盒環境,沒法做取消訂閱操作。 只能在線上模擬。 所以產品設計和開發時,儘量不要依賴取消訂閱操作,也應該不依賴於這個操作。

沙盒環境下,有些receipt可能會收不到transaction id,線上的暫未發現這個問題。

蘋果提供單個收據和列表收據兩種格式。推薦使用列表數據,但問題是,這個列表收據的長度,蘋果也不知道最多會有多少。

Android IAP

好吧,用這個話題作總結,不是太好。IOS上用蘋果支付是被逼的,android上用IAP是圖什麼?支付寶和微信支付有這麼多用戶基數,接入也很方便,費用比IAP便宜多了。如果你有接入android IAP經驗,期待分享。

相關閱讀

支付系統設計:支付系統的帳戶模型(一)

支付系統設計:對帳處理(二)

支付系統設計:銀行卡支付(三)

支付系統設計:綁卡、籤約和身份驗證(四)

雷鋒網(公眾號:雷鋒網)註:本文由人人都是產品經理社區作者@鳳凰牌老熊(微信公眾號:shamphone)原創發布。鳳凰牌老熊,程式設計師 & 架構師。先後在中科輔龍、三星(中國)研究院和國內一些大型的網際網路公司工作過。2014年加入愛奇藝,負責數據倉庫和支付系統的建設。文章未經許可,不得轉載。

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 支付系統設計:對帳處理(二)
    可以說,對帳是支付系統最頭疼的事情。每一筆交易,都要做到各參與者的記錄能夠吻合,沒有偏差。對帳系統的工作,是發現有差異的記錄,即軋帳;然後通過人工或者自動的方式,解決這些差異,即平帳。連結超時指在伺服器出現問題時,連接在指定時間內獲取不到數據即自動斷開。這個很容易被忽略。我們有一次系統出問題,是渠道側的FTP假死後重啟,導致我們的客戶端掛住,一直在等待重新連結。渠道對帳單標準化找個例子大家看看, 比如微信的對帳單,他是csv格式的,包括如下信息:交易時間:這是在微信側的支付完成的時間。
  • 支付系統設計:對帳處理二
    連結超時指在伺服器出現問題時,連接在指定時間內獲取不到數據即自動斷開。這個很容易被忽略。我們有一次系統出問題,是渠道側的FTP假死後重啟,導致我們的客戶端掛住,一直在等待重新連結。渠道對帳單標準化找個例子大家看看, 比如微信的對帳單,他是csv格式的,包括如下信息:交易時間:這是在微信側的支付完成的時間。 這個時間會成為一個陷阱。
  • 異步處理在支付環節的應用
    本文主要向初步接觸支付業務的讀者簡要普及同步與異步處理的基本概念、關於異步處理在支付環節的應用、支付系統向商戶通知支付結果時,為什麼要使用「異步通知」?異步處理方式在支付環節可能會產生的哪些問題?在產品設計上如何避免這些問題的發生?
  • 基於分布式帳本技術的跨境支付系統應用
    這種層級代理結算方式客觀上存在支付周期較長、資金佔用較多、支付費用高、安全性低等問題,亟需引入新技術進行升級改造。分布式帳本技術及其在跨境支付領域的應用分析分布式帳本是一種在網絡成員之間共享、複製和同步的資料庫。
  • 支付系統高可用架構設計實戰
    為此,對應用可用性程度的衡量標準一般有3個9到5個9。 對於一個功能和數據量不斷增加的應用,要保持比較高的可用性並非易事。為了實現高可用,宜信支付系統從避免單點故障、保證應用自身的高可用、解決交易量增長等方面做了許多探索和實踐。
  • 如何設計一套支付系統-對帳模塊
    整個支付系統可以被拆分成了多個子系統,如交易系統、帳戶系統、會計系統、帳戶系統,每個子系統在處理各自的業務並記錄,其實就相當於會記理論中的帳簿。系統間的對帳,主要用於修正內部系統的數據不一致。3)帳實核對:是各項資產物資的記錄數值與實際真實數額間的核對。
  • 跨行支付時用什麼支付清算系統?大小額支付系統又是什麼?
    隨後在1990年,中國人民銀行清算中心建成,專門為金融機構提供支付清算服務。這個清算中心包括NPC和CCPC:2)全國電子聯行系統EIS投產1991年4月1日,基於金融衛星通訊網的應用系統——全國電子聯行系統(EIS)開始試運行。EIS是人民銀行專門用於處理異地(包括跨行和行內)資金清算和資金劃撥的系統。
  • 網際網路支付系統整體架構詳解
    支付系統架構整體設計每個公司根據其業務和公司發展的不同階段,所設計的支付系統也會有所不同。我們先看看網際網路公司的一些典型的支付系統架構。支付寶我們先看看業內最強的支付寶系統。架構圖如下:主要包括如下子系統:運維監控:支付系統在下運行過程中不可避免的會受到各種內部和外部的幹擾,光纖被挖斷、黑客攻擊、資料庫被誤刪、上線系統中有bug等等,運維人員必須在第一時間內對這些意外事件作出響應,又不能夠一天24小時盯著。這就需要一個運維監控系統來協助完成。日誌分析:日誌是支付系統統計分析、運維監控的重要依據。
  • 案例分析:H5支付交互體驗設計
    購物用淘寶下單,餓了在美團點外賣,出行滴滴一下……這些關聯衣食住行的應用,都離不開一個核心環節:線上支付。手機支付通常可以細分為兩種場景:「手機APP應用中集成支付功能」、「手機網頁應用中集成支付功能」。本文以支付寶和微信支付舉例分析「手機網頁應用(以下簡稱H5)進行支付的交互體驗設計」。
  • Uber下一代支付平臺的系統架構設計
    我們將部署大致分為以下幾個部分:團隊內服務部署以同步系統訂單數據模型有一個屬性RolloutData,該屬性在整個付款流中傳遞,我們使用它來決定在新的支付系統中是否有任何付款人或收款人是主要的。RolloutData的結構如下所示:
  • OMP新支付落地應用的先驅者助力國際支付走上新臺階
    法幣的誕生,改變了價值流通;BTC的誕生,改變了支付方式;OMP的誕生,改變了支付空間;世界經濟,就此被OMP改變! 數字資產價值體現,從OMP開始!OMP生態建設基於以太坊去中心化、智能合約技術,建設支付系統應用全球性,其應用包括直營+聯營B2B、B2C商城平臺、直播線上消費、籤約商家線下消費、平臺生活類繳費。
  • 支付核心系統設計:Airbnb的分布式事務方案簡介
    導讀:微服務架構下的支付系統,由於其需要在性能和一致性之間做很多權衡,帶來設計和實現的複雜性。
  • 什麼是聚合支付?聚合支付系統需要哪些功能?
    所以無論大企業小企業,只需要企業碼籤約網頁支付、掛應用等等之後都能實現原生支付。除了這類官方支付之外,剩下的就是咱們今天介紹的聚合支付了。什麼是聚合支付?聚合支付其實是對第三方支付平臺服務的拓展。第三方支付(比如微信、支付寶等)介於銀行和商戶之間,而聚合支付是介於第三方支付和商戶之間,是連接著第三方支付機構和商戶的中間商。
  • 支付系統中,帳戶體系的設計與記帳處理
    帳戶體系和會計的設計是整個支付系統的底層基礎,是支付系統在基礎支付服務的基礎上,為個人用戶及企業商戶提供的對於資金收、付、管的服務。在明細科目中,根據需要設計二級科目、三級科目。其中,沒有下級的科目稱之為葉子科目。註:只有葉子科目下才可以開帳戶。
  • 「探索」統一支付平臺在醫院行動支付改革中的應用實踐
    2018年後,醫院為進一步拓展行動支付在醫療服務中的應用,上線了多個平臺的行動支付渠道,但在簡化收費流程的同時也帶來了新的問題。首先,財務方面單邊帳的情況頻繁出現,財務人員疲於應付對帳與退款;其次,因行動支付對帳系統的缺失,單筆退款的處理需要花費近20 min,效率低下,患者就醫體驗較差。
  • Paytomat數字貨幣支付系統帶給我們的借鑑意義
    Paytomat是烏克蘭和東歐地區首個落地的可使用數字貨幣支付的項目,其研發的POS機支付系統已經有超過150多家商店安裝使用,在線用戶數超過10000人次,同時計劃進入北美市場。在Paytomat的設計理念中,沒有像我們常見的區塊鏈項目那樣,首先去考慮去中心和免中介的問題。它的商業邏輯首先考慮的是如何在現有的商業模式中引進並有效使用區塊鏈技術,進而有效的解決加密貨幣的現實流通與使用。在這個應用場景裡,我們可以看到一些能夠引起我們反思和深入思考的問題。
  • 紐西蘭跨境聚合支付系統介紹
    大家好,我是今天的分享人Shedon,目前就職於紐西蘭一家POS Saas公司,高級工程師,主要負責POS支付集成開發。今天的分享主要是對之前工作的一家紐西蘭本地做跨境聚合支付產品和系統的介紹,謝謝大家。
  • 詳細解讀第二代支付系統的新特徵
    第二代支付系統是以清算帳戶管理系統為核心系統,大額支付系統、小額支付系統、支票影像交換系統、網上支付跨行清算系統等為業務系統,以支付管理信息系統為輔助支持系統的多應用多功能的支付系統。第二代支付系統上線運行首日,共處理大額、小額、網銀業務1083萬筆,金額12.3萬億。和第一代支付系統相比,第二代支付系統主要的新特徵如下。
  • 想要解決支付掉單問題?這有兩種系統設計方案
    編輯導語:在訂單支付的過程中,我們常常會遇到這樣的問題:明明付了錢,也扣了款,但是訂單卻並沒有成功。上文中,作者為我們分享了一次解決方案。在本篇文章中,作者又結合實際情況和案例,總結出了兩種系統設計方案。上次在文章《錢被扣走了,但是訂單卻未成功!
  • 挑戰蘋果支付!谷歌整合安卓支付和谷歌錢包正式成立谷歌支付
    這可以被看做是谷歌在行動支付領域正式與蘋果Apple Pay的抗衡之舉。今年1月,谷歌就宣布,將把旗下各種支付工具整合到Google Pay之下。到了2月20日,原來的Android Pay和Google Wallet支付應用程式正式被併入Google Pay,谷歌將開始全球推廣其新的支付系統。