transactionReceiptでJSONオブジェクトを生成します
-
18-09-2019 - |
質問
私は私の最初のアプリ内purchseのiPhoneアプリケーションをテストしようとしている過去の日してきました。残念ながら、私はtransactionReceiptを確認するために、iTunesのサーバと通信する方法を見つけることができません。
それは私が代わりにサーバーのサポートを使用して、iPhoneから直接受信されることを確認することにしました。この技術で私の最初の試みだからです。しかし、GoogleのコードからJSON APIを使用して作成したonbject JSONで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; }
のおかげで、あなたの指導のためにたくさんます。
解決
私は苦労の2日後ということを修正しました。あなたは、JSONオブジェクトに挿入する前にBase64を使用して領収書をエンコードする必要があります。そのような(ルビー):
dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json
Base64では唯一のブログのカップルに、(少なくともSDK 3.0のための)公式ドキュメントのどこに記載されていない。
は、例えば、は、ここで男が通過する前にBase64で領収書をエンコードしをそれPHPサーバーに、しかしこれiTunesにBase64でエンコードされた文字列を送信し、バックPHPでそれをデコードしません。
他のヒント
日時: "21002:java.lang.IllegalArgumentExceptionが:propertyListFromStringオブジェクトを解析されますが、文字列内のテキストがまだあります:。"
Iは、符号化前の{}内の受信データをラップすることによって自分のコードで同様の問題を修正します。
結果の領収書は次のようになります:
{
"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}
グッドラック!