订阅专用功能说明

配置订阅商品

订阅型商品用订阅群组来管理维护,所以在创建订阅商品前,需要先创建订阅群组,并在创建订阅型商品时指定商品所在的订阅群组。订阅群组用于承载同类型商品的管理,一个订阅群组可以包含多个订阅型商品,且同一个订阅组只有一个商品是处于生效状态。当商品处于生效状态时,开发者需要为用户提供该商品对应的服务。这样的机制为开发者提供了便捷方式,让商品服务功能大致相同,但商品服务有细微差别的需求得以快速实现。

举个例子:

开发者可能想要提供视频会员的订阅型业务,则需要创建一个订阅群组,专门用于承载视频会员类商品。同时,如果开发者希望提供不同的续费周期供用户选择,那么开发者可以在刚刚创建的订阅群组里,添加不同续费周期的商品,比如:视频会员的月度续费商品、视频会员的半年续费商品、视频会员的年度续费商品等。而在配置订阅型商品时,需要指定商品的续费周期,可选的值有:1周,1个月,2个月,3个月,6个月,12个月。为了让开发者的订阅型商品更有吸引力,订阅型商品提供了两种促销手段:

  • 折扣价格:设置一个低于商品原价的价格,让用户在购买初期以低价享受一段时间的商品服务。

  • 免费试用:设置一个免费时间段,让用户在购买初期免费享受一段时间的商品服务。

促销限制:

用户对每个订阅群组至多享受一次促销。如果一个订阅群组里的多个商品均配置了促销活动,在用户尝试切换该订阅群组的其他商品时,用户只能享受在该订阅群组第一次遇到的促销。当切换订阅时在该订阅群组再次遇到促销,将不再享有促销资格。促销的享受资格不受订阅方式影响,无论是新发起的订阅,恢复订阅,还是切换订阅等,均遵从“用户对每个订阅群组至多享受一次促销”的原则,只要没有享受过该订阅群组的促销,就可以享受促销。

提供商品对应的服务

在应用提供服务前,始终应该先判断用户已购的订阅型商品的状态,以决定是否应该提供对应的服务。

可通过下面的方式获取购买详情InApppurchaseData

1. 在商品购买完成后,可以拿到HMS IAP的购买详情回调,提取返回信息里的InApppurchaseData

2. 可以通过IapClient.obtainOwnedPurchases() 查询已购的订阅型商品

对依赖当期续费情况的业务(比如:视频会员),如果InApppurchaseData.subIsvalid = true,则始终应该为用户提供商品对应的服务。

对其他自定义业务,如果需要往期的续费情况(比如:杂志订阅),可以通过IapClient.obtainOwnedPurchaseRecord() 查询所有订阅型商品的收据,收据格式同InApppurchaseData

1. 如果InApppurchaseData.purchaseState = 0,标识该订阅型商品为已购状态。

2. 识别从InApppurchaseData.purchaseTime到InApppurchaseData.expirationDate这个时间区间,表示商品的有效时间段

如果订阅型商品为已购状态,且商品有效时间段匹配上您合法的服务提供时间段,则应该提供商品对应的服务。

本质上,所有的订阅型商品都可以通过这种方式去判断是否应该提供服务。

订阅状态及续期处理

一般来讲,一个完整的订阅需具备以下几个阶段

  • 促销期:如果购买订阅型商品时,商品拥有促销价格且用户有资格享受,则用户成功订阅后将进入促销期。

  • 第一次续期:第一次按商品标准价格的续期处理,该标准价格为订阅时商品的当前价格。如果有享受促销期,且在促销期内,您有调整商品价格,此次续期不受您调整价格的影响。

  • 第二次续期及其他续期:与第一次续期不同的是,后续的每次续期都会在订阅关系过期前10天开始获取下次续期扣款的金额和商品状态,并基于更新后的订阅价格和商品状态来处理下一个续期。

  • 失效期:续期失败后进入失效期。失效期的订阅有30天的宽限期,在宽限期内,用户无法享受订阅商品的服务,但可以恢复订阅以再次享受应用提供的服务。

