了解 serverVerificationData in_app_purchase Flutter

Understand the serverVerificationData in_app_purchase Flutter

我已完成所有设置以验证我的收据服务器端(在 python 中使用 requests 包)。

这是我的代码:

url = "https://buy.itunes.apple.com/verifyReceipt"
                request_body = {"receipt-data": token}
                headers = {'Content-Type': 'application/json'}
                response = requests.post(url=url, headers=headers, data=request_body)

此处唯一的变量是从客户端 (flutter) 发送的 token,即:purchaseDetails.verificationData.serverVerificationData.

我无法验证收据,因为如果我通过 token 作为 string,我总是收到 21002 错误(格式错误)。
如果我在 python 中尝试这样的事情:

token = base64.b64encode(token)
 

它抛出这个错误:a bytes-like object is required, not 'str' 我不明白,因为我实际上传递了一个 bytes 对象。

传递给 POST 请求以验证 iOS 收据的正确格式是什么? flutter 是正确的还是我们应该编码一些东西?

任何具体的例子都将被接受,因为我找不到任何例子。

PS :如果生产失败,我将被重定向到沙箱 url "https://sandbox.itunes.apple.com/verifyReceipt"。沙箱 response 与生产沙箱相同 (statusCode: 21002)

看来您的收据不正确(沙箱有时会出现问题)或者您的 server-side 设置有误

对于第一点,您可以尝试通过生成 storeKit 配置文件来创建收据。 这不能在 flutter 中完成,你必须打开 iOS 模块和代码并通过 here.

设置 storekit 配置文件

设置 storekit 文件后,您可以直接从 xCode 运行 应用程序,或者直接从您喜欢的 flutter IDE 关闭 xCode 和 运行 =]

现在,当您尝试从应用中 fetch/buy 产品时,iOS 将永远不会点击生产购买标识符,而是从您的 storekit 配置中获取产品并从中生成收据。此收据已被苹果沙盒验证端点接受,您还可以使用 storekit 配置从 xCode 测试退款和订阅取消。

对于第二点,您必须在 iTunes 连接中启用特定于应用程序的共享机密,然后在收据验证 'password' 密钥中使用它 API。 在这里你可以找到它 AppStoreConnect > 您的应用 > 订阅

如果还是不能解决问题,我很乐意进一步提供帮助。

编辑:我刚刚测试了购买在沙盒中购买的自动续订订阅(不是 storeki t) 然后使用沙箱 URL 验证它并返回正确的收据数据。在上面的 post 中,您不需要对 purchaseDetails.verificationData.serverVerificationData 进行 base64 编码,因为它已经编码了。你在 postman 上测试过这个吗?它在那里工作

编辑:所以请求格式不正确,因为您没有将数据作为字符串发送,因此您需要转储 dict :

request_body = json.dumps({"receipt-data": token})