蘋果內購(IAP)測試

1. 蘋果內購(IAP)簡介

IAP 全稱In-AppPurchase,是指蘋果 App Store 的應用內購買,是蘋果爲 App 內購買虛擬商品或服務提供的一套交易系統。web

蘋果規定:適用範圍內的虛擬商品或服務如遊戲道具、電子書、音樂、視頻、訂閱會員、App的高級功能等必須使用 IAP 進行購買支付,不容許使用支付寶、微信支付等其它第三方支付方式(包括Apple Pay),也不容許以任何方式(包括跳出App、提示文案等)引導用戶經過應用外部渠道購買。安全

iOS應用裏面用到了蘋果應用內付費(IAP)功能時,項目上線前必定要進行功能測試。服務器

2. IAP內購的實現

2.1  IAP內購的準備流程

App集成內購代碼以前須要先去開發帳號的 Itunes Connect 後臺填寫銀行帳戶信息、配置內購商品(包括產品ID、價格等),還須要配置沙盒帳號用於 IAP 測試。主要流程以下:微信

前提準備:1張visa銀行卡,appid,1張銀行卡(與蘋果三七分打錢用)網絡

1)協議、稅務和銀行業務併發

聯繫人信息:(appid帳號人)姓名,郵箱,電話號碼,地址(城市、具體街道分行app

寫);框架

visa銀行卡信息:開戶行,開戶行所在地址,開戶行的郵政編碼,開戶行持有人卡號,開戶行持有人姓名;測試

稅務信息:微信支付

1.會問你是否是美國居民選擇NO;

2.有沒有在美國從事商業性活動,選擇NO;

3.以後填寫我的或組織名稱,所在國家,受益方式(獨立開發者選擇我的),居住地址,郵寄地址,聲明人,頭銜;

2)內購產品id的配置 (開發人員配置)

若是是金幣或其它消耗品的產品的話用消耗性型項目,參考名稱(內購項目,好比金幣100),產品id,訂價信息,使用內購的快照,顯示名稱,描述;

3)用戶職能

測試員:添加沙盒測試員及沙盒帳號,沙盒測試帳號不能是正常使用的appid帳號,直接使用一個沒有註冊過的郵箱帳號便可。沙盒帳號申請時須要注意:開發者帳號、證書、bundleID要一致;

姓名,測試帳號密碼,appstore地區(必須填對)。

蘋果IAP內購的準備是由開發同窗在開發代碼前去配置的,具體步驟感興趣的同窗能夠自行搜索瞭解。這裏只說明大體步驟,不作詳細展開。

2.2  IAP內購的開發實現流程

在配置完內購信息後,接下來是APP代碼的開發,iOS APP內購經過StoreKit框架使應用程序鏈接到App Store,以提示並安全地處理付款。 IAP開發實現流程以下:

1)APP得到一份可購買商品列表(全部的付費Product ID列表,這個能夠用常量存儲到本地,也能夠向本身的服務端Server發送請求獲取)。

2)APP經過該內購項目ProductID向AppStore查詢,得到購買商品的信息。AppStore返回商品信息,在APP頁面展現。

3)用戶在客戶端選擇某個要購買的商品,向AppStore發起購買請求,蘋果服務器建立訂單並進行支付處理。

4)客戶端添加監聽,等待App Store處理交易結果的回調。

5)服務端返回交易結果的憑證,客戶端刪除監聽,並將存儲交易憑證到本地沙盒中(考慮到網路異常狀況,iOS端的發送憑證操做應該能夠持久化,若是程序退出、崩潰或者網絡異常,能夠恢復重試)。

6)交易完成,客戶端會將交易憑證上傳到服務器Server,Server將該憑證發送到蘋果的服務器驗證支付信息是否都正確,並將返回結果返回給APP。

7)驗證完成後,客戶端刪除本地交易憑證,併發放用戶購買的虛擬商品。

3. IAP內購的測試方法

3.1 沙盒測試帳號及使用

iOS應用裏面的蘋果應用內付費(IAP)功能,在項目上線前是必定要進行功能測試的,然而測試支付時的錢怎麼處理呢?蘋果提供了沙盒帳號的方式,沙盒帳號就是個虛擬的AppleID,如2.1中介紹的,在開發者帳號後臺的iTune Connect上配置了以後,就能使用沙盒帳號測試內購,付款只是虛擬付款,任你買買買,可是注意這個虛擬AppleID只有進行內購測試的功能。

沙盒帳號的使用流程:

1)在真機iPhone上安裝測試包(必須是adhoc簽名證書或者develop簽名證書打的包,不能是從App Store上下載的);

2)退出iPhone的App Store帳號(因後面須要使用沙盒帳號登陸):設置--iTunes Store與App Store--選中AppleID--註銷;

這裏只須要退出帳號,退出以後,不須要在這裏登陸沙盒帳號,沙盒帳號在這裏也沒法登陸,由於它是一個假的AppleID帳號,不能直接登陸的。

        3)在測試包裏面購買商品,系統會讓你進行登陸,這裏咱們點擊「使用現有的AppleID」就能夠輸入剛纔建立好的沙盒測試帳號進行登陸。

        4)輸入帳號密碼以後,而後就能夠購買商品了,沙盒測試環境返回會標註Environment:Sandbox,如圖所示。

3.2 沙盒測試注意事項

1)肯定配置環節正確,不然獲取不到正確的商品信息。

2)肯定當前運行的App的Bundle ID和後臺配置的App的Bundle ID是一致的。

3)內購必須用真機測試,虛擬機不行。

4)測試時必須退出App Store本身的Apple ID,登陸沙盒的測試Apple ID。

以上介紹了使用沙盒帳號進行iOS內購的測試方法,下面介紹內購測試的基本點和須要注意的坑。

