iPhone应用内购买:收据验证

时间:2011-02-01 14:04:58

标签: iphone in-app-purchase

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

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

很抱歉,如果我误解了应用内购买流程,或者我的问题不够明确。感谢。

修改:如果我发现收据无效,我想不应该致电finishTransaction,但这是一个问题吗?文档说应用程序应始终调用该函数。此外,那时钱已经转移了...... confused

2 个答案:

答案 0 :(得分:8)

收据验证可确保交易完成且成功。你不想从iPhone那里做到这一点,因为你无法真正信任用户的手机。

  1. 用户启动应用内购买
  2. 完成后,应用程序会要求您的服务器进行验证
  3. 您使用Apple验证收据:如果它有效,您可以执行与购买相关的任何操作(解锁/交付内容,注册订阅......)
  4. 该应用从队列中删除了该事务(finishTransaction
  5. 如果服务器关闭,您不应该完成交易,而是向用户显示“不可用消息”。

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

    稍后会再次调用。

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

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

答案 1 :(得分:2)

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