对于用户而言,订阅商品有如下几个状态:

  • 续期订阅商品处于有效状态,可以享受商品对应的服务,下一次的续期也将按期进行扣费以续期。

  • 到期订阅商品处于有效状态,可以享受商品对应的服务,但订阅续期已被用户取消,将不会进行下一次的续期扣费。

  • 已到期订阅商品处于失效状态,用户无法享受订阅商品的服务。原因是最近一次的续期扣费没有成功,用户取消订阅,用户不同意涨价或者是扣款账户发生了异常,均可导致订阅进入该状态。

  • 待生效:订阅商品还未开始生效,用户暂时还无法享受该订阅商品的服务。当用户在订阅组内进行切换订阅时,如果切换到一个下周期生效的订阅商品时,则新切换的商品处于待生效状态,需要等原订阅商品到期后才生效。在用户的切换操作完成后,原订阅商品会变为到期状态,而新切换的商品为待生效状态,并且会在原订阅商品的编辑订阅页内显示新切换商品的开始时间。

  • 暂停:用户可以在HMS Core(APK)的管理订阅页面,对当前正在续期的商品制定暂停续期计划。当暂停续期计划制定完成后,订阅处于暂停未生效状态,用户仍可以享受订阅商品的服务。在当前订阅周期结束后,订阅商品进入暂停生效状态,用户暂停享受订阅商品的服务。暂停期过后,订阅商品会自动续费。如果续费成功,订阅将重新进入续期状态。如果续费失败,则订阅为已过期状态。暂停计划可以随时调整,最大暂停期为3个月。用户可以随时取消暂停计划,以恢复订阅的自动续费状态,并立即享受订阅服务。

订阅续期处理

订阅商品下一个续期价格(包括原价、涨价和降价)是在续期前10天确定,该时间比1周的订阅周期长。因此对于订阅周期为1周的订阅商品,价格变化后的订阅商品在最近的两次自动续订仍然按照原价格进行,此后的价格将在10天前确认。

在订阅周期前24小时,华为IAP会尝试向用户发起扣款以完成订阅商品续期。若扣费失败,华为IAP会在一定期限内重复尝试扣费,若失败次数过多,最终会停止重试。

说明:
24小时内重试5次,之后如果失败则进入失效期,失效期每天尝试一次,之后结束尝试。

用户变更订阅关系

用户可以在HMS Core(APK)的订阅管理页面里,对订阅进行如下操作。

● 取消订阅:对已购订阅商品进行取消操作。取消成功,则订阅商品将不会进行下一周期的续费,但不影响当前周期对订阅商品的使用。

● 恢复订阅:对于处于取消状态或者是在失效期的订阅商品,用户可以恢复订阅,以再次享受订阅商品对应的服务。

● 暂停订阅:对于处于续期状态的订阅商品,用户可以暂停续期,以暂停一段时间的订阅服务。暂停期结束后,订阅将会自动续费。

● 切换订阅:对已购订阅商品,进行同一个订阅群组,不同订阅商品的切换操作,有如下两种生效机制:

1. 立即生效的切换订阅:用户原订阅商品的金额将会按比例退还到原始的付款方式,新的订阅商品将收取完整价格并立即生效。目前这种切换效果的触发场景为:原订阅商品的续费周期和即将更换的订阅商品续费周期相同。

2. 下周期生效的切换订阅:将原订阅商品设置为到期状态,新订阅商品为待生效状态,新订阅商品会在原订阅商品的下一次续费日期开始扣费并生效。目前这种切换效果的触发场景为:原订阅商品的续费周期和即将更换的订阅商品续费周期不同。

说明:
目前的订阅商品并没有等级的概念,我们后续将会实现订阅等级的概念。在加入等级后,对于切换订阅场景,切换机制会优先判断新订阅商品和原商品的等级关系,如果等级相同,则切换效果的触发场景不变。如果从低等级切换到高等级的升级切换订阅,效果为立即生效。如果是从高等级切换到低等级的降级切换订阅,效果为下周期生效。

修改订阅商品

调整订阅商品价格

您可以为每个订阅商品降低或提高价格。

  • 降低价格:对所有用户生效,包括已经订阅的用户和新订阅的用户,在订阅商品的下一次续费起生效。

  • 提高价格:当提高订阅商品价格时,有两种策略可选:

  1. 为已订阅的用户保留原价,对新订阅的用户使用新的价格。

  2. 对已订阅的用户生效。华为IAP会在下一个续期日提前10天通知已订阅的用户商品价格上涨以及新价格的收费日期。如果价格调整发生在订阅者下一结算周期开始的10天内,则将按照现有价格再续订一个结算周期,然后再在下一个结算周期结束提前10天通知已订阅的用户。

其他的限制还包括:

  • 订阅商品新的价格需要已订阅用户的同意,如果用户不同意,其订阅不会自动续期,直到用户同意涨价。

  • 在价格调整生效后,您将无法撤销。您可以计划新的价格调整从而实现降价,但此前因价格提高而选择停止续订的用户需要重新订阅。 

  • 如果用户支付了促销价格订阅商品且当前周期为以促销价格购买订阅商品的周期,则用户下一周期将按照原价进行订阅,再在下一个续费周期按照上述规则执行。

处理订阅商品下架

在处理自动续费订阅商品的下架时,需要考虑对用户的影响。

在您停止提供订阅服务前,您应该通过下架该商品来防止新用户订阅。建议您将自动续期订阅商品的下架时间与其续费周期相对应。例如,在订阅商品续费周期为1个月的情况下,您应该提前1个月将您的订阅下架,这可以在停止提供订阅商品服务之前让用户体验到完整时限的订阅商品服务,并且他们将不会在下一个订阅续期日期被收取费用。以此类推,对于续费周期为1周的订阅商品需要提前7天,对于续费周期为6个月的订阅商品需要提前6个月。当您将某个订阅商品下架时,您的用户将收到有关订阅终止通知。

