前言

这篇文章很早就想写了,由于时间关系一直拖到现在,我相信这篇文章对大多数想要接入Goole Play支付的小伙伴来说,会少走许多坑的,在这里说明一下,笔者在集成过程中踩了不少坑,所有请大家尽情享用成果,废话不多说直接切入正题。

注意事项及准备工作

  • 创建一个非国内的Google账号(这步很重要,国内账号不支持支付)
  • 手机端开启VPN,选择Google账号同一个国家的VPN,否则可能导致支付失败
  • 手机端下载Google Play App并登录
  • Google Play账号绑定国外银行或者购买礼品卡,用于支付(建议没有国外银行卡的小伙伴购买礼品卡来用于支付,不知道购买渠道的笔者可以帮忙,联系方式QQ:643614219)
  • 保证 versionCode 和版本号与你上传的apk的包的一样。
  • 保证后台和你传入的购买商品的 id 一致。
  • 确保你所使用的账号是在测试人员里。(在"APK"页面里,有一个“选择使用网址”,把这个网址给你的测试人员,让你的测试人员用他的google账号点进去,点那个“成为测试人员”(前提是你把他加进了测试人员列表), 只有这样才能测试商品支付)

开始集成

阅读文档

  • 建议大家在集成之前先通读一遍文档,这样有助于大家更高效的集成文档,官方文档地址:https://developer.android.com/google/play/billing/billing_library_overview

支付大致流程

  • 创建商品:使用 Google Play 管理中心配置应用内商品
  • APP端根据创建的商品Id,获取商品详情
  • 根据商品信息进行支付
  • 验证支付结果

开始集成

引入仓库

implementation 'com.android.billingclient:billing:2.1.0'

AndroidManifest.xml文件添加权限

<uses-permission android:name="com.android.vending.BILLING" />

与Google Play建立连接

