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 集成的主要内容,如果未能解决你的问题,请参考以下文章

Android 中的 Google Pay API 集成

试图将Google Pay集成到我的Android应用中

Google Pay UPI 集成在 Android 中不起作用

如何获取用于直接集成的 Google Pay 公钥

原生应用中的 Android Pay 集成

Android Chrome Webview 无法访问 Google Pay