了解 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})
我已完成所有设置以验证我的收据服务器端(在 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})