IAP 內購二次驗證(出現的問題21002及解決方案)

不覺夢迴發表於2019-02-22

一. 驗證

1.完成購買後讀取本地的 receiptData 進行 base64 編碼,轉換成字串

//讀取
NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receiptData = [NSData dataWithContentsOfURL:receiptUrl];
NSString *receiptString = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
複製程式碼

2.傳送介面到蘋果伺服器進行驗證

  • 沙盒驗證 https://sandbox.itunes.apple.com/verifyReceipt
  • 正式環境 https://buy.itunes.apple.com/verifyReceipt

請求體為 JSON字串 {"receipt-data":receiptString} (receiptString 就是第一步拿到的字串)

此處建議優先驗證線上伺服器,如果出現 21007 錯誤碼時,表明這是個沙盒環境的資料,然後進行沙盒環境的驗證即可。下面是可能出現的錯誤碼

錯誤碼

  • 21000 App Store無法讀取你提供的JSON資料
  • 21002 收據資料不符合格式
  • 21003 收據無法被驗證
  • 21004 你提供的共享金鑰和賬戶的共享金鑰不一致
  • 21005 收據伺服器當前不可用
  • 21006 收據是有效的,但訂閱服務已經過期。當收到這個資訊時,解碼後的收據資訊也包含在返回內容中
  • 21007 收據資訊是測試用(sandbox),但卻被髮送到產品環境中驗證
  • 21008 收據資訊是產品環境中使用,但卻被髮送到測試環境中驗證

如果進行伺服器驗證的話,將拿到的 receiptString 傳送給伺服器,由伺服器進行下一步的驗證。

樓主此處吃了一次虧。後端是PHP,百度上能搜出來的驗證程式碼,其實是有問題的,主要在於後臺拿到 receiptString 後,進行 JSON 字串的生成,如果PHP 直接使用 json_encode(**) 的話,會導致 receiptString 中出現的 \ 進行進一步的處理,變成 \\,從而導致驗證出現 21002 的錯誤。解決方案也很簡單,直接使用字串拼接一個 JSON 出來,然後請求蘋果伺服器即可

相關文章