gpt4 book ai didi

使用 lambda 通过 Node.js 进行 iOS 收据验证

转载 作者:行者123 更新时间:2023-11-28 06:33:03 25 4
gpt4 key购买 nike

我正在使用 Swift 开发一个 iOS 应用程序,并尝试为应用程序内购买实现收据验证。我无法弄清楚如何在 Swift 中实现这一点,因此在看到 Giulio Roggero 在 this 中的示例后,我尝试让我的应用程序通过 Node.js 中编写的 Lambda 函数发送请求。问题。我的 Swift 代码如下所示:

let receiptPath = Bundle.main.appStoreReceiptURL?.path
if FileManager.default.fileExists(atPath: receiptPath!){
var receiptData:NSData?
do{
receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, options: NSData.ReadingOptions.alwaysMapped)
}
catch{
print("ERROR: " + error.localizedDescription)
}
let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed)
let invocationRequest = AWSLambdaInvokerInvocationRequest()
invocationRequest?.functionName = "sendReceiptRequest"
invocationRequest?.invocationType = AWSLambdaInvocationType.requestResponse
invocationRequest?.payload = ["receipt-data" : receiptString!, "password" : SUBSCRIPTION_SECRET]

let lambdaInvoker = AWSLambdaInvoker.default()
lock()
lambdaInvoker.invoke(invocationRequest!).continue(with: AWSExecutor.mainThread(), with: { (task:AWSTask!) -> AnyObject! in
if task.error != nil {
self.sendErrorPopup("Error: \(task.error?.localizedDescription)")
} else {
print("TOKEN: ", task.result)
}
self.unlock()
return nil
})}

我的 Lambda node.js 函数如下所示,示例如下:

function (receiptData_base64, password, production, cb)
{
var url = production ? 'buy.itunes.apple.com' : 'sandbox.itunes.apple.com'
var receiptEnvelope = {
"receipt-data": receiptData_base64,
"password":password
};
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();
}

但是,当通过 lambda 测试或通过我的应用程序运行此代码时,我收到一条错误消息,其中仅显示 Response body:
{"errorMessage":"true"}
。我注意到,如果我调整代码,我可以创建更多预期的错误——例如,如果我有一些其他的收据数据值,我会得到一个 21002 错误代码作为响应,如果我将“production”更改为 true ,我收到 21007 错误。部分问题是我不知道回调应该如何工作——https.request 中的 block 是否适合我在 Swift 中尝试做的事情?我的印象是收据数据格式正确,因为更改它会产生不同的结果,那么为什么最终结果仍然是错误?

编辑:

我之前没有注意到的是,当我运行 Lambda 函数时,会出现“body: (receipt data)”行,其中(receipt data)是我发送给该函数的 base 64 编码数据。这让我怀疑我根本没有到达错误回调 block ,并且该错误与我将回调结果发送回我的应用程序的方式有关。这个 block 是什么:

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

应该怎么做?是否需要启用一些权限才能接收回调?

最佳答案

对于后来发现此问题的任何人,潜在问题:

  1. 这里最大的问题是 Content-Type 不正确。您需要发布JSON,而不是url编码;虽然代码这样做了,但它使用了错误的类型来告诉服务器它正在使用什么格式。它应该是 application/json 而不是 application/x-www-form-urlencoded
  2. 发送到 Apple 服务器的 Base64 不得(至少从上周开始)包含行尾。我不知道这是这里的问题,但这是我过去遇到的问题,.endLineWithLineFeed 让我怀疑。
  3. 用于在服务器之间切换的算法。该方法不应允许在生产和沙箱之间切换,而是应尝试验证对生产服务器的收据。如果结果对象的 status21007,则代码应尝试向沙箱服务器发送相同的收据。对收据进行解码和验证后,客户端可以检查收据以查看它是针对哪个服务器进行验证的,并(如有必要)忽略沙盒收据。

关于使用 lambda 通过 Node.js 进行 iOS 收据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com