使用Node.jsvalidationiOS收据

经过几天的努力试图让某些东西起作用并且没有在哪里,我想知道是否有人在Node.js上使用iOS Receipt Validation。 我已经尝试过在这里找到的节点模块iap_verifier ,但我无法让它为我正常工作。 我从Apples服务器收到的唯一回复是21002,数据格式不正确。

对我有用的一件事是苹果服务器的客户端validation请求,我直接从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]; 

我有一堆不同的代码,我一直用它来向我的节点服务器发送各种各样的东西。 我所有不同的尝试都失败了。 我甚至尝试将我在上面的客户端validation示例中构建的“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(); } 

函数传递的地方是payloadData。 从Apple收到的回复总是21002.我基本上还是一个节点新手,所以我无法弄清楚到底出了什么问题。 我认为当我将数据从ObjC发送到我的节点服务器时可能会发生一些数据损坏,所以也许我没有正确传输。

如果有人可以指出我正确的方向,或提供一些例子,说明他们如何让收据validation在他们的节点中工作,那将是一个很大的帮助。 如果有人对iap_verifier模块有任何经验,并且确切地知道它需要什么数据,那将是很棒的。 我将提供我需要的任何代码示例,因为我已经在这个过程中打了几天了。

谢谢!

你有正确的收据数据吗? 根据Apple规范,它应具有格式

 {"receipt-data": "your base64 receipt"} 

使用receipt-data对象修改包含base64收据字符串的代码,validation应该有效

 function (receiptData_base64, production, cb) { var url = production ? 'buy.itunes.apple.com' : 'sandbox.itunes.apple.com' var receiptEnvelope = { "receipt-data": receiptData_base64 }; var receiptEnvelopeStr = JSON.stringify(receiptEnvelope); var options = { host: url, port: 443, path: '/verifyReceipt', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(receiptEnvelopeStr) } }; var req = https.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { console.log("body: " + chunk); cb(true, chunk); }); res.on('error', function (error) { console.log("error: " + error); cb(false, error); }); }); req.write(receiptEnvelopeStr); req.end(); } 

对于任何使用npm库“请求”的人来说 ,这里是如何避免麻烦的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); }) 

这是我使用npm请求承诺库的自动续订订阅的工作解决方案。 如果没有JSON字符串化正文表格,我收到21002错误(收据数据属性中的数据格式错误或丢失)

 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); });