# 应用内支付自动续期订阅常见问题分析

#### 问题现象

1.  自动续期订阅商品购买场景，用户在最初购买原订阅，在原订阅未到期时购买了新订阅，iap接口有哪些字段可以帮助开发者判断新订阅是否购买成功。
2.  同一个应用切换多个角色购买同一个订阅类型商品，如何保证每一个角色的权益？
3.  用户切换自动续期订阅商品，从A切换到B，再从B切换C，此时在开发者侧收到关键事件通知的回调排序是如何的？
4.  如何在自动续期订阅的所有支付回调通知中，找到对应用户的自动续费回调通知？
5.  应用内支付可以通过主动调用接口的方式给用户取消连续订阅或退订吗？

#### 背景知识

自动续期订阅说明：订阅是指用户在购买自动续期订阅商品后，可以在一段时间访问app的增值功能或内容，并且会在订阅周期结束后自动续期（自动购买下一期服务）的能力。如果期间用户取消订阅，则订阅在当期结束后将不再自动续期。

#### 解决方案

1.  对已购自动续期订阅商品，进行同一个订阅组不同自动续期订阅商品的切换操作，有立即生效、下周期生效两种切换效果，参考订阅状态及变更。结合数字商品的订阅等级和SubRenewalInfo中的nextRenewPeriodProductId（下一个计费周期续订的商品ID）、productId（当前生效的商品ID）这两个字段，可以判断新订阅是否购买成功。
    *   立即生效：新订阅的订阅等级高于原订阅，或者新订阅与原订阅的订阅等级相同，且原订阅的续费周期和新订阅的续费周期相同，此时新订阅会立即扣费、生效，字段productId为新订阅的ID，nextRenewPeriodProductId为空。
    *   下周期生效：新订阅的订阅等级低于原订阅，或者新订阅与原订阅的订阅等级相同，且原订阅的续费周期和新订阅的续费周期不同，此时新订阅为待生效状态，并在原订阅失效日期开始时扣费并生效，字段productId为原订阅的ID，nextRenewPeriodProductId为新订阅的ID。
2.  用户购买订阅型商品时使用的账号是华为账号，一个华为账号在同一订阅商品上只能同时存在一笔订阅。如果应用存在多角色，可能会存在权益发放错乱的现象。针对这个场景建议的处理方案如下：
    *   当用户为角色A购买自动续期订阅商品后，该用户的其他角色只允许购买普通固定周期商品服务（开发者可以通过华为消耗型商品自行实现）。
    *   当用户为角色A购买自动续期订阅商品后，再为角色B购买自动续期订阅商品时，开发者可以自行设计将角色A的剩余权益转移给角色B。
    *   开发者可以配置多个自动续期订阅商品。如游戏不同区服对应不同角色，每个区服创建独立的自动续期订阅商品。
3.  订阅组切换订阅的最近生效的历史订阅状态，目前预期的规格是按照时间戳升序排列的，A切换B，B切换C，C订阅也就是最新的订阅，应该在最后面，最终排序是A-B-C。
4.  可以在创建订单或订阅订单时通过传入的PurchaseParameter使用developerPayload字段设置用户标识。developerPayload一般用于识别已支付的购买订单是由哪个应用帐号发起的购买，并将此购买订单的相关权益正确发放给对应的应用帐号。
5.  取消订阅或者退款是用户的行为，交易双方是用户和华为，从交易的合规性来说，付款方想退订需要交易付款方主动发起。
    
    开发者不能主动把app内支付用户的订阅取消，应用可以通过iap.showManagedSubscriptions接口跳转到订阅页或订阅详情页，让用户管理订阅。用户亦可通过"设置-华为账号-付款与账单-订阅"路径进入订阅页管理订阅。包括查看订阅、取消订阅、切换订阅、恢复订阅等。
    

#### 常见FAQ

Q：应用内支付服务中的自动续期商品，有对应接口能返回商品的到期时间吗？

A：用户购买成功时，应用将接收到一个CreatePurchaseResult对象，其PurchaseData字段包括了此次购买的结果信息。对PurchaseData.jwsSubscriptionStatus进行解码验签，验证成功可得到SubGroupStatusPayload的JSON字符串。SubGroupStatusPayload中lastSubscriptionStatus即为订阅组中最后生效的订阅状态SubscriptionStatus，其中的expiresTime就是过期时间。

Q：如何监听应用内支付取消自动续期订阅事件？

A：订阅取消时会发送服务端通知事件，服务端关注AUTO\_RENEW\_DISABLED子类型的事件通知即可。

Q：应用内支付续期商品的自动续订如何实现？

A：可以参考文档：接入自动续期订阅。

Q：应用内支付服务端关键事件通知，当自动续期订阅商品升级的时候，会产生新订单，那如何得知被升级的老订单是哪一个？

A：开发者可以在应用服务器端请求的NotificationPayload中的NotificationSubtype类型设为UPGRADE字段，可以感知到用户调整自动续期订阅商品升级或跨级。

Q：自动续期订阅商品没有通过iap.finishPurchase完成这次交易，会触发下个周期的订阅吗？

A：不会的，需要确认发货之后才可以触发订阅商品的下次续期。具体可参考文档：接入自动续期订阅的购买结果处理。

Q：如何理解服务器关键事件通知中NotificationSubtype类型为RESTORE的事件通知？

A：当主通知NotificationType类型为DID\_NEW\_TRANSACTION，子通知类型为RESTORE，表示订单已购买/订阅已购买/订阅续订成功，即用户主动恢复了一个订阅型商品，续期恢复正常。