IOS提交審核又被拒了,原因是IOS內購項目,購買時報錯21007。那么我們就來研究下原因。
一、被拒原因
在測試環境中,我們會連接蘋果的測試服務器(https://sandbox.itunes.apple.com/verifyReceipt)驗證,
但是當我們部署在線上的正式服務器中,我們會連接蘋果的正式服務器(https://buy.itunes.apple.com/verifyReceipt )驗證。
我們提交給蘋果審核的是正式版,我們以為蘋果審核時,我們應該連接蘋果的線上驗證服務器來驗證購買憑證。而實際上蘋果在審核App時,只會在sandbox環境購買,其產生的購買憑證,也只能連接蘋果的測試驗證服務器,但是審核的app又是連接的我們的線上服務器,所以我們這邊的服務器無法驗證通過IAP購買,造成我們app的又一次審核被拒。
蘋果反饋的狀態碼:
21000 App Store無法讀取你提供的JSON數據 21002 收據數據不符合格式 21003 收據無法被驗證 21004 你提供的共享密鑰和賬戶的共享密鑰不一致 21005 收據服務器當前不可用 21006 收據是有效的,但訂閱服務已經過期。當收到這個信息時,解碼后的收據信息也包含在返回內容中 21007 收據信息是測試用(sandbox),但卻被發送到產品環境中驗證 21008 收據信息是產品環境中使用,但卻被發送到測試環境中驗證
我們可以看到21007狀態碼的意思。所以我們需要改一下,根據是沙箱環境,還是正式環境來連接不同的蘋果服務器來驗證。
二、如何區分沙箱環境和正式環境
1、In-App Purchase 內購項目類型
在如何區分之前,我們先要區分一下app內購項目中的類型:
(1)消耗型項目:對於消耗型App內購買項目,用戶每次下載時都必須進行購買。一次性服務通常屬於消耗型項目,例如釣魚App 中的魚餌。
(2)非消耗型項目:對於非消耗型App內購買項目,用戶僅需要購買一次。不會過期或隨使用而減少的服務通常為非消耗型項目,例如游戲App 的新跑道。
(3)自動續訂訂閱:通過自動續訂訂閱,用戶可以購買指定時間期限內的更新和動態內容。除非用戶取消選擇,否則訂閱(例如雜志訂閱等)會自動續訂。
(4)免費訂閱:通過免費訂閱,開發者可以將免費訂閱內容放入“報刊雜志”。用戶注冊免費訂閱后,該訂閱內容將會出現在與該用戶Apple ID 關聯的所有設備上。請注意,免費訂閱不會過期,並且僅在支持報刊雜志功能的 App 中提供。
(5)非續訂訂閱:非續訂訂閱允許有時限性的營銷服務。對於 App 內購買項目中的限時訪問內容,就需使用非續訂訂閱。例如,導航App 中語音導航功能的一周訂閱,或者年度訂閱已存檔的視頻或音頻的在線目錄。
2、驗證環境
在sandbox中驗證receipt:https://sandbox.itunes.apple.com/verifyReceipt
在生產環境中驗證receipt:https://buy.itunes.apple.com/verifyReceipt
那么如何自動的識別收據是否是sandbox receipt呢? 識別沙盒環境下收據的方法有兩種:
(1)根據收據字段 environment = sandbox。
(2)根據收據驗證接口返回的狀態碼。 如果status=21007,則表示當前的收據為沙盒環境下收據, 再連接正式環境進行驗證。
注意:在verifyWithRetry方法中,首先向向真實環境驗證票據,如果是21007則向沙盒環境驗證;但是在消耗品類型的測試中,使用沙盒票據在真實環境中驗證票據得到返回碼:21002。所以下面代碼在真實環境運行時,沙盒測試消耗型商品得不到正確的驗證結果。
建議:
為保證審核的通過,需要在客戶端或server進行雙重驗證,即:先以線上交易驗證地址進行驗證,如果蘋果正式驗證服務器的返回驗證碼code為21007,則再一次連接沙盒測試服務器進行驗證即可。
在應用提審時,蘋果IAP提審驗證時是在沙盒環境的進行的,即:蘋果在審核App時,只會在sandbox環境購買,其產生的購買憑證,也只能連接蘋果的測試驗證服務器,如果沒有做雙驗證,需要特別注意此問題,否則會被拒。