应用内促销

利用促销代码,您可以向有限数量的用户免费提供内容或功能。 创建促销代码后,您可以按照服务条款向选定的用户 分发。 用户在您的应用或 Google Play 商店应用中输入促销代码后就可以免费接收相应的内容或功能。 您可以充分发挥创意,通过多种方式利用促销代码来吸引用户,这些方式包括:

  • 游戏可以只向参加某个活动的玩家提供特殊道具,例如角色或者装饰。 开发者可以在活动中分发带促销代码的卡片,用户输入他们收到的促销代码即可将这些卡片解锁。
  • 应用开发者可以在局部范围内分发促销代码,以鼓励潜在的用户试用应用。
  • 应用开发者可以向其员工提供朋友和家人代码,让他们与好友分享。

每个促销代码都与特定的商品 ID(也称为 SKU)关联。 您可以为现有的应用内商品创建促销代码。 您也可以在 Play 商店内设置 SKU,因此,获得该商品的唯一方式就是输入相应 SKU 的促销代码。 当用户在 Play 商店或应用中输入促销代码后,他们就可以获得该商品,就像付全款购买一样。 如果您的应用已经使用应用内购买结算版本 3 来支持应用内购买,则添加对促销代码的支持就非常容易。

创建和兑换促销代码

您可以通过 Google Play Developer Console 创建促销代码。 每个促销代码都与在 Developer Console 中注册的一种商品关联。

用户可通过以下两种方式之一兑换促销代码:

  • 用户可以在应用的普通购买流程中输入促销代码,如实现应用内购买结算中所述。 对于应用来说,这就类似于普通购买,只不过用户在此过程中使用促销代码而不是自己的资金进行付款。
  • 用户随后可以在 Google Play 商店应用中兑换此代码。在用户输入代码后,Play 商店将提示用户打开应用(如果已经安装最新版本),或者下载或升级应用。 目前,Google 不支持从网页版 Google Play 商店兑换促销代码。

在您的应用中支持促销代码

要支持促销代码,无论在启动还是恢复时,您的应用都必须调用 getPurchases() 方法。 此方法将返回当前未消耗的所有购买商品,包括用户通过兑换促销代码发起的购买。 最简单的方式是在您 Activity 的 onResume() 方法中调用 getPurchases(),因为该回调会在 Activity 创建和取消暂停时触发。 在启动和恢复时调用 getPurchases() 可以确保您的应用了解用户在其未运行时可能发起的所有购买和兑换的相关信息。 此外,如果用户在应用运行时发起购买但应用由于某种原因未能处理,您的应用也可以在 Activity 下一次恢复并调用 getPurchases() 时了解购买的相关信息。

您的应用应允许用户在其内部兑换促销代码。 如果您的应用支持应用内购买工作流程(发起应用内购买结算请求中有所介绍),它将自动支持促销代码的应用内兑换。 在您启动应用内购买 UI 时,用户可以选择使用促销代码为购买的商品付款。 您 Activity 的 onActivityResult() 方法将接收到一个响应 Intent,告知应用购买是否已经完成。 不过,如果购买和消耗工作流程未完成,您的应用在启动和恢复时仍应当调用 getPurchases()。 例如,如果用户成功兑换了促销代码但您的应用在商品被消耗完之前崩溃,则在其下次启动并调用 getPurchases() 时,您的应用仍会收到有关购买的信息。

您的应用还应支持用户在其运行时通过 Play 商店应用兑换促销代码的情形。 通过侦听 PURCHASES_UPDATED Intent,您的应用可以在用户兑换代码时立即收到相关信息。 每当用户兑换促销代码时,Play 商店都会触发此 Intent。

要侦听 PURCHASES_UPDATED intent,请动态创建一个 BroadcastReceiver 对象并进行注册,让其侦听 com.android.vending.billing.PURCHASES_UPDATED, 在您 Activity 的 onResume() 方法中插入与下面类似的代码,注册接收器。

IntentFilter promoFilter =
    new IntentFilter("com.android.vending.billing.PURCHASES_UPDATED");
registerReceiver(myPromoReceiver, promoFilter);

当用户购买时,系统将调用您的广播接收器的 onReceive() 方法。 该方法必须调用 getPurchases() 才能查看用户已经购买的商品。

要减少系统在应用未运行时的开销,您 Activity 的 onPause() 方法必须取消注册广告接收器:

unRegisterReceiver(myPromoReceiver);

:请不要在应用清单中注册此广告接收器。 如果用户在应用未运行时发起购买,在清单中声明接收器会导致系统启动应用来处理 Intent。 这种行为不是必要行为,并且可能会让用户感到厌烦。 要查找用户在应用未运行时发起的任何购买,请在用户启动应用时调用 getPurchases()

测试应用内促销

如果您的应用支持应用内促销,请测试以下用例。

用户在应用内兑换促销代码

如果用户在应用的购买流程中兑换促销代码(如发起应用内购买结算请求中所述),系统将调用您 Activity 的 onActivityResult() 方法来处理购买。 验证 onActivityResult() 可以正确处理购买,无论用户使用资金支付还是使用促销代码支付。

用户在 Google Play 商店内兑换促销代码

如果用户在 Play 商店中兑换促销代码,则可能存在多种可能的工作流程。 验证下面的每一种工作流程。

应用未安装

如果用户为设备上未安装的某款应用兑换促销代码,Play 商店将提示用户安装该应用。 (如果应用已安装但不是最新版本,Play 商店将提示用户更新应用。) 在未安装您应用的设备上测试以下顺序。

  1. 用户在 Play 商店中为应用兑换促销代码。Play 商店提示用户安装您的应用。
  2. 用户安装并启动您的应用。验证应用在启动时是否可调用 getPurchases() 并正确检测用户使用促销代码发起的购买。

应用已安装但未运行

如果用户为设备上已安装的某款应用兑换促销代码,Play 商店将提示用户切换到该应用。 在已安装您的应用但并未运行应用的设备上测试以下顺序:

  1. 用户在 Play 商店中为应用兑换促销代码。Play 商店提示用户切换到您的应用。
  2. 用户启动您的应用。验证应用在启动时是否可调用 getPurchases() 并正确检测用户使用促销代码发起的购买。

应用已安装并且正在运行

如果用户为设备上当前正在运行的某款应用兑换促销代码,Play 商店将通过 PURCHASES_UPDATED Intent 通知应用。 测试以下顺序:

  1. 用户启动应用。验证您的应用是否可正确注册以接收 PURCHASES_UPDATED Intent。
  2. 用户启动 Play Store 应用并为应用兑换促销代码。Play 商店触发 PURCHASES_UPDATED Intent。 验证您应用的 BroadcastReceiver.onReceive() 回调是否触发以处理 Intent。
  3. 您的 onReceive() 方法应通过调用 getPurchases() 来响应该 Intent。 验证您的应用是否可调用此方法并能正确检测用户使用促销代码发起的购买。
  4. 用户切换回您的应用。验证用户是否已购买该商品。