iPhone应用内购买:收据验证

3
我对交易收据验证有几个疑问:
  • 为什么需要外部服务器?为什么不能直接从iPhone上联系http://buy.itunes.apple.com?
  • 如果这个外部服务器宕机,或者收据无效怎么办?如何将其通知给支付队列?finishTransaction仍然会显示“支付成功”的警报视图,因为实际上交易已经成功,我想这会让用户感到困惑。
抱歉如果我对应用内购买流程的理解有误或我的问题不够清晰。谢谢。
编辑:我想如果发现收据无效就不应该调用finishTransaction,但这是一个问题吗?文档说应用程序应始终调用该函数。此时,钱款已经转移...混淆了。

你打过苹果公司的电话了吗?这是你应该向他们核实的事情。或者,你可以按照自己的想法提交你的应用程序。在审核备注中留下审查说明,然后审核团队会向你反馈审核结果。请在审核备注中详细解释你的问题。 - Moshe
1
@Moshe:我觉得这可能是一个常见的问题。已经实现应用内购买的其他人在收据无效时怎么办? - ySgPjx
我不知道。我从未进行过应用内购买。我只是在建议我会怎么做。我已经标记了这个问题。我可能很快就会实现应用内购买,所以我想知道你得到了什么答案。此外,测试帐户是否需要信用卡,还是只需要电子邮件地址?祝你好运! - Moshe
@Moshe:只是一个电子邮件地址。不需要转账。无论如何,谢谢你的回答。 - ySgPjx
2个回答

8
收据验证确保交易完成并成功。你不想从iPhone上进行这个操作,因为你无法真正信任用户的手机。
1. 用户启动应用内购买。 2. 当完成时,应用会向你的服务器请求验证。 3. 你与苹果验证收据:如果有效,可以执行与购买相关联的任何操作(解锁/提供内容、注册订阅……)。 4. 应用程序从队列中删除交易(使用finishTransaction)。
如果服务器出现故障,你不应该完成交易,而是向用户显示“不可用消息”。
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

稍后将再次调用。

但是如果您发现收据无效,则应完成关联交易。否则,您可能会在交易队列中永久保留额外的交易。这意味着每次您的应用运行时,paymentQueue:updatedTransaction: 将为每个交易调用一次...

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


  • (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 实际上被调用了,但是 transaction.transactionState 是 "SKPaymentTransactionStateFailed",而 transaction.error.code 是 SKErrorPaymentCancelled。
- Nick

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接