2012-06-13 57 views
0

我目前正在尝试使用服务器端验证(在PHP中)使用AppStore验证我的应用内购买回执。在应用程序购买服务器验证

这里是我的代码:

// ViewController.m: 
NSString *receiptDataString = [[NSString alloc] initWithData:[transaction transactionReceipt] encoding:NSUTF8StringEncoding]; 
NSString *verificationDataString = [NSString stringWithFormat:@"receiptData=%@", receiptDataString]; 
NSData *verificationData = [NSData dataWithBytes:[verificationDataString UTF8String] length:[verificationDataString length]]; 

NSMutableURLRequest *verificationRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://update.csundm.de/inapp/verifyReceipt.php"]]; 
[verificationRequest setHTTPMethod:@"POST"]; 
[verificationRequest setHTTPBody:verificationData]; 

NSData *verificationResultData = [NSURLConnection sendSynchronousRequest:verificationRequest returningResponse:nil error:nil]; 
NSString *verificationResultString = [[NSString alloc] initWithData:verificationResultData encoding:NSUTF8StringEncoding]; 
NSLog(@"%@", verificationResultString); 

******************************************************** 

// verifyReceipt.php: 
$receiptData = $_POST["receiptData"]; 
$receiptDataEncoded = base64_encode($receiptData); 
$receiptJSONString = json_encode(Array("receipt-data" => $receiptDataEncoded)); 

$contextData = array ( 
         "method" => "POST", 
         "header" => "Connection: close\r\n". 
         "Content-Length: ".strlen($receiptJSONString)."\r\n", 
         "content" => $receiptJSONString); 
$context = stream_context_create (array ('https' => $contextData)); 
$result = file_get_contents ("https://sandbox.itunes.apple.com/verifyReceipt", false, $context); 

$jsonResult = json_decode($result); 
if ($jsonResult -> {"status"} != 0) { 
    echo "Receipt invalid: ".$result; 
} 
else { 
    echo "Receipt valid"; 
} 

不幸的是我得到»收据无效:{‘地位’:21000}«任何人能想象的问题可能是什么?我甚至无法在互联网上找到有关此错误代码的信息。我发现了一个错误说明,但他们表示这只适用于不可续订订阅。

非常感谢,用亲切的问候,朱利安

回答

0

从StoreKitGuide:

自动再生订阅

Status Code | Description 
21000 | The App Store could not read the JSON object you provided. 
+0

正如我已经在我的问题中写道:我知道它关于自动更新订阅。但我想知道与他人的问题。为什么它不会读取我的JSON对象?有人可以检查我的代码吗? –

1

尝试在iPhone /客户端编码它的状态码首先将编码后的数据发送到php/server端。来自base64的对象c的输出看起来像PHP端的chunk_split(base64_encode($receiptData), 65)的输出,所以它稍有不同。

我也尝试使用上面的代码在服务器端对其进行编码,但即使在标准化所有新行以使用\r并在编码之前剥离任何尾随空格,也似乎不起作用。必须是我遗漏的一些小细节,无论如何,只需将它编码在iphone端,并省去麻烦。

相关问题