2011-02-28 92 views
2

下面是用於驗證收到的樣本PHP代碼:在應用程序內購買,後端PHP和iTunes的響應問題

public static function getReceiptData($receipt, $isSandbox = false) { 
    if ($isSandbox) 
     $endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt'; 
    else 
     $endpoint = 'https://buy.itunes.apple.com/verifyReceipt'; 
    $postData = "{\"receipt-data\":\"". base64_encode($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); 
    if ($errno != 0) { 
     throw new sfException('connection_to_itunes_error', $errno); 
    } 
    // FIXME 
    mail('my_mail', 'Invalid Itunes Receipt', var_export($data, true) . "\n" . $postData); 
    $data = json_decode($response); 
    if (!is_object($data)) { 
     throw new sfException('invalid_response_data'); 

    if (!isset($data->status) || $data->status != 0) 
     throw new sfException('invalid_receipt'); 
    return $data; 
} 

那麼簡單。

但我總是從iTunes中得到異常: 我嘗試了很多$ postData字符串的組合,但它沒有幫助。

有從iTunes例外: java.lang.ClassCastException: java.lang.String cannot be cast to com.webobjects.foundation.NSDictionary{"receipt-data":"MTAwMDAwMDAwMTU1MjM1Ng=="}

java.lang.NullPointerException"{"receipt-data":"MTAwMDAwMDAwMTU1MjM1Ng=="}"

等等奇怪的錯誤 '<html><head><title>Error</title></head><body>Your request produced an error. <BR>[newNullResponse]</body></html>'字符串"{\"receipt-data\":\"MTAwMDAwMDAwMTU1MjM1Ng==\"}"

你能提供的recipt驗證工作JSON字符串?

+0

類似的問題:http://stackoverflow.com/questions/4715414 /蘋果應用程序內購買,驗證收據 – 2011-02-28 21:59:12

回答

1

您的後端看起來像是正確的。請檢查iPhone的代碼來發送原始交易收據爲十六進制字符串:

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

順便說一句,你的腳本也應該沒有base64_encode工作了收據串