4. IAP內購功能測試

4.1 內購功能測試點

       如下列舉了小編在IAP內購功能測試中考慮到的點,根據項目不一樣可能略有差別,若有未考慮到的歡迎你們留言補充:

1)選擇APP內不一樣的商品,商品名稱、價格等信息顯示正確,且都能正常購買;
2)同一商品屢次購買,或者一次購買多個,購買正常且商品發放正常;
3)商品價格顯示和扣款是否一致: 商品有/無優惠活動時,價格顯示和扣款是否正確及一致;
4)密碼輸入錯誤或指紋錄入錯誤,是否會有對應提示; 屢次輸錯後,是否會禁止購買等;
5)不一樣網絡條件下,及各網絡條件之間切換,是否正常購買: WiFi、4G、3G、2G、斷網等;
6)支付過程當中,進行各類操做,測試購買是否正常: 切換網絡、斷網、打電話、APP退到後臺再回來、切換到其餘APP、殺掉APP重啓、刪除APP、關機等;
7)不一樣購買階段,取消購買、取消後從新購買,功能正常;
8)商品購買成功後切換帳號,商品發放不會錯亂;
9)多設備、多端(iOS和安卓端)或多平臺(移動端、web端、PC端)登陸同一帳號,購買成功後,商品發放是否正常同步;
10)支付結果: 支付成功、支付失敗、支付超時,客戶端的扣款、及頁面跳轉等是否正常;
11)商品購買後,可以正常使用。 若是商品有有效期,須要測試有效期是否正確、商品過時後的處理等;
12)加密處理: 客戶端對內購支付中各個請求的加密處理,是否會被抓包、截單等。
13)根據商品實際購買狀況,考慮是否須要壓力測試;
14)驗證蘋果服務器返回錯誤碼客戶端的處理:
21000 App Store沒法讀取你提供的JSON數據
21002 收據數據不符合格式
21003 收據沒法被驗證
21004 你提供的共享密鑰和帳戶的共享密鑰不一致
21005 收據服務器當前不可用
21006 收據是有效的,但訂閱服務已通過期。 當收到這個信息時,解碼後的收據信息也包含在返回內容中
21007 收據信息是測試用(sandbox),但卻被髮送到產品環境中驗證
21008 收據信息是產品環境中使用,但卻被髮送到測試環境中驗證
除了以上基本功能點的測試外,還須要考慮開發實現流程中可能存在的坑,避免各類狀況如丟單、刷單等形成的經濟損失。
4.2 可能存在的坑以及客戶端的處理:

1)延遲返回支付結果

在上述IAP支付流程中,因爲網絡問題等種種緣由,即便用戶已經付款成功客戶端也可能一時半會收不到蘋果API的支付成功通知,也沒法主動向蘋果API請求查詢支付狀態,只能被動等待通知。所以有些狀況下,客戶端會延遲收到支成功的通知(多是過了幾分鐘,也有多是下次打開App的時候)。

 針對這種狀況,須要在每次蘋果通知到客戶端有未完成訂單的同時,客戶端須要及時把相關憑證等信息給到服務器。

2)服務端校驗延遲

在上述支付憑據校驗過程當中,由於網絡問題等各類緣由,客戶端可能沒法及時收到服務端的校驗成功的通知。

相似的,這種狀況須要客戶端本地持續向服務器輪詢校驗結果,直到返回明確的校驗成功或校驗無效的結果。

3)非官方渠道包支付失敗問題

在上述流程步驟中,若是用戶安裝的App不是App Store官方渠道包(從PP助手等第三方應用商店下載),蘋果API會直接返回product id不存在並結束支付流程。

4)丟單

場景1:用戶輸入完 Apple ID 密碼或者驗證完指紋支付成功以後,網絡忽然中斷致使 IAP 沒有收到支付成功的通知,App 就沒法在支付隊列的代理方法中獲取支付成功的通知,後續的發放內購商品也就不可能了;

場景2: App 在代理方法裏收到了支付成功的通知,可是 App 上傳交易收據到咱們服務器去查詢的時候若是查詢失敗,那麼服務器就沒法發放內購商品;

場景3:IAP 通知代理方法交易成功,可是沙盒裏面取收據的時候發現爲空,或者當前支付成功的訂單並無寫入沙盒的收據,致使上傳到服務器的收據查詢不到結果;

針對以上出現的丟單狀況,都是由於交易訂單支付成功了,可是沒有完成服務器驗證收據,因此咱們很是有必要持久化訂單信息。客戶端處理方法以下:用戶支付成功以後,用 UserDefault 把該交易的交易標識(transactionIdentifier)和交易訂單做爲字典的鍵值保存在沙盒內,而後把訂單號和支付收據發送給服務器去驗證,服務器返回驗證結果以後,刪除 UserDefault 中的訂單信息,而且完成該筆IAP交易(transaction),若是在服務器返回驗證結果以前出現異常(用戶殺掉App、手機關機了,App崩潰等)訂單信息便不會從UserDefault中刪除,該筆IAP交易也不會被完成,App從新啓動以後,從新監聽支付隊列的時候,能夠從新獲取到該筆交易(transaction),而後根據該筆交易(transaction)的交易標識(transactionIdentifier)找到 UserDefault 中對應的咱們本身的訂單號,從新把訂單號和交易收據發送給後臺服務器驗證。

4)越獄設備

越獄設備在安裝某些內購破解插件後,也會致使沒法進行內購(返回product id不存在)。

針對這個問題的解決辦法是:當返回product id不存在時,提示用戶安裝的多是非官方渠道包,引導用戶到AppStore下載官方渠道包。

本文分享自微信公衆號 - 搜狗測試(SogouQA)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索