提供订阅管理的页面跳转

开发者的应用可以通过startIapActivity接口跳转到华为IAP的管理订阅页面和编辑订阅页面。管理订阅页面展示的是当前用户在开发者的应用内已订阅的商品列表,编辑订阅页展示的是用户已在开发者的应用订阅的某个商品详情及该商品所在订阅组的其他商品的信息。


●  跳转到管理订阅页。

  1. StartIapActivityReq req = new StartIapActivityReq();
  2. req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_MANAGER_ACTIVITY);
  3. final Activity activity = getActivity();
  4. IapClient mClient = Iap.getIapClient(activity);
  5. Task<StartIapActivityResult> task = mClient.startIapActivity(req);
  6. task.addOnSuccessListener(new OnSuccessListener<StartIapActivityResult>() {
  7.    @Override
  8.    public void onSuccess(StartIapActivityResult result) {
  9.        Log.i("startIapActivity", "onSuccess");
  10.        if (result != null) {
  11.            result.startActivity(activity);
  12.        }
  13.    }
  14. }).addOnFailureListener(new OnFailureListener() {
  15.    @Override
  16.    public void onFailure(Exception e) {
  17.        Log.e("startIapActivity", "onFailure");
  18.    }
  19. });

●  跳转到编辑订阅页。

  1. StartIapActivityReq req = new StartIapActivityReq();
  2. req.setSubscribeProductId("XXX");
  3. req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_EDIT_ACTIVITY);
  4. final Activity activity = getActivity();
  5. IapClient mClient = Iap.getIapClient(activity);
  6. Task<StartIapActivityResult> task = mClient.startIapActivity(req);
  7. task.addOnSuccessListener(new OnSuccessListener<StartIapActivityResult>() {
  8.    @Override
  9.    public void onSuccess(StartIapActivityResult result) {
  10.        Log.i("startIapActivity", "onSuccess");
  11.        if (result != null) {
  12.            result.startActivity(activity);
  13.        }
  14.    }
  15. }).addOnFailureListener(new OnFailureListener() {
  16.    @Override
  17.    public void onFailure(Exception e) {
  18.        Log.e("startIapActivity", "onFailure");
  19.    }
  20. });

沙盒环境的订阅测试

您可以将对应的华为帐号添加到AppGallery Connect的测试帐号里,以实现用该帐号购买时进入沙盒环境的订阅测试。

为了帮助您快速测试应用的订阅场景,沙盒环境下的订阅续订时间会比正常情况更快。下面是具体的时间转换表:

实际时限

测试时限

1周

3分钟

1个月

5分钟

2个月

10分钟

3个月

15分钟

6个月

30分钟

1年

1小时

在测试过程中,请注意以下几点:

● 沙盒环境下发起订阅时仍需要完成签约或绑卡,但该过程不会发生扣费。

● 订阅在沙盒场景下会自动续期6次,6次之后需要用户主动发起恢复订阅,恢复订阅一次,则订阅商品会再续期一次。

● 沙盒测试拉起收银台时会弹出沙盒标志的弹框,收银台和成功页均有明确的沙盒环境标志,如下图。

建议沙盒场景下订阅续期处理和正式环境下订阅区分开,减少测试订单数据对正式订单数据的干扰。

接受订阅关键事件的通知

如果您在开发者联盟申请支付服务时提前配置了服务器回调地址,用户购买订阅型商品后,华为应用内支付服务器会在订阅场景的某些关键事件发生时调用此接口通知您配置的服务器。 主要涉及的场景如下:

  • 用户第一次订阅成功。

  • 因特殊原因运营客服主动取消用户的订阅。

  • 已过期的订阅自动续期成功。

  • 用户主动恢复一个已过期的订阅商品。

  • 用户调整订阅商品且在下个续订生效。

  • 用户主动或者App取消一个订阅商品,已经收费的服务仍然有效,但是后续续期会停止;

  • 用户主动恢复一个已经取消的订阅商品的续期状态;

  • 一个订阅商品成功续期后;

  • 一个到期的订阅商品进入账号保留期;

  • 用户同意一个订阅商品的价格上涨,后续续期将以更高的价格进行。

若开发者服务器返回结果为非成功响应(返回的http status code值为200之外的值),将对本次关键事件的通知进行周期性重发。建议在您的服务端完成最小处理后立即返回成功答应,避免通知消息堆积。

重发机制:共2天,前3次每20秒尝试一次,4-5次每200秒尝试一次,6-16次每30分钟尝试一次,之后每3小时尝试一次,直到2天结束。

搜索
请输入您想要搜索的关键词