【问题标题】:iPhone in-app purchase: receipt verificationiPhone 应用内购买:收据验证
【发布时间】:2011-07-15 18:38:19
【问题描述】:

我对交易收据验证有一些疑问:

  • 为什么需要外部服务器?为什么我不能直接通过 iPhone 联系http://buy.itunes.apple.com
  • 如果此外部服务器已关闭或收据无效怎么办?如何将其传达给支付队列? finishTransaction 仍然会显示“付款成功”警报视图,因为交易实际上是成功的,我想这会让用户感到困惑。

抱歉,如果我误解了应用内购买流程或我的问题不够清楚。谢谢。

编辑:如果我发现收据无效,我想我不应该打电话给finishTransaction,但这是个问题吗?文档说应用程序应该始终调用该函数。还有,那个时候钱已经转了……困惑

【问题讨论】:

  • 你给苹果打过电话吗?这是您应该与他们核实的事情。或者,您可以按照认为的方式提交您的应用。留下审查笔记,然后审查团队将与您联系审查结果。在评论笔记中详细解释您的问题。
  • @Moshe:我认为这可能是一个常见问题。当收据无效时,其他已经实施应用内购买的人会怎么做?
  • 我不知道。我从来没有做过应用程序购买。我只是在建议我会做什么。我已经为这个问题加注了星标。我可能很快就会实施应用内购买,我想知道你得到了什么答案。另外,测试帐户是否需要信用卡,还是只需要一个电子邮件地址?祝你好运!
  • @Moshe:只是一个电子邮件地址。无需转账。无论如何,感谢您的回答。

标签: iphone in-app-purchase


【解决方案1】:

收据验证可确保交易完成且成功。你不想在 iPhone 上这样做,因为你不能真正信任用户的手机。

  1. 用户发起应用内购买
  2. 完成后,应用会要求您的服务器进行验证
  3. 您向 Apple 验证收据:如果收据有效,您可以执行与购买相关的任何操作(解锁/交付内容、注册订阅...)
  4. 应用程序从队列中删除事务 (finishTransaction)

如果服务器关闭,您不应完成事务,而是向用户显示“不可用消息”。

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

稍后会再次调用。

但是如果您发现收据无效,您应该完成关联交易。如果没有,您可能有额外的交易永远存在于交易队列中。这意味着每次您的应用运行时,paymentQueue:updatedTransaction: 将在每个事务中调用一次...

在我的应用程序中,收据验证是通过网络服务完成的,如果收据无效,则会返回错误代码。这就是需要外部服务器的原因。如果用户以某种方式设法跳过收据验证(通过伪造 Web 服务“成功”响应),他将无法解锁内容/访问功能,因为服务器没有购买痕迹。

【讨论】:

  • 感谢您的澄清!
  • - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 实际调用了,但是transaction.transactionState是“SKPaymentTransactionStateFailed”,transaction.error.code是SKErrorPaymentCancelled。跨度>
【解决方案2】:

只是想补充一点,如果用户不可信,您不能假设他们没有在封闭网络上伪造与您的服务器的通信。即:除非您使用类似于 SSL 证书的东西,否则您无法确定您的服务器验证来自您的服务器而不是他的 Mac。

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2010-11-20
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多