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";
}

残念ながら、次のようになっています»領収書が無効です:{"status":21000}«問題が何であるか想像できますか?このエラーコードに関する情報すらインターネットで見つけることができません。エラーの説明が1つ見つかりましたが、これは更新不可能なサブスクリプション専用であるとのことです。

どうもありがとう、ジュリアン

4

2 に答える 2

1

最初にiPhone/クライアント側でエンコードしてから、エンコードされたデータをphp/サーバー側に送信してください。chunk_split(base64_encode($receiptData), 65)object-c での base64 の出力は、PHP 側の出力と似ているため、若干異なります。

\rまた、上記のコードを使用してサーバー側でエンコードしようとしましたが、使用するすべての新しい行を正規化し、エンコードする前に末尾の空白を削除しても、どちらも機能しないようです。とにかく、私が省略した小さな詳細に違いありません.iPhone側でエンコードして、手間を省いてください.

于 2012-09-24T06:44:07.170 に答える
0

StoreKitGuide から:

自動更新サブスクリプションのステータス コード

Status Code | Description
21000 | The App Store could not read the JSON object you provided.
于 2012-06-13T11:41:09.267 に答える