一.使用轮子SwiftyStoreKit SwiftStoreKit
二.方法
在程序入口didFinishLaunchingWithOptions //程序启动时在AppDelegate添加观察者,监测购买结果状态,并根据需求作出相应处理。
1.监听自动续费订单
因为自动订阅类型,除了第一次购买行为是用户主动触发的。后续续费都是Apple自动完成的,一般在要过期的前24小时开始,苹果会尝试扣费,扣费成功的话会在APP下次启动的时候主动推送给APP。所以,APP启动的时候一定要添加上面的那句话。
用到SwiftyStoreKit.completeTransactions
这里的监听只是在重新进入app调用,将苹果放在队列里的订单监听到,然后你可以在回调里做相应的处理
2.订单支付 SwiftyStoreKit.purchaseProduct
这里面要传一个 productId (产品ID ) 这个id是你在app创建内购时填写的产品id,即你要支付那个订单,就直接填写对应的产品id就行
3.需要注意的问题,
(1)漏单怎么处理,我们的处理方式时添加一个恢复权益的按钮,点击时,将收据Receipt传给后台,后台去appstore请求所有的订单,然后将订单信息同步到我们的数据库,并且同步会员信息
(2)AppleID 怎么跟用户关联 后台获取到的订单信息json里 latest_receipt_info字典里有一个 original_transaction_id 这个id是跟appleID关联的,so,你可以用original_transaction_id跟用户关联
(3)服务器验证收据 https://www.jianshu.com/p/aba2edbb7871
(4)恢复以前的购买
使用restorepurchase方法恢复已完成的事务。当成功时,该方法返回所有非消耗品购买,以及所有自动更新的订阅购买,而不管它们是否已过期。
(5)获取收据(已加密)
SwiftyStoreKit.fetchReceipt(forceRefresh:true, completion: <#T##(FetchReceiptResult) -> Void#>)
如果为forceRefresh = false,则从文件返回本地收据,如果丢失,则刷新它。
如果为forceRefresh = true,则始终刷新收据。
(6)收据验证的环境
在sandbox中验证receipt:https://sandbox.itunes.apple.com/verifyReceipt
在生产环境中验证receipt:https://buy.itunes.apple.com/verifyReceipt
(7)识别沙盒环境下收据的方法有两种:
1.根据收据字段 environment = sandbox。
2.根据收据验证接口返回的状态码。如果status=21007,则表示当前的收据为沙盒环境下收据
苹果反馈的状态码:
21000 App Store无法读取你提供的JSON数据
21002 收据数据不符合格式
21003 收据无法被验证
21004 你提供的共享密钥和账户的共享密钥不一致
21005 收据服务器当前不可用
21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
21008 收据信息是产品环境中使用,但却被发送到测试环境中验证