2012-07-14 26 views
3

這是一個很痛苦的話題,在堆棧上已經討論過很多次,但是,我閱讀的所有帖子和我嘗試過的東西,我都無法使用PHP工作來獲得IAP驗證,如果我知道爲什麼會被詛咒。PHP中的iOS收據驗證

這是我得到的收據在iOS:

purchaseReceipt = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding]; 

我把它送給我的PHP腳本,它編碼,並將其發送到服務器:

$receipt = base64_encode($_POST["rcpt"]); 
$postData = json_encode(
    array('receipt-data' => $receipt) 
); 

$ch = curl_init($endpoint); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 

$response = curl_exec($ch); 
$errno = curl_errno($ch); 
$errmsg = curl_error($ch); 
curl_close($ch); 

這個問題我會變得相當莫名其妙。所有測試的收據返回無效狀態-42352。是的,我正在把他們送到適當的環境。收據JSON似乎編碼正確,因爲如果在編碼後對$收據進行任何更改,則腳本將返回錯誤21002(收據數據屬性中的數據格式錯誤)。所以它看起來像一個真正的壞收據,這是不可能的,因爲它來自我在沙盒上的購買。

我很感激任何幫助,因爲我沒有想法。

這裏是$ _ POST值[「RCPT」]從沙盒製成例如購買:

{ 
    "signature" = "Aqi3Y/UKAYEJUqtFxjRx0DDQ1BV7W/3VtLpVq/l85SIxGXTJOF9WrlBVryQTVgWvUWY6poJVpWQjXrgoSQEjGapN4RmaBChWmHNUgyBy03HKzZ5gQupfHxvxK I3xRaoqyb0jJC4VOmTavU46LqjDfqNuMQvwdT9Y57zoIplBylVAAADVzCCA1MwggI7oAMCAQICCGUUkU3ZWAS1MA0GCSqGSIb3DQEBBQUAMH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAwwqQXBwbGUgaVR1bmVzIFN0b3JlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA5MDYxNTIyMDU1NloXDTE0MDYxNDIyMDU1NlowZDEjMCEGA1UEAwwaUHVyY2hhc2VSZWNlaXB0Q2VydGlmaWNhdGUxGzAZBgNVBAsMEkFwcGxlIGlUdW5lcyBTdG9yZTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMrRjF2ct4IrSdiTChaI0g8pwv/cmHs8p/RwV/rt/91XKVhNl4XIBimKjQQNfgHsDs6yju DrKJE7uKsphMddKYfFE5rGXsAdBEjBwRIxexTevx3HLEFGAt1moKx509dhxtiIdDgJv2YaVs49B0uJvNdy6SMqNNLHsDLzDS9oZHAgMBAAGjcjBwMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUNh3o4p2C0gEYtTJrDtdDC5FYQzowDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBSpg4PyGUjFPhJXCBTMzaN mV8k9TAQBgoqhkiG92NkBgUBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAEaSbPjtmN4C/IB3QEpK32RxacCDXdVXAeVReS5FaZxc t88pQP93BiAxvdW/3eTSMGY5FbeAYL3etqP5gm8wrFojX0ikyVRStQ /AQ0KEjtqB07kLs9QUe8czR8UGfdM1EumV/UgvDd4NwNYxLQMg4WTQfgkQQVy8GXZwVHgbE/UC6Y7053pGXBk51NPM3woxhd3gSRLvXj loHsStcTEqe9pBDpmG5 sk4tw GK3GMeEN5/ e1QT9np/Kl1nj aBw7C0xsy0bFnaAd1cSS6xdory/CUvM6gtKsmnOOdqTesbp0bs8sn6Wqs0C9dgcxRHuOMZ2tm8npLUm7argOSzQ=="; 
    "purchase-info" = "ewoJIm9yaWdpbmFsLXB1cmNoYXNlLWRhdGUtcHN0IiA9ICIyMDEyLTA3LTE0IDA2OjAyOjQ4IEFtZXJpY2EvTG9zX0FuZ2VsZXMiOwoJIm9yaWdpbmFsLXRyYW5zYWN0aW9uLWlkIiA9ICIxMDAwMDAwMDUyODIxNzk1IjsKCSJidnJzIiA9ICIxLjIuMCI7CgkidHJhbnNhY3Rpb24taWQiID0gIjEwMDAwMDAwNTI4MjE3OTUiOwoJInF1YW50aXR5IiA9ICIxIjsKCSJvcmlnaW5hbC1wdXJjaGFzZS1kYXRlLW1zIiA9ICIxMzQyMjcwOTY4Njg1IjsKCSJwcm9kdWN0LWlkIiA9ICJjb20uZHJhZ29ubG9yZHNtb2JpbGUuVDFfMzBjb2lucyI7CgkiaXRlbS1pZCIgPSAiNDUzMDEzMDUzIjsKCSJiaWQiID0gImNvbS5kcmFnb25sb3Jkc21vYmlsZS5kcmFnb25sb3JkcyI7CgkicHVyY2hhc2UtZGF0ZS1tcyIgPSAiMTM0MjI3MDk2ODY4NSI7CgkicHVyY2hhc2UtZGF0ZSIgPSAiMjAxMi0wNy0xNCAxMzowMjo0OCBFdGMvR01UIjsKCSJwdXJjaGFzZS1kYXRlLXBzdCIgPSAiMjAxMi0wNy0xNCAwNjowMjo0OCBBbWVyaWNhL0xvc19BbmdlbGVzIjsKCSJvcmlnaW5hbC1wdXJjaGFzZS1kYXRlIiA9ICIyMDEyLTA3LTE0IDEzOjAyOjQ4IEV0Yy9HTVQiOwp9"; 
    "environment" = "Sandbox"; 
    "pod" = "100"; 
    "signing-status" = "0"; 
} 
+0

$ _POST [「rcpt」]在base64'd之前的值是多少? – craig1231 2012-07-14 15:42:41

+0

看起來像這樣:{ \t「signature」=「Aj1zPe(...許多字符...)gcxRHuOMZ2tm8npLUm7argOSzQ ==」; \t「purchase-info」=「ewoJIm9yaWdpbmFsLXB1cmN(...批次字符...)tZXJpY2EvTG9zX0FuZ2VsZXMiOwp9」; \t「pod」=「6」; \t「signing-status」=「0」; } – AragornSG 2012-07-14 15:47:36

+0

好的,你可以編輯你的帖子來顯示$ _POST [「rcpt」]的完整var_dump嗎? – craig1231 2012-07-14 15:49:45

回答

1

你試過把它發送到服務器之前編碼的收據?

Base64 iOS sample code

字符數,如+分別被解釋爲一個空間炭。

+0

事實上,在iOS端編碼或解析服務器上的JSON方是解決方案。謝謝! – AragornSG 2012-07-14 21:59:23

+0

@AragornSG你能更具體地說明你的意思嗎?「解析服務器端的JSON」?似乎奇怪的是,在客戶端而不是後端上執行base64編碼會有所作爲。 – 2013-12-10 22:18:51