一 简介
Google in app billing 是 Google Play 商店的应用内支付服务。它是一种应用内虚拟道具支付服务,支持应用内支付(inapp)和订阅(subs)两种模式。
在中国,如果您的应用需要集成此服务,请注意以下三点:
- in app billing不支持中国服务,不能绑定国内的信用卡(借记卡)
- in app的受管理商品中的本地价格不支持人民币
- 支付金额中会收取30%的手续费
当然,这些问题都是可以解决的。因为Google Play的应用内支付已成为国外用户主流消费模式之一。然而,许多应用仍需要在集成过程中面临一些挑战,例如:
国际版应用中的虚拟道具销售,以及付费应用中的关卡版本销售等等。
本文旨在介绍和解读in-app支付集成的version 3版本。
二 实现步骤
请注意,您需要先在Google Play开发者平台注册开发者账号并绑定应用。注册和绑定的详细步骤可在以下网址查看:http://play.google.com/apps/publish/
1 : 服务集成
请查阅官方网站,其中提供了详细示例供您参考,无需使用翻墙工具。
以下是对上述链接地址的简要步骤介绍:
请打开SDK Manager,在Extras文件夹中下载Google Play计费库。
接下来,您可以在本地的SDK的play_billing目录中找到以下文件列表:
Samples是官方提供的演示示例,只需修改包名即可直接集成到您自己的项目中。而IInAppBillingService.aidl则是我们需要在项目中集成的AIDL文件。
集成步骤非常简单。我直接修改了官网提供的示例代码,并将其打包成了一个jar包(点击此处下载)。当然,大家也可以根据自己的需求进行封装和使用。最终,在我的集成项目中,只需要包含这两个文件即可。当然,不要忘记在Manifest文件中添加相关权限。
2 : 支付流程
注意: 官网提供了最详细的支付流程说明,无需使用翻墙工具。
下面是基本序列图:
注: 这个序列图主要是针对非消耗性的管理商品
,购买一次即为被拥有状态,无法再次购买.
通过观察上图,我们可以得出结论:App的后台不直接参与Google in app支付处理,而是由客户端和Google Play直接完成。其中,与客户端进行两次对接的目的是:
一: 为了保障安全性,我们采取了在App客户端中不直接明文写入Google Play的key的措施,而是通过我们自己的后台进行拉取。 二: 在完成购买后,订单信息会被上传至我们自己的服务器。这样既能够保存订单记录,又能够有效管理用户购买商品的相关信息。
非消耗性商品
根据提供的key值,初始化相应的工具类。
private void initBilling() { //需要传入的key值 String base64EncodedPublicKey = "你的google play key "; mHelper = new IabHelper(this, base64EncodedPublicKey.trim()); //开启调试 mHelper.enableDebugLogging(true); startUp(); }
key值在Google控制台的如下位置;
连接服务正在进行连接测试,以确保与Google Play的连接正常。
private void startUp() {
if (null == mHelper) return;
// Check connection to service
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult iabResult) {
// Implementation for when IAB setup is finished
}
});
} List additionalSkuList = new ArrayList();
additionalSkuList.add(SKU_POPCOIN);
additionalSkuList.add(SKU_POPCOIN1); 如果mHelper为null,则直接返回。否则,调用mHelper的flagEndAsync()方法,并使用mHelper的launchPurchaseFlow()方法来启动购买流程,传入参数包括当前对象(this),SKU_POPCOIN,BILL_REQUEST_CODE,mPurchaseFinishedListener以及WDApp.getInstance().getLoginUserId()。 ```
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == BILL_REQUEST_CODE) {
if (mHelper == null) return;
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
// Handle the result here
}
}
}
``` 
通过如下方法消耗:
以下是改写后的文案:
主要有两个调用点:
1. 在购买成功后,调用消耗已拥有商品的状态。
2. 在查询商品时,判断是否存在已拥有商品的状态,如果存在,则进行状态消耗。 mConsumeFinishedListener是一个回调接口,用于返回商品消耗是否成功。
// Called when consumption is complete IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result); // if we were disposed of in the meantime, quit. if (mHelper == null) return; if (result.isSuccess()) { //消费成功 Log.d(TAG, "Consumption successful. Provisioning."); } else { showToast("Error while consuming: " + result); } Log.d(TAG, "End consumption flow."); } };
测试
注: 务必参考的官方测试文档
准备
- 支持Google Play 商店的 Android 手机
- Google Play支持的非国内信用卡(借记卡)
主要步骤
1. 将一个已经集成了Google支付的应用程序上传到Google Play控制台的Beta或Alpha渠道上。
2. 创建一个受管理的商品列表,其中包含您要销售的商品,包括ID、价格和描述等信息。
3. App开发者平台账号需要绑定一张信用卡(用于收款)。
4. 添加测试账号,但不能使用App平台账号作为测试账号。
5. 通过发布测试版本后,会生成一个测试下载链接,请将此链接发送给需要进行测试的人员,并让他们点击以成为测试员。
6. 测试账号需要绑定一张非国内支持Play商店支付功能的信用卡。


注意:
1. 测试过程不会产生任何费用。
2. 上传的版本需要在原版本的基础上进行增加,只需上传一次测试版。一旦连接成功,即使存在错误也无需再次上传,直接使用修改后的版本进行测试即可。
3. 必须使用相同签名,并确保不同版本之间签名保持一致。
4. 包名必须与控制台中的包名完全匹配。
还木有评论哦,快来抢沙发吧~