IAP准备工作
- 申请沙盒账号 (可以同时给测试也创建一个)
邮箱ID可以填一个不存在的邮箱, - 填写银行、财务信息(这个我没有实际操作)
- 创建一个购买商品
流程
- 请求商品ID (商品ID放到服务器)
- 根据根据这个商品ID去获取商品信息(不同的地区显示不同的货币符号和价格)
- 请求订单ID,每次支付之前都要请求获取一个订单ID(服务器生成的)
- 根据之前步骤的信息去发起支付。
- 根据苹果的回调状态去处理支付状态。
- 如果支付成功,去服务器进行验证,并且以服务器的验证结果为准。
遇到的问题和异常:
跟服务器验证的请求,需要传一个receipt,但是后端一直返回21002,说receipt格式错误
解决: 后端想办法解决的,编码的问题。
在支付中这个状态中断了支付,怎么处理?
解决: 这个状态下就算重新去发起一个新的支付,回调也一直是购买中。等待IAP的服务器给你推送继续购买的弹框。我的经验是:晚上八点遇到这个情况,第二天早上八点就推送了。
支付的回调方法中,购买中这个状态做什么处理?
解决: 刚开始我是写了个转菊花的等待状态,但是发现如果遇到第二种情况,他会一直走回调,阻碍主线程。等待状态可以写在调起支付之前。
需不需要保存订单信息和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) { //这种情况,强行结束交易会崩溃 } } }