8

私は、最初のアプリ内購入 iPhone アプリケーションをテストしようとして、過去数日間を過ごしてきました。残念ながら、iTunes サーバーと通信して transactionReceipt を確認する方法が見つかりません。

このテクノロジーを試すのは初めてなので、サーバー サポートを使用する代わりに、iPhone から直接レシートを確認することにしました。しかし、Google コードから JSON API を使用して作成された JSON onobject を使用して POST 要求を送信しようとすると、iTunes は常に奇妙な応答を返します (代わりに、「ステータス = 0」文字列を待ちます)。

領収書を確認するために使用するコードは次のとおりです。

- (void)recordTransaction:(SKPaymentTransaction *)transaction {
    NSString *receiptStr = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding];
    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"algo mas",@"receipt-data",nil];

    NSString *jsonString = [jsonDictionary JSONRepresentation];
    NSLog(@"string to send: %@",jsonString);

    NSLog(@"JSON Created");
    urlData = [[NSMutableData data] retain];

    //NSURL *sandboxStoreURL = [[NSURL alloc] initWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
    NSLog(@"will create connection");
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

リクエストのヘッダーで何かを忘れているのかもしれませんが、JSON オブジェクトを作成するために使用する方法に問題があると思います。

HTTPBody に追加する前の JSON オブジェクトは次のようになります。

    string to send: {"receipt-data":"{\n\t\"signature\" = \"AUYMbhY

       ...........

D0gIjEuMCI7Cn0=\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"}

私が得た応答:

完全な応答 { 例外 = "java.lang.IllegalArgumentException: 引用符で囲まれていない文字列を読み取ろうとしたときに、プロパティ リストの解析に失敗しました。使用できる文字が見つかりませんでした。行番号: 1、列: 0."; ステータス = 21002; }

ご指導ありがとうございました。

4

2 に答える 2

20

2日間の苦労の末、修正しました。json オブジェクトに挿入する前に、Base64 を使用してレシートをエンコードする必要があります。そのように(ルビー):

dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json

Base64 は、公式ドキュメントのどこにも (少なくとも SDK 3.0 については) 言及されておらず、いくつかのブログでしか言及されていません。

たとえば、この人物はレシートを PHP サーバーに渡す前に Base64 でエンコードしますが、PHP ではデコードしないため、Base64 でエンコードされた文字列を iTunes に送信します

于 2009-09-01T22:21:14.107 に答える
2

Re: 「21002: java.lang.IllegalArgumentException: propertyListFromString はオブジェクトを解析しましたが、文字列にはまだテキストがあります.:」

エンコードする前にレシート データを {} でラップすることで、コード内の同様の問題を修正しました。

結果の領収書は次のようになります。

{
    "signature" = "A[...]OSzQ==";
    "purchase-info" = "ew[...]fQ==";
    "pod" = "100";
    "signing-status" = "0";
}

私が使用するコードは次のとおりです。

receipt = "{%s}" % receipt    // This step was not specified - trial and error
encoded = base64.b64encode(receipt)
fullpost = '{ "receipt-data" : "%s" }' % encoded
req = urllib2.Request(url, fullpost)
response = urllib2.urlopen(req)

Apple の対応:

{"receipt":{"item_id":"371235", "original_transaction_id":"1012307", "bvrs":"1.0", "product_id":"com.foo.cup", "purchase_date":"2010-05-25 21:05:36 Etc/GMT", "quantity":"1", "bid":"com.foo.messenger", "original_purchase_date":"2010-05-25 21:05:36 Etc/GMT", "transaction_id":"11237"}, "status":0}

幸運を!

于 2010-05-26T23:10:29.227 に答える