实现应用内购买结算
官方连接
在Google Play上,应用内购买结算提供了一个直接、简单的界面,让您能够通过Google Play发送应用内购买结算请求并管理相关交易。以下内容将介绍如何使用API版本3来调用应用内购买结算服务的基本知识。
请参考出售应用内商品培训课程,以了解完整实现和测试您的应用的方法。该培训课程提供了一个示例应用内购买结算应用的完整案例,包括多种工具类,方便处理关键任务(例如设置连接、发送购买结算请求、处理来自Google Play的响应以及管理后台线程),从而使您能够从主Activity调用应用内购买结算功能。
在开始之前,请务必阅读应用内购买结算概览,以便熟悉相关概念,使您能够轻松地实现应用内购买结算。
要在您的应用中实现应用内购买结算,您需要执行以下操作:
- 将应用内购买结算库添加到您的项目中。
- 更新您的
AndroidManifest.xml
文件。 - 创建
ServiceConnection
并将其绑定到IInAppBillingService
。 - 从您的应用发送应用内购买结算请求至
IInAppBillingService
。 - 处理来自 Google Play 的应用内购买结算请求响应。
将 AIDL 文件添加到您的项目中
IInAppBillingService.aidl
是一个使用 Android 接口定义语言 (AIDL) 定义的应用内购买结算版本 3 的服务接口文件。您可以通过调用 IPC 方法来发送结算请求,使用此接口进行操作。
要获得AIDL文件,请按照以下步骤进行操作:
- 打开 Android SDK 管理器。
- 在 SDK 管理器中,展开
Extras
部分。 - 选择 Google Play Billing Library。
- 点击 Install packages 完成下载。
IInAppBillingService.aidl
文件将被安装到 <sdk>/extras/google/play_billing/
目录下。
如果您想将AIDL添加到您的项目中,请按照以下步骤进行操作:
- 首先,下载 Google Play Billing Library 到您的 Android 项目:
- 选择 Tools > Android > SDK Manager。
- 在 Appearance & Behavior > System Settings > Android SDK 下面,选择 SDK Tools 标签以选择并下载 Google Play Billing Library。
- 接下来,复制
IInAppBillingService.aidl
文件到您的项目。- 如果您使用的是 Android Studio,请执行以下操作:
- 导航至 Project 工具窗口中的
src/main
。 - 选择 File > New > Directory,然后在 New Directory 窗口中输入
aidl
,再选择 OK。 - 选择 File > New > Package,然后在 New Package 窗口中输入
com.android.vending.billing
,再选择 OK。 - 使用您的操作系统文件资源管理器,导航至
<sdk>/extras/google/play_billing/
,复制IInAppBillingService.aidl
文件,然后将其粘贴到项目中的com.android.vending.billing
软件包。
- 导航至 Project 工具窗口中的
- 如果您在非 Android Studio 环境中开发,请执行以下操作:创建目录
/src/com/android/vending/billing
,并将IInAppBillingService.aidl
文件复制到此目录。 将 AIDL 文件添加到您的项目中并使用 Gradle 工具构建项目,从而生成IInAppBillingService.java
文件。
- 如果您使用的是 Android Studio,请执行以下操作:
- 开发您的应用。您会在项目的
/gen
目录中看到名为IInAppBillingService.java
的生成文件。
更新您的应用清单
Google Play应用是应用内购买结算的关键,它负责处理应用与Google Play服务器之间的所有通信。为了使用Google Play应用,您的应用必须请求适当的权限。您可以通过在AndroidManifest.xml文件中添加com.android.vending.BILLING权限来实现此操作。如果您的应用未声明应用内购买结算权限,但试图发送结算请求,Google Play将拒绝该请求并返回错误响应。
为了给您的应用程序授予所需的权限,请在AndroidManifest.xml
文件中添加以下代码行:
```java创建 ServiceConnection
为了实现应用与 Google Play 之间的通信,您的应用需要拥有一个
```ServiceConnection
。请按照以下步骤操作:
- 绑定到
IInAppBillingService
。 - 发送结算请求(作为 IPC 方法调用)至 Google Play 应用。
- 处理每个结算请求返回的同步响应消息。
绑定到 InAppBillingService
为了在Google Play上与应用内购买结算服务建立连接,请实现ServiceConnection接口,以便将您的Activity绑定到IInAppBillingService。一旦建立连接,您需要重写onServiceDisconnected和onServiceConnected方法,以获取IInAppBillingService实例的引用。
IInAppBillingService mService; ServiceConnection mServiceConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = I注意:为了保障结算交易的安全性,请始终确保使用下面示例中所示的
setPackage()
方法,明确地将 Intent 的目标软件包名称设置为com.android.vending
。通过明确地设置软件包名称,可以确保只有 Google Play 应用能够处理来自您的应用的结算请求,并防止其他应用拦截这些请求。@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);}现在,您可以使用 mService 引用来与 Google Play 服务通信。
重要声明:在完成您的活动后,请务必解除与应用内购买结算服务的绑定。如果不解除绑定,已开启的服务连接可能会导致您设备性能下降。以下示例演示了如何通过重写活动的onDestroy方法来解除与应用内购买结算服务连接mServiceConn的绑定操作。
如果您需要了解完整的绑定到IInAppBillingService的服务连接实现,请参考销售应用内商品培训课程和相关示例。发起应用内购买结算请求
连接您的应用到Google Play后,您可以通过应用内购买请求来向用户提供商品。Google Play为用户提供了一个结账界面,让他们可以方便地选择付款方式,这样您的应用就不需要直接处理付款交易。一旦用户购买了商品,Google Play会识别并记录用户拥有该商品,并在消耗之前阻止其购买具有相同商品ID的其他商品。您可以控制如何在应用中使用已购买的商品,并告知Google Play该商品是否可再次购买。此外,您还可以通过查询Google Play快速获取用户的购买列表信息。这对于恢复用户之前的购买记录非常有帮助,在用户启动应用时尤其适用。
查询可供购买的商品
您可以在应用中使用 Google Play 的 In-app Billing Version 3 API 来查询商品的详细信息。为了将请求传递给应用内购买结算服务,您需要首先创建一个包含商品 ID 字符串的 Bundle 对象,该字符串使用键“ITEM_ID_LIST”进行标识,每个字符串代表一个可购买商品的商品 ID。
请调用 In-app Billing Version 3 API 的 getSkuDetails 方法,使用以下代码将商品信息添加到 Bundle 中: ```java ArrayList skuList = new ArrayList(); skuList.add(premiumUpgrade); skuList.add(gas); Bundle querySkus = new Bundle(); querySkus.putStringArrayList(ITEM_ID_LIST, skuList); ``` 然后,将 In-app Billing API 版本(3)、应用的软件包名称、商品类型(应用内)以及创建的 Bundle 作为参数传递给方法,以便从 Google Play 检索此信息。如果请求成功,通过调用mService.getSkuDetails(3, getPackageName(), inapp, querySkus)方法,将返回一个Bundle对象。在这个Bundle对象中,会包含响应代码BILLING_RESPONSE_RESULT_OK (0)。警告:请勿在主线程上调用
getSkuDetails
方法,因为这会导致网络请求并阻塞主线程。建议您创建一个独立的线程,并在该线程内部调用getSkuDetails
方法。如果您想了解所有可能的响应代码,请在Google Play上查看应用内购买结算参考。
查询结果将被保存在一个名为 DETAILS_LIST 的字符串 ArrayList 中。购买信息以 JSON 格式的字符串存储。如果想查看返回商品类型的详细信息,请参考应用内购买结算参考。
在此示例中,您将从之前代码段返回的 skuDetails
Bundle
中检索您的应用内商品的价格。int response = skuDetails.getInt(RESPONSE_CODE); if (response == 0) { ArrayList responseList = skuDetails.getStringArrayList(DETAILS_LIST); for (String thisResponse : responseList) { JSONObject object = new JSONObject(thisResponse); String sku = object.getString(productId); String price = object.getString(price); if (sku.equals()Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(), sku, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");如果请求成功,返回的
Bundle
将包含响应代码BILLING_RESPONSE_RESULT_OK
(0) 和您可以用于开始购买流程的PendingIntent
。 如果您想了解所有可能的响应代码,请在Google Play上查看应用内购买结算参考。 接下来,请使用键BUY_INTENT
从响应Bundle
中提取PendingIntent
。要完成购买交易,请使用以下代码调用startIntentSenderForResult方法,并传入您创建的PendingIntent对象: ``` PendingIntent pendingIntent = buyIntentBundle.getParcelable(BUY_INTENT); startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), 0, 0, 0); ``` 在此示例中,请求代码使用任意值1001。startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));Google Play 会将对您
PendingIntent
的响应发送至应用的onActivityResult
方法。onActivityResult
方法将获得结果代码Activity.RESULT_OK
(1) 或Activity.RESULT_CANCELED
(0)。要查看响应Intent
中返回的订单类型信息,请参阅应用内购买结算参考。购买订单的数据以 JSON 格式的字符串呈现,会映射到响应 Intent 中的 INAPP_PURCHASE_DATA 键。例如:
'{ "orderId":"GPA.1234-5678-9012-34567", "packageName":"com.example.app", "productId":"exampleSku", "purchaseTime":1345678900000, "purchaseState":0, "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ", "purchaseToken":"opaque-token-up-to-1000-characters" }'注:Google Play 会为购买生成令牌。此令牌是不透明的字符序列,最长可为 1,000 字符。 将整个令牌传递至其他方法(例如在您消耗购买时,如消耗购买中所述)。 不要省略或者截断此令牌,您必须保存并返回整个令牌。
延续之前的例子,您将从响应
Intent
中获取响应代码、购买数据和签名信息。@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1001) { int responseCode = data.getIntExtra("RESPONSE_CODE", 0); String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); if (resultCode == RESULT_OK) { try { JSONObject jo = new JSONObject(purchaseData); String sku = jo.getString("productId"); alert("You have bought the " + sku + ". Excellent choice, adventurer!"); } catch (JSONException e) { alert("Failed to parse purchase data."); e.printStackTrace(); } } }}安全性建议:在您发送购买请求时,请创建一个可以对此购买请求进行唯一标识的字符串令牌并在
developerPayload
中包含此令牌。您可以将随机生成的字符串作为令牌。 从 Google Play 接收到购买响应时,请确保检查返回的数据签名、orderId
和developerPayload
字符串。 为了增强安全性,您应在自己安全的服务器上执行检查。 请确保验证orderId
为您之前未处理的唯一值,且developerPayload
字符串与您之前通过购买请求发送的令牌相匹配。查询已购买商品
为了获取用户所发起购买的相关信息,请在应用内购买结算版本 3 服务上调用 getPurchases 方法。您需要传递 In-app Billing API 版本(3)、发起调用的应用的软件包名称以及商品类型(应用内或订阅)给该方法。
通过mService.getPurchases(3, getPackageName(), inapp, null)方法,可以获取到当前登录设备用户账户发起的购买商品列表。如果请求成功,返回的Bundle中会包含响应代码0。此外,响应的Bundle还会包含商品ID列表、每个购买订单的详情以及每个购买订单对应的签名信息。为了提高性能,当第一次调用getPurchase时,应用内购买结算服务将仅返回用户拥有的最多700个商品。如果用户拥有大量商品,Google Play会在响应Bundle中包含一个映射到键INAPP_CONTINUATION_TOKEN的字符串令牌,以表示可以检索更多的商品。然后,您的应用可以进行后续的getPurchases调用,并将此令牌作为参数传递。Google Play会继续在响应Bundle中返回继续令牌,直到所有用户拥有的商品都发送到您的应用。
如果您想详细了解由
getPurchases
返回的数据,请查阅应用内购买结算参考。以下示例展示了如何从响应中提取这些数据。int response = ownedItems.getInt(RESPONSE_CODE); if (response == 0) { ArrayList ownedSkus = ownedItems.getStringArrayList(INAPP_PURCHASE_ITEM_LIST); ArrayList purchaseDataList = ownedItems.getStringArrayList(INAPP_PURCHASE_DATA_LIST); ArrayList signatureList = ownedItems.getStringArrayList(INAPP_DATA_SIGNATURE_LIST); String continuationToken = ownedItems.getString(INAPP_CONTINUATION_TOKEN); for (int i = 0; i重要声明:您可以使用托管的应用内商品进行消费,但无法使用其来购买订阅服务。
如何在应用中使用消耗机制取决于您。一般来说,您可以选择对那些用户可能多次购买且能够提供短期效益的应用内商品进行消耗,比如游戏中使用的货币或设备。而对于那些只需购买一次且具有永久效果的应用内商品,例如高级版升级,通常不需要实现消耗机制。
为了记录购买消耗,请使用
consumePurchase
方法发送到应用内购买结算服务,并在purchaseToken
字符串值中传递要移除购买的标识。这个purchaseToken
是由Google Play服务在成功的购买请求后返回的INAPP_PURCHASE_DATA
字符串数据的一部分。在这个示例中,您将把使用purchaseToken
标识的商品消耗记录在变量
还木有评论哦,快来抢沙发吧~