一. 驗證
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 出來,然後請求蘋果伺服器即可