Android Google Pay 集成
Posted Android-kongqw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Google Pay 集成相关的知识,希望对你有一定的参考价值。
android Google Pay 集成
官方文档:https://developer.android.com/google/play/billing/billing_library_overview
Google Play支持商品内购和订阅
这里主要记录了内购的集成过程,语言:Kotlin
集成
1. 添加依赖
dependencies
...
implementation 'com.android.billingclient:billing:1.2'
2. 添加权限
需要使用Google Play 内购功能,必须添加权限,否则无法支付。
<!-- Google Play 内购权限 -->
<uses-permission android:name="com.android.vending.BILLING" />
网络及其他必要权限自行添加就好了。
3. 初始化
private var billingClient: BillingClient = BillingClient.newBuilder(context).setListener responseCode: Int, purchases: MutableList<Purchase>? ->
if (responseCode == BillingClient.BillingResponse.OK && purchases != null)
// TODO 支付完成
else if (responseCode == BillingClient.BillingResponse.USER_CANCELED)
// Handle an error caused by a user cancelling the purchase flow.
// TODO 用户取消了支付
else if (responseCode == BillingClient.BillingResponse.ITEM_ALREADY_OWNED)
// Handle an error caused by a user cancelling the purchase flow.
// TODO 商品已经购买过(重复购买了此商品,如果需要支持重复购买,需要将商品购买成功后消费掉)
else
// Handle any other error codes.
.build()
4. 连接 Google Play Service
在使用支付功能之前,首先要连接Google Play Service,确保当前状态支付是可用的,此操作对于国内用户来说是需要梯子的,但是对于国外的用户,就不用操心了,毕竟我们开发Google Play主要还是给国外用户使用。
billingClient.startConnection(object : BillingClientStateListener
override fun onBillingSetupFinished(@BillingClient.BillingResponse billingResponseCode: Int)
// 连接成功
if (billingResponseCode == BillingClient.BillingResponse.OK)
// The billing client is ready. You can query purchases here.
// 5. Query for in-app product details.
// 5. 查询商品详情
// 6. 支付商品
else
// TODO 连接失败
// 连接断开
override fun onBillingServiceDisconnected()
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
)
5. 获取商品信息
商品信息需要将带有内购权限的apk上传到GooglePlayConsole后,添加内购商品,设置商品ID,待商品生效后,移动端通过商品ID来查询商品的详细信息。
val params = SkuDetailsParams.newBuilder().apply
setSkusList(ArrayList<String>().apply
add("要查询的商品ID") // 可以单个查询也可以多个查询
).setType(BillingClient.SkuType.INAPP)
billingClient.querySkuDetailsAsync(params.build()) responseCode, skuDetailsList ->
Logger.d("responseCode = $responseCode skuDetailsList = $skuDetailsList?.size")
// responseCode 为响应码
// skuDetailsList 为查询的商品信息列表
6. 支付商品
skuDetails
为查询到的商品信息
// 唤起GooglePay支付
val flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build()
billingClient.launchBillingFlow(activity, flowParams)
支付成功后,会在初始化的监听接口回调支付结果,包含必要的支付结果信息。
7. 消费商品(非必须)
Google的商品默认是单次消费的,即只能购买一次,如果需求是可以多次购买的,比如充值等需求,那么就需要在支付成功后将购买的商品消费掉。
billingClient.consumeAsync(purchaseToken) responseCode: Int, purchaseToken: String ->
- purchaseToken : 支付成功后返回的支付令牌
如果支付成功后没有立即消费,需要后续手动消费掉,则先要查询未消费的商品,有同步方法和异步方法:
// 查询历史购买 同步
val purchasesResult: Purchase.PurchasesResult = billingClient.queryPurchases(BillingClient.SkuType.INAPP)
if (purchasesResult.responseCode == BillingClient.BillingResponse.OK)
purchasesResult.purchasesList?.forEach purchase ->
purchase.purchaseToken?.apply
// TODO 消费掉商品
// 查询历史购买 异步
billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP) responseCode, purchasesList ->
if (responseCode == BillingClient.BillingResponse.OK)
purchasesList?.forEach purchase ->
purchase.purchaseToken?.apply
// TODO 消费掉商品
8. 校验支付
校验支付可以移动端校验也可以后台校验,如果我们的商品有后台管理,那么无疑当然选择通过后台来校验支付了,毕竟移动端比较容易被破解。
后台校验支付也有两种方式,一种是通过配置GooglePlayAPI,通过OAuth去获取订单信息进行验证,相对比较麻烦。
还有一种简单的做法就是通过许可密钥
进行验证,相对简单一点,各有利弊,据说大部分都使用这种方式,我们图省事,也是通过这种方式校验。
许可密钥
可以在 GooglePlayConsole
->选择应用
->开发工具
->服务和API
中找到。
创建商品
GooglePlayConsole
->选择应用
->商店发布
->应用内商品
商品在上传apk后可以添加创建,一般情况下,App上显示的商品列表是由后台维护的,列表包含配置好的商品ID,移动端的商品ID从后开接口获取,这样添加或移除商品后,只需要和后台同步即可。
添加测试人员
在 GooglePlayConsole
->设置
->管理测试人员
管理测试人员。添加测试人员后,需要将邀请链接分别发送给测试人员,点击接受邀请后才可以生效。
Google Play 不区分正式环境还是沙盒环境,一切以账号为准,如果登录的是测试人员的账号,支付时会提示测试订单
,不会扣款。
混淆
-keep class com.android.vending.billing.**
坑
此版本的应用未配置为通过Google Play结算。
当前运行的版本和 Google Play 当前生效的版本不匹配导致的,官方介绍的测试方式,是开发完成后将apk上传到Alpha版本(其他版本也可以),等到生效后,测试人员账号可以再Google Play看到更新,更新后就可以正常测试了。这样做的目的就是为了等最新的版本号生效,如果版本号还没有生效,就安装在手机上运行,就会出现上面错误。
无法购买该商品
可能是商品已经失效了,我们遇到这个问题是出现在app因为某些原因被停用
不支持该地区
中国地区应该是不支持Google Play这种支付方式的,测试的话,需要在Google Play 中,修改一个账号的地区。
应用内敏感图片资源
上传Google Play的应用,应用内部不要包含敏感资源(例如大尺度的图片等),应用上线后,google 还会对apk内部资源审查,不管资源有没有用到,只要包含了敏感资源,都会导致被下架。
以上是关于Android Google Pay 集成的主要内容,如果未能解决你的问题,请参考以下文章