集成Google Play支付

article/2025/7/13 18:22:51

前言

这篇文章很早就想写了,由于时间关系一直拖到现在,我相信这篇文章对大多数想要接入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
我这里示例是到服务器去验证,


http://chatgpt.dhexx.cn/article/JKhqXEut.shtml

相关文章

聚合支付-x-pay

X-Pay X-Pay是一款集合聚合支付、应用管理、商品管理、收银台、订单中心、财务开票、消息中心等功能模块.平台优势 适用于企业实现聚合支付需求。多个产品线同用一套支付系统&#xff0c;从业务和架构上实现解耦。平台亮点 统一管理多个产品线上售卖不同商品,统一个收银台,统一…

微信支付的服务商模式V3支付(可直接使用)

直连商户模式和服务商模式区别&#xff1a; 直连商户&#xff1a;例如张三开了一个小程序&#xff0c;然后别人在这个小程序买东西&#xff0c;结账的时候&#xff0c;钱是直接打到张三的账号上的。 服务商模式&#xff1a;例如张三开了一个小程序&#xff0c;然后这个小程序中…

如何发布到NPM上(转)

简要:这篇文章介绍了如何讲自己的包发布到NPM上&#xff0c;马克一下&#xff0c;将来有用 。。。 npm包发布 发布npm包&#xff0c;更方便以后下载使用。 我们已经把插件代码上传到github上面了&#xff0c;那么我们是否可以也做成一个npm包发布到npm上呢&#xff1f;答案是肯…

微信支付APIv3

文章目录 微信支付之前我的密钥啥的都是放到配置文件里面以后可以再写一个文件基础支付APIv3介绍获取验签和HttpClientAPIv3证书与密钥使用说明 微信支付的SDK工具Native支付流程我们程序运行时的日志也可以使用log.debug在方法堆栈里面查看我们程序执行的方法调用顺序内网穿透…

你了解过区块链的最新模式都有哪些呢?

热门项目 ①USDT跑分系统: 项目热度:***** 项目亮点: 1.使用全球主流稳定的结果货币USDT。 2.通道永不被封,资金永不被冻。 3.个人与个人之间的C2C点对点分散式交易。 4.高效,5分钟内迅速到账。 项目玩法: 500个usdt以上即可开启接单(相当于押金),静态跑一轮可得…

vpay平台模式开发 15天交付系统

近期迅速走进大家视野的Vpay是什么究竟是什么&#xff0c;有人说vpay是一个APP&#xff0c;有人说&#xff0c;是一个支付手段&#xff0c;接近一点的会说是一个模式&#xff0c;那究竟是什么模式?拆分?还是虚拟币?其实严谨来讲Vpay是 重新构建了连接方式&#xff0c;连接方…

vpay软件系统开发

“创新性强、前瞻性高&#xff0c;需要先行先试&#xff0c;但切忌‘一刀切’&#xff08;陈琦&#xff1a;138-2848-7919可微&#xff09;当天&#xff0c;互联网医疗企业丁香园创始人、董事长李天天在接受央视《新闻11》采访时表达了这样的观点&#xff0c;近两年的互联网圈子…

vpay模式软件开发 vpay系统

vpan它一方面通过数学和算法实现了全网的共识与信任(协议属性)&#xff0c;另一方面通过代币保证了生态体系的价值激励(货币属性)。 区块链适合应用的领域是已经现存大量结构化数据&#xff0c;或者是容易形成结构化数据的领域。这点比较类似ai&#xff0c;只有数据线上化结构化…

V免签-PC监控端 Vpay监控 PC 4.3

V免签-PC监控端 介绍 V免签pc监控端更新界面 支持微信、支付宝双端监听 使用说明 下载软件配置域名、密钥 版本更新 持续更新中~~~ 下载地址&#xff1a;https://wwsl.lanzoul.com/iSSo30vzqm1g https://www.159e.cn/75.html Vpay监控 4.3 更新日志&#xff1a; 1.修复…

Vpay是什么?Vpay怎么玩?用Vpay有什么好处?Vpay系统开发

