2009-08-19 10 views
8

私は最初のアプリ内購入のiphoneアプリケーションをテストしようとしていました。残念ながら、私はiTunesサーバーとtalkReceiptを確認する方法を見つけることができません。transactionReceiptでJSONオブジェクトを生成

私はこの技術で私の最初の試みであるため、私はサーバーサポートを使用する代わりにiPhoneから直接領収書を確認することにしました。しかし、GoogleのコードからJSON APIを使用して作成されたJSON onbjectでPOSTリクエストを送信しようとすると、奇妙な応答が返されます(代わりに「status = 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オブジェクトを作成するために使用する方法であると思います。

は、ここではJSONオブジェクトが、私はHTTPBodyに追加する前に、どのように見えるかです:私が持っている

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。 }

ありがとうございます。

+0

「transactionReceipt」は、UTF-8でエンコードされた文字列として解釈されるとは言いません – user102008

答えて

20

私は苦労の2日後にそれを修正しました。 jsonオブジェクトに挿入する前に、Base64を使って領収書をエンコードする必要があります。その(ルビー)のような:

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

Base64では唯一のブログのカップルに、(少なくともSDK 3.0のための)公式ドキュメントのどこにでも言及されていません。

例えば、hereは、Base64でレシートをコード化してPHPサーバーに渡しますが、PHPでデコードしないので、Base64でエンコードされた文字列がiTunesに送信されます。

+0

あなたの答えはありがとうございます!! – Carlos

+0

これを指摘してくれてありがとう! –

+0

現在のApp App Purchaseプログラミングガイドには、ステップ1でbase64エンコーディングが記述されています。http://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/ uid/TP40008267-CH104-SW1 –

2

再:「21002:java.lang.IllegalArgumentExceptionが:propertyListFromStringオブジェクトを解析され、より多くのテキストが文字列にまだあります:」

を私は{でレシートデータをラップすることにより、自分のコードで同様の問題を修正}エンコードする前に。

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

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":"1", "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} 

幸運

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

ここで私が使用するコードです!

関連する問題