11126


下記コードの出力が文字化けしてしまってレスポンスのbodyが読めない状態です。  
Node.jsのrequestモジュールの使い方になるのかもしれませんが、もし分かる方いたら教えてください。  
引数にはbase64でエンコードされた文字列を渡しています。

コード

[code]

    var request = require('request')
    var receipt = process.argv[2]
    console.log(receipt)
    request.post({url: 'https://sandbox.itunes.apple.com/verifyReceipt',
      json: true,
      headers: {"User-Agent":"MySampleApp/5.3.0 CFNetwork/711.1.12 Darwin/14.0.0",
      "Content-Type":"application/x-www-form-urlencoded",
      "Accept-Encoding":"gzip, deflate",
      "Accept-Language":"ja-jp"},
      form: {"receipt-data":receipt}
    }, function(err,httpResponse,body) {
        console.log(httpResponse.statusCode)
        if (err) {
          console.log("ERR")
          console.log(err)
        } else {
          console.log(body)
          console.log(JSON.stringify(body))
          console.log(JSON.parse(body))
        }     
      }     
    )     
    
[/code]

出力

[code]

    �V*.I,)-V�22400�΀s�
    "\u001f�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000�V*.I,)-V�22400�\u0005\u0000΀s�\u0010\u0000\u0000\u0000"
    undefined:1
    �   
    ^   
    SyntaxError: Unexpected token
        at Object.parse (native)
        at Request._callback (/Users/tsuzuki/dvideo/dummyshop/receipt-verify-test/verifyReceipt.js:19:24)
        at Request.self.callback (/Users/tsuzuki/dvideo/dummyshop/receipt-verify-test/node_modules/request/request.js:354:22)
        at Request.emit (events.js:110:17)
        at Request.<anonymous> (/Users/tsuzuki/dvideo/dummyshop/receipt-verify-test/node_modules/request/request.js:1207:14)
        at Request.emit (events.js:129:20)
        at IncomingMessage.<anonymous> (/Users/tsuzuki/dvideo/dummyshop/receipt-verify-test/node_modules/request/request.js:1153:12)
        at IncomingMessage.emit (events.js:129:20)
        at _stream_readable.js:908:16
        at process._tickCallback (node.js:355:11)
    
[/code]

サンプルコード  
<https://github.com/toshi0383/iap-verify-receipt-sample>

# 詳細

In-App Purchaseのレシート検証の試験をしています。

アプリ=>自分のサーバ=>Appleという風にレシートを送って検証したいのですが、21002(The data in the receipt-data
property was malformed or missing)のステータスコードで返ってきてしまっていました。  
アプリから直接レシートを送る（レシート検証プログラミングガイドに載っているサンプルを使う）とうまく行くのですが、それは非推奨です。  
問題を単純化するために、Charlesを使って端末から送られたPOSTリクエストを取得して、再現してみたのが、上記コードです。  
（OSXではcurlコマンドでhttpsにPOSTする場合不具合があるため、Node.jsを使っています。）

いろいろ試したところ、なんとか21002のステータスコードではないものが返ってくるようになったのですが、bodyが文字化けしてしまって、結果OKなのかどうかわからない。。という状態です。

よろしくお願いいたします。


CC BY-SA 3.0
2015-06-07T10:31:46.400
11074
2015-06-08T12:13:30.777
257
question
ios node.js
In-App Purchase: サーバ経由のレシート検証がうまくいかない


コメントで解決したようですが、一応回答をしておきます。

gzipで圧縮されたレスポンスを自動的にデコードするには、requestのオプションで`gzip: true`を指定する必要があります。

> gzip - If true, add an Accept-Encoding header to request compressed  
>  content encodings from the server (if not already present) and decode  
>  supported content encodings in the response.

<https://github.com/request/request#requestoptions-callback>

ちなみに、`gzip: true`を指定した場合は、`Accept-Encoding`が自動的に設定されますので、質問内のコードの`"Accept-
Encoding":"gzip, deflate",`は不要です。


CC BY-SA 3.0
2015-06-08T12:13:30.777
11126
2015-06-08T12:13:30.777
3639
11074
answer