使用Node.js验证iOS收据
经过几天的努力试图找到工作并且没有在哪里工作之后,我想知道是否有人在Node.js上使用了iOS Receipt Validation。我已经尝试过找到here的节点模块iap_verifier但我无法让它为我正常工作。我从苹果服务器收到的唯一回复是21002,数据格式不正确。
对我来说有一件事是对Apple服务器的客户端验证请求,我直接从Apple here提供的教程中获得,代码如下所示。
// 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',
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发送到我的节点服务器时可能会发生一些数据损坏,所以也许我没有正确传输。
如果有人可以指出我正确的方向,或提供一些例子,说明他们如何让收据验证在他们的节点中工作,那将是一个很大的帮助。如果有人对iap_verifier模块有任何经验,并且确切地知道它需要什么数据,那将是很棒的。我将提供我需要的任何代码示例,因为我已经在这个过程中奋斗了几天。
谢谢!
回答如下:你有正确的收据数据吗?根据Apple规范,它应该具有格式
{"receipt-data": "your base64 receipt"}
使用receipt-data对象修改包含base64收据字符串的代码,验证应该有效
function (receiptData_base64, production, cb)
{
var url = production ? 'buy.itunes.apple' : 'sandbox.itunes.apple'
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();
}
使用Node.js验证iOS收据
经过几天的努力试图找到工作并且没有在哪里工作之后,我想知道是否有人在Node.js上使用了iOS Receipt Validation。我已经尝试过找到here的节点模块iap_verifier但我无法让它为我正常工作。我从苹果服务器收到的唯一回复是21002,数据格式不正确。
对我来说有一件事是对Apple服务器的客户端验证请求,我直接从Apple here提供的教程中获得,代码如下所示。
// 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',
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发送到我的节点服务器时可能会发生一些数据损坏,所以也许我没有正确传输。
如果有人可以指出我正确的方向,或提供一些例子,说明他们如何让收据验证在他们的节点中工作,那将是一个很大的帮助。如果有人对iap_verifier模块有任何经验,并且确切地知道它需要什么数据,那将是很棒的。我将提供我需要的任何代码示例,因为我已经在这个过程中奋斗了几天。
谢谢!
回答如下:你有正确的收据数据吗?根据Apple规范,它应该具有格式
{"receipt-data": "your base64 receipt"}
使用receipt-data对象修改包含base64收据字符串的代码,验证应该有效
function (receiptData_base64, production, cb)
{
var url = production ? 'buy.itunes.apple' : 'sandbox.itunes.apple'
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();
}