我是不是必须验证每个 SKPaymentTransaction 订阅的收据?

Posted

技术标签:

【中文标题】我是不是必须验证每个 SKPaymentTransaction 订阅的收据?【英文标题】:Do I have to verify the receipt for every SKPaymentTransaction for subscriptions?我是否必须验证每个 SKPaymentTransaction 订阅的收据? 【发布时间】:2021-02-15 16:21:31 【问题描述】:

我正在我的 ios 应用中实现自动更新订阅。我的事务处理看起来像这样的伪代码:

func paymentQueue(_queue: SKPaymentQueue, updatedTransactions transactions:[SKPaymentTransaction]) 
  for (t in transactions) 
    let data = Data(contentsOf: getReceiptUrl())

    //this is actually async, but for simplicity here it's just a straight return
    if verifyReceiptWithServer(data) == .success 
      print("Verified receipt successfully!")
    
    queue.finishTransaction(t)
  

如果在我的应用未激活时订阅多次续订,我可以在此处为每个产品获得不止一次的交易。有时,该应用程序在重新安装时也会同时获得大量旧交易。我需要验证每笔交易吗?还是每个productIdentifier 只做一个更好?或者甚至每次调用paymentQueue:updatedTransactions: 一次?如果磁盘上的收据数据始终相同,那么我每次向服务器发送相同的二进制数据,有时可能很多。

文档链接在答案中表示赞赏。

【问题讨论】:

【参考方案1】:

对于订阅,您只需为所有交易拨打 1 次电话。重要的是您正在验证收据上的权利。因此,只要您的服务器正在查看整个收据,您就应该没问题。

对于其他 IAP 类型,在为每个更新的交易进行验证之后。

【讨论】:

以上是关于我是不是必须验证每个 SKPaymentTransaction 订阅的收据?的主要内容,如果未能解决你的问题,请参考以下文章

即使在经过验证的输入上,我是不是也需要检查 sql 注入?

如果我使用 jQuery 验证,是不是必须使用 DataAnnotations?

IIS 是不是进行 SSL 证书检查,还是我必须对其进行验证?

Amazon Cognito:验证用户后,是不是必须提示他们登录?

直接进入地址栏时,您必须使用 API 密钥来验证对 Google Maps Platform API 的每个请求错误

为每个产品密钥生成序列号并验证它们[关闭]