5

何かを機能させるために数日間苦労した後、どこにも行かなかったので、誰かが Node.js で動作する iOS Receipt Validation を手に入れたのではないかと思っていました。ここにあるノード モジュール iap_verifier を試しましたが、適切に動作させることができませんでした。Apples サーバーから返された唯一の応答は 21002 で、データの形式が正しくありませんでした。

私にとってうまくいったことの 1 つは、Apple が提供するこちらのチュートリアルから直接取得した Apple サーバーへのクライアント側の検証要求でした。コードは以下のとおりです。

// The transaction looks ok, so start the verify process.

// Encode the receiptData for the itms receipt verification POST request.
NSString *jsonObjectString = [self encodeBase64:(uint8_t *)transaction.transactionReceipt.bytes
                                         length:transaction.transactionReceipt.length];

// Create the POST request payload.
NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\", \"password\" : \"%@\"}",
                     jsonObjectString, ITC_CONTENT_PROVIDER_SHARED_SECRET];

NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];


// Use ITMS_SANDBOX_VERIFY_RECEIPT_URL while testing against the sandbox.
NSString *serverURL = ITMS_SANDBOX_VERIFY_RECEIPT_URL;

// Create the POST request to the server.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:serverURL]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:payloadData];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[conn start];

ノードサーバーにさまざまなものを送信するために使用しているさまざまなコードがたくさんあります。私のさまざまな試みはすべて失敗しました。上記のクライアント側の検証の例で作成した「payloadData」をサーバーに注ぎ込み、次のコードを使用してそれを Apples サーバーに送信することさえ試みました。

function verifyReceipt(receiptData, responder)
{

var options = {
    host: 'sandbox.itunes.apple.com',
    port: 443,
    path: '/verifyReceipt',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(receiptData)
    }
};

var req = https.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log("body: " + chunk);
    });
});

req.write(receiptData);
req.end();
}

関数にペイロードデータが渡される場所。Apple からの応答は常に 21002 です。私はまだ基​​本的にノード初心者なので、正確に何が問題なのかわかりません。ObjC からノード サーバーにデータを送信しているときに、データの破損が発生している可能性があるため、正しく送信されていない可能性があります。

誰かが私を正しい方向に向けたり、レシート検証をノードで機能させる方法の例を提供したりできれば、それは大きな助けになるでしょう. 誰かが iap_verifier モジュールの経験があり、正確に必要なデータがあれば、それは素晴らしいことです。数日間このプロセスと戦ってきたので、必要なコード例を提供します。

ありがとう!

4

3 に答える 3

6

npm ライブラリ "request"を使用している場合は、面倒な 21002 エラーを回避する方法を次に示します。

formFields = {
  'receipt-data': receiptData_64
  'password': yourAppleSecret
}

verifyURL = 'https://buy.itunes.apple.com/verifyReceipt' // or 'https://sandbox.itunes.apple.com/verifyReceipt'

req = request.post({url: verifyURL, json: formFields}, function(err, res, body) {
    console.log('Response:', body);
})
于 2014-11-11T19:05:59.400 に答える
4

This is my working solution for auto-renewable subscriptions, using the npm request-promise library. Without JSON stringify-ing the body form, I was receiving 21002 error (The data in the receipt-data property was malformed or missing)

const rp = require('request-promise');

var verifyURL = 'https://sandbox.itunes.apple.com/verifyReceipt';
// use 'https://buy.itunes.apple.com/verifyReceipt' for production

var options = {
    uri: verifyURL,
    method: 'POST',
    headers: {
        'User-Agent': 'Request-Promise',
        'Content-Type': 'application/x-www-form-urlencoded',
    },
    json: true
};

options.form = JSON.stringify({
    'receipt-data': receiptData,
    'password': password
});

rp(options).then(function (resData) {
    devLog.log(resData); // 0
}).catch(function (err) {
    devLog.log(err);
});
于 2017-12-28T10:13:32.287 に答える