swift iOS内购

2022-05-23  本文已影响0人  木头炫

一.使用轮子SwiftyStoreKit

二.方法

在程序入口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 收据信息是产品环境中使用,但却被发送到测试环境中验证

上一篇下一篇

猜你喜欢

热点阅读