一、有关Apple订阅
1.自动续订型方案和订阅群组
Auto-renewable Subscriptions
自动续订型方案,就是在用户取消订阅之前,每次订阅周期期满时自动续订,款项由Apple
收取。
在 App Store Connect
里设置自动订阅型方案时,每个订阅项目一定要属于某个订阅群组Subscription Group
,并且要设定在改群组内的Service Level
订阅群组是订阅项目的集合,有三点要注意:
用户同时间内只能订阅同一个订阅群组下的一个项目,若希望用户可以同时自动续订多个项目,则需创建多个订阅群组。
在同一订阅群组内的
Free trial period
试用期或Introductory Price
优惠价,只限一次。拖动排序设置
Service Level
订阅级别,用于确定订阅者可用的升级、降级和交叉升级行为。
2.自动续订
自动续订产品的续订日期快到了,苹果会自动扣款续费,若续费成功,会生成一笔新的交易订单保存在事务机制里面。如果App在前台状态,此时会在观察者队列里面监听到该笔交易订单的更新状态。
originalPurchaseDate
:代表这个自动订阅产品的第一次购买时间,服务端可以用来判断这个用户是什么时候开启订阅的。originalTransactionId
:代表第一次订阅的交易id,服务端应该用自己的订单号orderId
和这个交易id进行绑定。所以是想要跟踪是哪笔订单的续订,就用这个。transactionId
每次都会改变,即使是恢复订阅,transactionId
也会改变。
3.恢复购买
对于自动续订型订阅,需要提供恢复购买的功能restoreCompletedTransactions
,例如创建一个恢复按钮,不然审核很可能会被拒绝。
"消耗型产品"和"非自动续订订阅"苹果不会提供恢复的接口,不要调用restoreCompletedTransactions
方法去恢复,否则有可能会被拒。非自动续订订阅也是跨设备同步的,所以原则上来说也需要提供恢复购买的功能,但需要依靠App自建的账户体系恢复,不能用苹果的恢复接口。
恢复已完成的交易会为用户进行的每笔已完成的交易创建一个新的交易,本质上就是为交易队列观察者重播历史记录,改交易的状态变为restored
。
4.在客户端处理交易
利用苹果的事务机制,每次重启App时检测未结束的订单
-[SKPaymentQueue addTransactionObserver:]
,若订单已经购买但是未发放产品(即漏单),需要重新向服务器验证,验证成功后调用finishTransaction
结束该笔订单。非特殊情况下无法对同一产品重复购买(即已经发起一笔购买订单,但是并没有
finishTransaction
结束),所以每次购买前需要检测是否有待处理的交易-[SKPaymentQueue transactions]
,若有则需要调用finishTransaction
结束。
There is a pending transaction for the same product identifier. Please either wait for it to be finished or finish it manually using `completePurchase` to avoid edge cases
购买时报上述错误,是因为发起的购买交易没有调用finishTransaction
结束交易,无法对同一产品再次发起购买。
- 当恢复订阅时,如果产品从购买到续订总共支付20次(即续订19次),那么这个
二、有关Google订阅
1. 上传aab包
新增BILING
权限,然后上传aab包到封闭测试才可新增产品
<uses-permission android:name="com.android.vending.BILLING"/>
2.建立产品
Google Play Console
--> 产品 --> 订阅 --> 建立订阅项目
例如你有包月、包季、包年三个产品, 你只需要创建一个订阅产品,在该订阅产品里面再创建三个基本方案。
3.在后端处理购买交易
对于订阅产品首先需确保购买交易是否被确认,查看API
Purchases.subscriptions调用结果中的acknowledgementState
,若未被确认必须调用API
Purchases.subscriptions.acknowledge进行确认。
4. 在客户端处理购买交易
服务端必须在发送产品后进行确认,由于确认请求偶尔会失败,所以可能会出现漏单的情况。防止服务端出现验证错误的情况,需要在App每次重启的时候使用queryPurchasesAsync
查询有效订阅产品,并向服务器重新验证该笔购买交易。
queryPurchasesAsync
方法不需要网络,每次查询都会返回有效订阅产品,所以若订阅型产品订阅成功后,每次查询都会返回,即使该产品已经确认。