前言
最近在做国际版的google 支付,google pay 中遇到不少坑,这里做个记录。也算为广大的android 开发者们 踩踩坑
文章内容简介
- 开发者账号申请
- google pay console 配置
- 代码书写
- 填坑
集成
1. 开发者账号申请
这里就根据 Android开发-Google登录这文章中进行申请注册就可以,本文不在过多介绍
2. google pay console 配置
(1)创建应用
首先登陆 Google Play 管理中心
然后会进入商品详情界面,这里面有几个必须要填写的 不要偷懒,该填写的还是要填写。
填写完成以后 ,点击右下角 保存草稿
(2)发布版本
然后你会发现你TMD 怎么那么多渠道,不慌,找到年内部测试渠道,(先不要纠结要不要全上了,一个一个来)
按照提示说明,将数据填写完成,上传apk (必须上传release的)然后点
击保存 ---》查看,
这个时候你会发现
为啥不能发布????
还记的刚刚我们看到的内容分级么,这个时候回去 把他完成了
点击商品详情
找到刚刚看到的内容分级,按照要求填写完成即可
目前的进度
OK 下面去点击定价
(3)定价和分发范围
如果你的APP 是付费就付费,应用内购买不算付费,这个时候 应该全部点亮了。然后找到应用版本,去点击发布,这个时候神奇的发现,TMD 终于可以发布了
此时还不算真的发布了
只有状态是已发布才行,
[图片上传中...(屏幕快照 2019-01-07 下午6.39.10.png-9d6f7f-1546857578499-0)]
PS 快下班了,就偷个懒,给各位看官看已发布的那个,不一步一步来了,
(4)配置应用内商品
3. 代码书写
官网文档
Use the Google Play Billing Library
In-app Billing API
在文档上介绍的
如果您需要直接与应用内结算服务进行互动,请使用AIDL进行应用内结算。
这里先介绍第一种方式,第二种方式 后面再介绍
将Google Play结算添加到应用的步骤如下:
- 更新应用的依赖项。
- 连接到Google Play。
- 查询应用内商品详细信息。
- 允许购买应用内商品。
- 查询购买的商品。
- 添加一次性产品特定或订阅特定代码(在单独的页面上介绍)。
(1)更新应用的依赖项。
implementation 'com.android.billingclient:billing:1.2'
(2)连接到Google Play
// create new Person
private BillingClient mBillingClient;
...
mBillingClient = BillingClient.newBuilder(mActivity).setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@BillingResponse int billingResponseCode) {
if (billingResponseCode == BillingResponse.OK) {
// The billing client is ready. You can query purchases here.
}
}
@Override
public void onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
}
});
(3)查询应用内商品详细信息
List skuList = new ArrayList<> ();
//这里填写自己的商品ID 官网的只是个示例
skuList.add("premium_upgrade");
skuList.add("gas");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List skuDetailsList)
// Process the result.
}
});
得到详情
if (responseCode == BillingResponse.OK
&& skuDetailsList != null) {
for (SkuDetails skuDetails : skuDetailsList) {
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
if ("premium_upgrade".equals(sku)) {
mPremiumUpgradePrice = price;
} else if ("gas".equals(sku)) {
mGasPrice = price;
}
}
}
(4)允许购买应用内商品
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSku(skuId)
.setType(SkuType.INAPP) // SkuType.SUB for subscription
.build();
int responseCode = mBillingClient.launchBillingFlow(flowParams);
回调
@Override
void onPurchasesUpdated(@BillingResponse int responseCode, List purchases) {
if (responseCode == BillingResponse.OK
&& purchases != null) {
for (Purchase purchase : purchases) {
handlePurchase(purchase);
}
} else if (responseCode == BillingResponse.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
} else {
// Handle any other error codes.
}
}
混淆
-keep class com.android.vending.billing.**
4. 填坑
(1)沙盒测试
如果你不想真的付钱,那么你就需要配置沙盒测试人员。
找到版本管理---》应用版本----》内部测试(一开始配置的)----》管理测试人员
(2)显示无法购买商品,
这是因为 你只是添加了人家作为你的内部测试人员,人家还没打印呢,所以,你需要邀请他们加入您的内部测试,如上图,可以看到,加入测试的网站。发送给你添加的测试账号 完成邀请及可,
(3)无法调出支付界面
首先要手机保证科学上网。其次。大部分的国内手机都是不行的,不行的,不行的,那就有人问了,那怎么测试,我的测试使用的是三星S8P。测试通过,但是小米系列就不行,
(4)为啥三星手机也不行,
google pay 需要安装google play 等一些开发环境,在科学上网的前提下,下载google play,会安装一系列的环境,总的来说,当你能有google play 下载软件了,基本上就差不多了,
(5)同一个商品ID 为啥不能购买多次
哥 你买的 的通知一下啊直接上代码
@Override
public void onPurchasesUpdated(int responseCode, @Nullable List purchases) {
if (responseCode == BillingClient.BillingResponse.OK
&& purchases != null) {
if (listener != null) {
listener.onPaySuccess();
}
for (Purchase purchase : purchases) {
com.orhanobut.logger.Logger.i("[google pay] purchase:" + purchase.toString());
mBillingClient.consumeAsync(purchase.getPurchaseToken(), (responseCode1, purchaseToken) -> {
com.orhanobut.logger.Logger.i("[google pay] consumeAsync responseCode1" + responseCode1 + " purchaseToken:" + purchaseToken);
});
}
} else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {
if (listener != null) {
listener.onPayCancel();
}
} else {
if (listener != null) {
listener.onPayError(responseCode);
}
}
}
后记
如果有错误的地方,请指出,一直认为分享是进步最快的方式,去年一年没怎么写文章,比较忙,今年的第一篇文章,感谢各位看官。