&#xff08;1&#xff09;Vpay是什么&#xff1f; Vpay是一个全面开放的完全去中心化的网络支付平台&#xff0c;跟支付宝和微信一样&#xff0c;不同的是&#xff0c;Vpay是基于区块链技术开发的&#xff0c;用户之间能顺利实现点对点交易&#xff0c;支付&#xff0c;跨境转…

web前端第二周学习

第二周学习 二十一、嵌套列表二十二、表格标签二十三、表格属性二十四、表单标签二十五、表单相关标签二十六、表格表单组合使用二十七、div与span二十八、CSS语法格式二十九、内联样式与内部样式三十、外部样式及两种写法三十一、CSS颜色表示法三十二、背景样式三十三、背景实…

小程序与云开发实战 36 讲

课程介绍 小程序依托微信超过 10 亿的海量用户&#xff0c;它无需安装即可使用的完美用户体验&#xff0c;已经成为商家竞相争夺的大蛋糕&#xff0c;同时&#xff0c;小程序开发快速、容易部署广受程序员的喜爱&#xff0c;作为程序员的我们&#xff0c;还有什么理由不学习小…

WEB3.0白皮书

I // Part1 新浪潮 // 那么 Web3.0 究竟是什么? TA 能给当今世界带来什么变化? TA 由哪 些技术组成? 如何实现 Web3.0? TA 能带来哪些机会? 我们能从中得到什么? Web3.0 是一个非常前沿的话题&#xff0c;充满了不确定性&#xff0c;也没有任何人能准确预测…

如何在 2021 年使用 WordPress 制作游戏网站

您想学习如何使用 WordPress 制作游戏网站吗&#xff1f; 游戏从未如此流行。拥有自己的游戏网站&#xff0c;您可以创建一个游戏社区&#xff0c;创建一个受欢迎的游戏博客&#xff0c;甚至赚取副业收入。 在本文中&#xff0c;我们将向您展示如何在没有任何技术技能的情况下…

第一批 00 后 Web3 创业者,和他们的「人间清醒」

当不少 80 后、90 后还在困惑&#xff0c;生怕赶不上这趟所谓的 Web3「革命快车」的时候&#xff0c;有一些 00 后早已「玩得飞起」。一位 00 后朋友说&#xff0c;「你们眼中的革命&#xff0c;是我生活的日常。」 然而&#xff0c;这个新赛道有的不止是「狂热」&#xff0c;…

小甲鱼零基础入门学习python笔记

小甲鱼老师零基础入门学习Python全套资料百度云(包括小甲鱼零基础入门学习Python全套视频全套源码全套PPT课件全套课后题及Python常用工具包链接、电子书籍等&#xff09;请往我的资源&#xff08;https://download.csdn.net/download/qq_32809093/13099592&#xff09;查看 目…

web前端学习1-45集

web前端1-45集 第一集 课程划分1.HTMLCSS系列教程1之拨云见日2.HTMLCSS系列教程2之溯本求源3.HTMLCSS系列教程3之风声水起4.HTMLCSS系列教程4之巧夺天工如何学好web前端 第二集 拨云见日1. 什么是HTML、CSS&#xff1a;2. 代码跟网站的关系&#xff1a;3.写到哪里&#xff1a;4…

应用服务器语言,web服务器 语言

C语言进行CGI程序设计 也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处理,将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。CGI程序可以用... 文章 技术让梦想更伟大-李肖遥 20…

web前端从入门到精通

web前端从入门到精通 HTMLCSS系列一、拨云见日如何创建.html文件--网页1.安装插件2.编辑器基本使用3.Chrome浏览器 &#xff08;市场份额最大&#xff09;4.深入了解网站开发5.web三大核心技术6.HTML基础结构与属性7.HTML初始代码8.HTML注释9.HTML语义化10.标题(h)与段落(p )11…

html5游戏视频UI框架,推荐几个精致的web UI框架

Aliceui是支付宝的样式解决方案&#xff0c;是一套精选的基于 spm 生态圈的样式模块集合&#xff0c;是 Arale 的子集&#xff0c;也是一套模块化的样式命名和组织规范&#xff0c;是写 CSS 的更好方式。 2.Amazeui Amaze UI 是一个轻量级、 Mobile first 的前端框架, 基于开源…