In-App-Purchase掉错单优化

概述

因苹果内购AppleId关联用户设计,与我们账号关联用户设计差异,还有苹果对用户信息的保护,导致我们拿到苹果支付结果时,不能准确锁定用户账号,从而错单漏单。为解决此类问题,我们需要做一些辅助功能保证支付结果用户准确关联。

思路

苹果内购有同一商品交易未完成,不能重复购买的机制,可认为单一商品未完成,该商品与其对应订单是可以关联的

  1. 在苹果返回交易结果前将用户、订单信息与商品关联存储。
  2. 苹果返回交易结果后,将用户、订单信息与交易信息转化为一笔未完成的交易并存储。
  3. 使用未完成交易信息去服务端查询订单结果。

具体步骤

  1. 提交订单时,将uidorderId关联存储在SKMutablePaymentapplicationUsername中,将uidorderId拼装成订单对象并关联productId存储钥匙串,拉起苹果支付。

  2. 苹果返回交易更新,查看交易结果:

    • 失败:删除productId对应钥匙串订单对象
    • 成功,会有多种情况:
      1. 正常提交订单回调:将订单对象中的uidorderId与交易返回的transactionId拼装成一个未完成交易对象存储钥匙串。从SKMutablePaymentapplicationUsername中查询uidorderId,如有直接提交服务器验证订单,如无则使用未完成订单对象中的uidorderId提交服务器验证。
      2. 打开app有未完成订单回调:从SKMutablePaymentapplicationUsername中查询uidorderId,如有直接提交服务器验证订单,如无则根据transactionId钥匙串查找未完成订单对象,并使用其uidorderId提交服务器验证。
  3. 服务端验证:

    • 失败:清除该交易钥匙串对应数据,调用苹果交易完成。
    • 成功:删除要输出按对应未完成交易数据,调用苹果交易完成。

    最后附上Demo