添加一次性商品专用功能

本文档介绍了如何实现一次性商品专用功能。

Google Play 结算服务支持以下类型的一次性商品:

  • 非消耗型一次性商品 - 是指能够产生永久效应的商品,如付费升级。为避免用户重新购买此类商品,您不应将它们指示为正在消耗。

  • 消耗型一次性商品 - 是指暂时享用并且可以重新购买的商品,如额外的游戏代币或游戏生命。要使消耗型一次性商品可供再次购买,您需要向 Google Play 发送消耗请求。

指示已消耗一次性商品

要指示已消耗一次性商品,请在 BillingClient 实例上调用 consumeAsync(),并添加 Google Play 应在重新购买时提供的购买令牌。此外,您还必须传递一个实现 ConsumeResponseListener 接口的对象。该对象将处理消耗操作所得到的结果。您可以替换 ConsumeResponseListener 接口的 onConsumeResponse() 方法,Google Play 结算库会在操作完成时调用该方法。

如果成功购买商品,系统会生成购买令牌,它是一个唯一标识符,表示用户已购买的单个应用内商品。您还可以通过在 Purchase 对象上调用 getPurchaseToken() 来检索关联的令牌。

以下示例说明了如何使用关联的购买令牌来消耗商品:

Kotlin

val consumeParams =
    ConsumeParams.newBuilder()
        .setPurchaseToken(/* token */)
        .setDeveloperPayload(/* payload */)
        .build()

billingClient.consumeAsync(consumeParams, { billingResult, outToken ->
    if (billingResult.responseCode == BillingResponse.OK) {
        // Handle the success of the consume operation.
        // For example, increase the number of coins inside the user's basket.
    }
})

Java

ConsumeParams consumeParams =
    ConsumeParams.newBuilder()
        .setPurchaseToken(/* token */)
        .setDeveloperPayload(/* payload */)
        .build();

ConsumeResponseListener listener = new ConsumeResponseListener() {
    @Override
    public void onConsumeResponse(BillingResult billingResult, String outToken) {
            if (billingResult.getResponseCode() == BillingResponse.OK) {
                // Handle the success of the consume operation.
                // For example, increase the number of coins inside the user's basket.
    }
};

billingClient.consumeAsync(consumeParams, listener);

由于消耗请求偶尔会失败,因此您必须检查安全后端服务器,以确保每个购买令牌都还没用过。或者,您也可以等到从 Google Play 接收成功的消耗响应,然后再配置商品。如果您选择在 Google Play 发送成功的消耗响应之前不让用户消耗所购商品,那么您必须非常小心,不要忘记跟踪消耗请求后的购买交易。

实现促销活动

利用促销活动或促销代码,您可以向有限数量的用户免费提供一次性商品。用户在您的应用或 Google Play 商店应用中输入促销代码,即可免费获得相应商品。您可以充分发挥创意,通过多种方式利用促销代码来吸引用户,这些方式包括:

  • 您可以在活动中分发带促销代码的卡片,用户输入他们收到的促销代码即可将一个特殊的游戏内道具解锁。
  • 您可以向员工提供代码,以便他们与亲朋好友分享。
  • 您可以向在特定时间段内购买您应用的用户发送促销代码。

您可以通过 Google Play 管理中心为您的一次性商品分配促销代码。要为一次性商品创建促销代码,请参阅创建促销活动

兑换促销代码

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

  • 在 Google Play 商店应用中手动输入代码。
  • 点击 Google Play 购买屏幕中的付款方式旁边的向下箭头,然后点击“兑换”链接。

图 1 显示了带有向下箭头的购买屏幕。图 2 显示了“兑换”链接。图 3 显示了用户输入促销代码的屏幕。

图 1. Google Play 的“兑换”屏幕。
图 2. Google Play 的“兑换”按钮。
图 3. 促销代码屏幕。

生成促销代码网址

兑换促销代码时,用户可以在 Google Play 商店中手动输入促销代码。或者,您也可以生成一个网址,使用户转到 Google Play 商店并自动填写输入代码字段。促销代码网址采用以下格式:

https://play.google.com/redeem?code=promo_code

图 4 显示了 Google Play 应用的“兑换代码”对话框:

图 4. Google Play 应用的“兑换代码”对话框。

在用户按兑换按钮后,Google Play 商店会提示用户打开相应应用。否则,Google Play 商店会提示用户更新或下载您的应用。

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

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

Activity 的 onPurchasesUpdated() 方法将接收一个响应 Intent,确定何时完成了购买。不过,如果购买和消耗工作流程未完成,那么您的应用仍应在 onStart()onResume() 中调用 queryPurchases()。例如,如果用户成功兑换了促销代码,但您的应用在用户消耗商品之前崩溃,那么在它下次启动并调用 queryPurchases() 时,仍会收到有关该购买交易的信息。

您的应用还应支持用户在其运行时通过 Google Play 商店应用兑换促销代码的情形。您的应用可以通过 onPurchasesUpdated() 监听器了解兑换的相关信息。

后续步骤

添加一次性商品专用功能后,请参阅最佳做法