billingClient?.startConnection(object : BillingClientStateListener {override fun onBillingSetupFinished(billingResult: BillingResult) {statusData.value = StatusInfo(ActionCode.TYPE_ACTION_LOADED)if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {// The BillingClient is ready. You can query purchases here.LogPrinter.e("onBillingSetupFinished", "连接成功")//查询商品详情querySkuDetails(googleProductId)} else {LogPrinter.e("onBillingSetupFinished","连接失败了:responseCode ${billingResult.responseCode}")}}override fun onBillingServiceDisconnected() {billingClient = nullLogPrinter.e("onBillingDisconnected", "连接失败了")}})

查询商品信息

    //查询应用内商品详情fun querySkuDetails(googleProductId: String) {val skuList = ArrayList<String>()skuList.add(googleProductId)
//        skuList.add("unlock_face")//商品idval params = SkuDetailsParams.newBuilder()params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP)billingClient?.querySkuDetailsAsync(params.build()) { billingResult, skuDetailsList ->if (billingResult!!.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {//查找商品详情for (skuDetailsItem in skuDetailsList) {val sku = skuDetailsItem.skuval price = skuDetailsItem.priceLog.e("skuDetails", "$sku $price")if (googleProductId == sku) {skuDetails = skuDetailsItem}}} }}

发起支付

    private fun doGooPlayPay() {val flowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).build()billingClient?.launchBillingFlow(context, flowParams)}

支付成功后确认购买交易

如果您使用的是 Google Play 结算库版本 2.0 或更高版本,则必须在三天内确认所有购买交易。如果没能正确确认,将导致系统对相应购买交易按退款处理。

Google Play 支持从您的应用内部(应用内)或外部(应用外)购买商品。为了确保无论用户在哪里购买您的商品,Google Play 都能提供一致的购买体验,您必须在授予用户权利后尽快确认通过 Google Play 结算库收到的所有处于 SUCCESS 状态的购买交易。如果您在三天内未确认购买交易,则用户会自动收到退款,并且 Google Play 会撤消该购买交易。对于待处理的交易,该三天期限不包含购买交易处于 PENDING 状态的时间,而是从购买交易改为 SUCCESS 状态时算起。

您可以使用以下方法之一确认购买交易:

对于消耗型商品,请使用客户端 API 中的 consumeAsync()。
对于非消耗型商品,请使用客户端 API 中的 acknowledgePurchase()。
还可以使用服务器 API 中新增的 acknowledge() 方法。

对于消耗型商品,consumeAsync() 接受包含开发者载荷字段的 ConsumeParams 对象,如以下示例中所示:

val client: BillingClient = ...
fun consumePurchase() {val consumeParams =ConsumeParams.newBuilder().setPurchaseToken(/* token */).setDeveloperPayload(/* payload */).build()val consumeResult = withContext(Dispatchers.IO) {client.consumePurchase(consumeParams)}
}

下面是我代码里的示例

   override fun onPurchasesUpdated(billingResult: BillingResult,purchases: MutableList<Purchase>?) {statusData.value = StatusInfo(ActionCode.TYPE_ACTION_LOADED)if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {for (purchase in purchases) {if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {if (!purchase.isAcknowledged) {//没有确认去确认Log.e("去确认购买","${purchase.purchaseToken} ${purchase.developerPayload} ${purchase}")consumePurchase(purchase)} else {Log.d("onPurchasesUpdated", "purchaseState 商品已经购买 $purchase")}} else {Log.d("onPurchasesUpdated", "purchaseState ${purchase.purchaseState}")}}} else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {// Handle an error caused by a user cancelling the purchase flow.statusData.value = StatusInfo(ActionCode.TYPE_ACTION_MESSAGE, "用户取消购买了")} else {// Handle any other error codes.statusData.value = StatusInfo(ActionCode.TYPE_ACTION_MESSAGE,"购买失败 responseCode:${billingResult.responseCode} Message:${billingResult.debugMessage} ")}Log.e("onPurchasesUpdated","购买结果 ${billingResult.responseCode} ${billingResult.debugMessage}  purchases $purchases")}/*** 对于消耗型商品*/private fun consumePurchase(purchase: Purchase) {statusData.value= StatusInfo(ActionCode.TYPE_ACTION_LOADING_DIALOG)val consumeParams =ConsumeParams.newBuilder().setPurchaseToken(purchase.purchaseToken).setDeveloperPayload(paymentCode).build()billingClient?.consumeAsync(consumeParams) { billingResult, p1 ->if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {val body = GooglePayResultDto(commonRepository.getUserInfo()!!.id, purchase.orderId, purchase.packageName, paymentCode, purchase.sku, purchase.purchaseToken, commonRepository.getUserInfo()!!.uuid)commonRepository.googlePayCall(body).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : BaseObserver<BaseResponse<Any>>() {override fun onRequestStart() {}override fun onRequestEnd() {statusData.value=StatusInfo(ActionCode.TYPE_ACTION_LOADED)}override fun onSuccessful(data: BaseResponse<Any>?) {queryPayResult()}override fun onFailure(failureInfo: StatusInfo) {queryPayResult()}})}Log.e("consumePurchase","responseCode:${billingResult.responseCode} ${billingResult.debugMessage}")}}

验证购买交易

每次向用户提供他们所购买的商品的访问权限之前,您都应该验证购买交易是否处于 PURCHASED 状态,并验证应用在 onPurchasesUpdated() 中收到的其他购买详情。
验证购买交易分为分为两种方式:

  • 在服务器上验证购买交易

  • 在设备上验证购买交易

详情请点击链接查看https://developer.android.com/google/play/billing/billing_library_overview
我这里示例是到服务器去验证,

集成Google Play支付相关推荐

  1. 安卓集成Google Play支付(谷歌支付)最新版本

    Google Play 支付文档:https://developer.android.com/google/play/billing/integrate Google Play 支付库已经升级到5.0 ...

  2. 安卓集成google内支付

    Google Play Console创建应用 我的应用是后台人员完成的,具体的可以参考Google Play Console创建应用其中需要注意的是添加测试人员只是测试APK包,需要进行内支付测试则 ...

  3. 集成Google应用内 支付 或者 订阅

    要集成Google应用内支付 先要了解文档 集成文档: https://developer.android.google.cn/google/play/billing/integrate 1.创建Go ...

  4. 【Android】 Firebase登录、FCM、Google Play支付、adbrix、ONEStore、Galaxy Store、Google Install Referrer

    Android SDK接入 最近接了一个韩国的渠道,之前没有接过这些原生的sdk,头大啊.本来也不是搞android开发的,只能强搞了.还是国内的好啊,都给你整合完了. 如有问题,麻烦大佬指教一二,非 ...

  5. coco2d-x游戏开发google play Google In-app-Billing 支付接入

    android google play接入一样的操作借用了网上别人博客的部分 改正的一些错误,主要介绍 cocos2d-x google play 接入不一样的部分 如果没有GooglePlay此处附 ...

  6. 集成支付宝钱包支付iOS SDK的方法与经验

    没想到,支付宝的SDK是我目前用过的所有第三方SDK中最难用的一个了. 下载 首先,你要想找到这个SDK,都得费点功夫.现在的SDK改名叫移动支付集成开发包了,下载页面在 这里 的 "请点此 ...

  7. ios使用支付宝进行支付,注意事项 集成支付宝钱包支付iOS SDK的方法与经验。...

    下载 首先,你要想找到这个SDK,都得费点功夫.现在的SDK改名叫移动支付集成开发包了,下载页面在 这里 的 "请点此下载集成开发包" Baidu和Googlep排在前面的支付宝开 ...

  8. ecshop 手机版的php代码在哪里,PHP 在ecshop上集成 手机网页支付_php

    参考alipay网页支付接口的代码 其实原理跟ecshop上集成的alipay支付差不多  就是因为利用curl请求的时候相应时间过长 所以不能直接去先post数据再生成button /** * 生成 ...

  9. php集成paypal接口,PHP中集成PayPal标准支付,php集成paypal标准_PHP教程

    PHP中集成PayPal标准支付,php集成paypal标准 PayPal支付功能其实一直在更新文档和接口,这里说的是一个简单的支付功能大概流程如下 1,在网站的结账页面,设置一个提交到PayPal网 ...

  10. GMaps.js:让你快速集成 Google Maps 服务的 jQuery 插件

    GMaps.js 功能 除了添加指定经纬度的标准地图之外,GMaps.js 还能定义地图放大的级别,添加标注,获取当前用户的地理位置(HTML5 geolocation),定义路线,绘制折线,并且实现 ...

最新文章

  1. 连续按back键盘退出自己的应用,杀掉进程
  2. 我看过的C++方面的好文章
  3. 这样是不是就可以预测语音长度和内容了
  4. php 数组接在数组后面,PHP array_splice()接合数组用法的简单介绍
  5. python入门新手项目-新手零基础入门Python项目实战
  6. mysql闪退或者can not connect 127.0.0.1
  7. 算法导论5:基数排序和计数排序 2016.1.5
  8. Repeater 操作HeaderTemplat或FooterTemplat模板中控件
  9. Android开发之快捷键Google官方版本包含Mac版本
  10. Selenium自动化测试IE
  11. 用vsftp建立个人ftp站点
  12. 2014年计算机职称考试试题库,2014年职称计算机考试全真模拟试卷(1)
  13. c++求矩阵的秩_利用Python矩阵求逆、特征值及特征向量
  14. 【测试基础】Linux打包、解包、解压缩命令这一篇全
  15. python计算机视觉pdf百度云下载_Python计算机视觉编程(pdf+epub+mobi+txt+azw3)
  16. 我们学校一牛老师的语录
  17. 西安邮电大学计算机学院研究生分数,2020西安邮电大学考研复试分数线已公布...
  18. 嵌入式 Linux 编程
  19. 如何获取sha1值和MD5值
  20. 拳王虚拟项目公社:聊聊虚拟资源项目,虚拟资源自动化倒卖虚拟商品生意怎么赚钱?

热门文章

  1. HDU-魔咒词典(字符串hash)
  2. php导入mib表,导入mib库并获取负载均衡F5的Mib信息
  3. JavaEE个人学习总结
  4. python352的值为_Python3高级基础(2)
  5. Android 第三方轮播图控件ConvenientBanner:通用的广告栏控件
  6. 大数据项目之深圳地铁大数据客流分析系统
  7. 以太网网络变压器EMI电流及以太网网络变压器对EMI阻断原理
  8. Matlab中持久变量(persistent)在Python中的理解
  9. 4G模块配置、概念、调试记录
  10. 为个人博客添加文章评论功能