1、内购流程
- 1、在 AppStore 中创建相应的物品,创建内购沙盒测试账号
- 2、客户端从后台获取相应的物品 ID (当然也可以再客户端写死,但后期扩展性就受限制了)
- 3、依据相应的物品 ID 请求商品的相关信息
- 4、依据商品信息创建订单请求交易
- 5、依据返回的订单状态处理交易结果
- 6、请求后台再次验证订单状态
- 7、依据后台返回结果处理相关逻辑
2、创建内购物品以及沙盒测试账号
- 已经有朋友写出了完善的教程,请参考如下链接,一步一步来就可以
3、客户端编写相关代码
- 再这里我把和支付相关的逻辑都抽取到了一个单例中,在最后贴上个人梳理的相关代码大家一起学习
4、做内购过程中遇到的坑
-
1、内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗。
您已购买此 App 内购买项目。此项目将免费恢复。
解决方法:在使用
[[SKPaymentQueue defaultQueue] addPayment:payment];
将支付信息添加进苹果的支付队列后,苹果会自动完成后续的购买请求,在用户购买成功或者点击取消购买的选项后回调
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction;
方法返回响应的结果信息,在该方法内除了得到响应的支付信息编写自身的业务的代码外还要记得调用
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
方法通知苹果的支付队列该交易已经完成,否者就会已发起相同 ID 的商品购买就会有此项目将免费恢复的提示。
-
2、每次启动一个新的内购支付流程,刚发起的时候系统就会调用
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction;
这个方法,结果扰乱一部分的支付业务逻辑
在 SKPaymentQueue 被启动并且添加了 addObserver之后,如果其判断到有未完成的交易,会主动调用paymentQueue updatedTransactions 这个方法来继续完成相关的交易流程,所以如果在上面那种情况下得到结果后不去调用 finish 接口,下次重新开启支付流程就会检查未完成的支付并调用该接口。
解决方法:
1.在得到支付结果后及时调用 finish 方法
2.添加一个是否是新发起的支付流程的条件,在条件符合的情况下才触发应用的相关逻辑的代码
(PS:在拿到苹果的支付结果凭据的时候最好在客户端做一份持久化的数据备份,等待后台验证完成后再清除掉,避免出现验证中间出现问题导致用户支付成功但后台相关的增值处理没有完成导致用户金钱损失的问题)
-
3、如何区分购买物品的是 沙盒测试账号 还是 真实账号
后台再验证支付凭据的时候要区分是沙盒测试账号购买的还是用户真实账号购买的,所以在传凭据的时候还需要告诉后台当前购买的账号性质。
解决方法:通过在配置文件中定义相关的宏定义并结合 Debu