IAP总结

IAP准备工作

  1. 申请沙盒账号 (可以同时给测试也创建一个)
    邮箱ID可以填一个不存在的邮箱,
  2. 填写银行、财务信息(这个我没有实际操作)
  3. 创建一个购买商品

流程

  1. 请求商品ID (商品ID放到服务器)
  2. 根据根据这个商品ID去获取商品信息(不同的地区显示不同的货币符号和价格)
  3. 请求订单ID,每次支付之前都要请求获取一个订单ID(服务器生成的)
  4. 根据之前步骤的信息去发起支付。
  5. 根据苹果的回调状态去处理支付状态。
  6. 如果支付成功,去服务器进行验证,并且以服务器的验证结果为准。

遇到的问题和异常:

  1. 跟服务器验证的请求,需要传一个receipt,但是后端一直返回21002,说receipt格式错误

    解决: 后端想办法解决的,编码的问题。

  2. 在支付中这个状态中断了支付,怎么处理?

    解决: 这个状态下就算重新去发起一个新的支付,回调也一直是购买中。等待IAP的服务器给你推送继续购买的弹框。我的经验是:晚上八点遇到这个情况,第二天早上八点就推送了。

  3. 支付的回调方法中,购买中这个状态做什么处理?

    解决: 刚开始我是写了个转菊花的等待状态,但是发现如果遇到第二种情况,他会一直走回调,阻碍主线程。等待状态可以写在调起支付之前。

  4. 需不需要保存订单信息和receipt?

    解决:其实不需要,每次调起支付之前先判断有没有未结束的交易。代码如下:

           //查询队列里是不是还有没有finish的交易,去服务器验证。
    if ([SKPaymentQueue defaultQueue].transactions.count > 0)                         {
    
        //NSLog(@"交易成功但是没finish的个数为:%zd",[SKPaymentQueue     defaultQueue].transactions.count);
        for (SKPaymentTransaction *transaction in [SKPaymentQueue defaultQueue].transactions)
        {
            if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
                //这个时候沙盒里是有未完成的交易凭证的
                [self completeTransaction:transaction];
            } else if (transaction.transactionState == SKPaymentTransactionStatePurchasing) {
                //这种情况,强行结束交易会崩溃
            }
        }
    }
    

资料

  1. In-App Purchase Programming Guide(《App 内购买项目编程指南》)

  2. APP Store Connect 帮助

  3. IAP需要了解的

  4. [iOS]贝聊 IAP 实战之满地是坑