前言

很多游戏研发同学可能都需要顺带接入谷歌支付,谷歌的文档大家都懂得,有时候感觉看下来好像抓住了什么却又什么都没有抓住,导致接入工作有时候会陷入瓶颈。我整理了下谷歌支付接口,并添加了一些解释性文本及扩展代码,希望能对你有所帮助。最后贴上谷歌支付的官网地址

准备工作

谷歌后台项目传入白包,需要麻烦运营同学后台配置好商品,白包可以什么功能都没有,但一定要谷歌支付SDK,因为谷歌需要你的包里有支付相关的权限。4.0开始不用单独在manifest申明,直接依赖谷歌支付包,依赖方法:

dependencies {//版本可能有更新,建议使用最新版本val billing_version = "4.0.0"implementation("com.android.billingclient:billing-ktx:$billing_version")
}

传入白包后,才能够在接下来的流程中查询商品,拉起支付。

开始集成

注意:下文所指商品只针对消耗型商品!!!非消耗型商品除最后消耗步骤有区别,其余基本一致。

初始化并连接Google Play

谷歌支付需要先与Google play建立连接后才能查询商品等操作,所以最好在项目初始化成功后调用谷歌支付初始化,初始化及连接代码示例:

private lateinit var billingClient: BillingClient
billingClient = BillingClient.newBuilder(activity)
//谷歌支付回调,后面拉起支付后会用到,后面再详解.setListener(purchasesUpdatedListener).enablePendingPurchases().build()
billingClient.startConnection(object : BillingClientStateListener {override fun onBillingSetupFinished(billingResult: BillingResult) {if (billingResult.responseCode ==  BillingClient.BillingResponseCode.OK) {//执行初始化成功相关操作}}override fun onBillingServiceDisconnected() {//做好断开连接重连操作}
})

查询商品信息

一般游戏都会配置一张内购商品表,定义好商品名称,价格,等参数,但如果发行多个国家,可以使用该接口查询玩家所在地的币种,对应价格,国家简码等信息。查询成功返回的结果也是支付所必需的参数。另外官方也建议在查询商品信息前有无需要消耗的商品,如果有就得先消耗商品再拉起支付,否则会导致支付失败。查询商品代码示例:

//协程请求商品信息
private var paySkuDetails: ArrayList<SkuDetails> = ArrayList()
private suspend fun queryProductInfo(productIds: List<String>) {val params = SkuDetailsParams.newBuilder()params.setSkusList(productIds).setType(BillingClient.SkuType.INAPP)// leverage querySkuDetails Kotlin extension functionval skuDetailsResult = withContext(Dispatchers.IO) {billingClient.querySkuDetails(params.build())}if (skuDetailsResult.billingResult.responseCode == BillingClient.BillingResponseCode.OK && !skuDetailsResult.skuDetailsList.isNullOrEmpty()){//查询成功回调paySkuDetails = ArrayList()for (skuDetailList in skuDetailsResult.skuDetailsList){}} else{//查询失败回调}
}

启动购买流程

购买方法需要在主线程调用,支付所需参数是上个环节查询成功的商品详情,如果查询商品失败请不要调用支付接口。拉起支付代码示例:

val flowParams = BillingFlowParams.newBuilder().setSkuDetails(paySkuDetails[0]).setObfuscatedAccountId("可选,谷歌支付检测机制,与游戏账号关联的唯一ID,例如账号的MD5值,注意不能为空").setObfuscatedProfileId("可选,和上述功能类似,但国内很多开发用来透传自己平台的订单号,慎用").build()
val responseCode = billingClient.launchBillingFlow(mActivity, flowParams).responseCode

一开始谷歌初始化的时候就提到了一个支付回调接口,用来监听支付状态,谷歌支付回调代码示例:

@DelicateCoroutinesApi
private val purchasesUpdatedListener = PurchasesUpdatedListener {billingResult, purchases ->if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null){//支付成功,处理消耗逻辑for (purchase in purchases){mPurchase = purchaseGlobalScope.launch {consume(mPurchase)}}}else if(billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED){//用户取消支付回调}else{//其他支付错误}
}

消耗已购买商品

最关键的来了,每次支付成功后请一定要消耗掉商品,如果不消耗测试账号5分钟,正常玩家三天就会收到谷歌的退款,如果游戏内发货了,那真的是赔了夫人又折兵,所以请一定要消耗!!!至于实在发货前消耗还是发货后消耗就看自己需求。消耗代码示例:

private suspend fun consume(purchase: Purchase) {val consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.purchaseToken).build()val consumeResult = withContext(Dispatchers.IO) {billingClient.consumePurchase(consumeParams)}if (consumeResult.billingResult.responseCode == BillingClient.BillingResponseCode.OK){//处理商品消耗成功的逻辑}else{//处理商品购买时消耗失败的逻辑}
}

未消耗商品查询

在一些非正常购买流程下,可能会接收不到购买成功回调,例如:多台设备;内购过程中网络中断;用户在应用外进行交易等,所以谷歌推荐在onResume和onCreate中调用BillingClient.queryPurchasesAsync()来查询是否有需要消耗的商品,我感觉最好是每次拉起支付前都查询下,有就先消耗,没有就直接拉起支付。

GlobalScope.launch {val purchasesResult = billingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP)if (purchasesResult.billingResult.responseCode == BillingClient.BillingResponseCode.OK){if(purchasesResult.purchasesList.isNotEmpty()){//处理商品消耗逻辑for (purchase in purchasesResult.purchasesList){//消耗商品consume(mPurchase)}} else{//没有需要补消的商品}}else{//查询谷歌订单失败}
}

测试支付

到此支付部分就差不多接入结束了,最后就差测试支付了,这部分也是搞脑子的大头,下面整理了几个我踩过的坑,希望能帮到你。

  1. 保证你测试APK的签名,包名,VersionCode需要与你上传的白包保持一致;
  2. 点击支付能够展现谷歌支付弹窗,但是出现了无法购买之类的错误一般都是配置问题,请仔细检查第一条,并且确认是否正确添加了测试账号;
  3. 一定要保证你Google Play登的账号是测试账号,比较省事的做法就是手机只保留一个测试账号;
  4. 如果加入了测试账号,并且谷歌登录的账号也是对的,但拉起支付还是提示无法购买,可以清除Google Play数据试试,谷歌缓存懂得都懂;
  5. 测试账号一定要加入测试计划,不点击加入计划就算后台添加了也无法生效。

接入谷歌支付4.0(Kotlin)相关推荐

  1. android接入谷歌支付

    先集成google支付插件 implementation "com.android.billingclient:billing:4.0.0" 在Application进行初始化连接 ...

  2. android--GooglePay 谷歌支付内购接入(2)

    android--GooglePay 谷歌支付内购接入(1) 一.支付返回CODE(BillingResponseCode) // * int SERVICE_TIMEOUT = -3;//服务超时 ...

  3. Payment Spring Boot 1.0.2.RELEASE 发布,接入微信支付分、先享卡功能

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 演示例子:https ...

  4. 教你接入Google谷歌支付V3版本,图文讲解(Android、Unity)

    文章目录 一.前言 二.Google支付官方文档 三.Google支付Github Demo工程 四.Google支付流程图 五.Google支付接口讲解 1.初始化(监听支付事件) 2.连接Goog ...

  5. java实现谷歌支付后端验证订单

    前段时间公司项目接入了第三方支付谷歌支付,一句话就是前端下单后再调用后端接口检验订单,(其他业务),校验完就可以去消耗了 网上的教程好多都是先获取code,拿到code后再去获取refresh_tok ...

  6. 互联网晚报 | 9月29日 星期三 | 阿里旗下多个App已接入微信支付;李书福进军手机领域;TikTok全球月活突破10亿...

    ‍ ‍今日看点 ✦ 融创中国澄清:从未向政府提交"求助"报告,整体经营健康稳健 ✦ 阿里回应旗下App接入微信支付:与其他平台一起面向未来 ✦ 快手宣布组织架构调整,将从职能型转向 ...

  7. 谷歌支付(Java服务端)

    Google Pay主要支付流程 1.手机端向Java服务端发起支付,生成预订单,给手机端返回生成的订单号 2.手机端向Google发起支付(传入本地服务器生成的订单号) 3.Google服务器将支付 ...

  8. php ci框架 谷歌支付服务端校验

    //receipt客户端传递过来的参数 public function payverify($receipt = []){//谷歌后台申请到的json文件$this->configLocatio ...

  9. Unity接入微信支付SDK

    最近1年转了UE开发,博客更新的比较少,技术栈宽了不少,以后有空尽量多更新,也方便总结记忆 Unity接入微信支付整个过程坑比较多,网上之前的教程要么比较老,要么比较零碎,只能东拼西凑摸索,跑通后还是 ...

最新文章

  1. 设计模式在vue中的应用(五)
  2. python 试题答案_python试题答案
  3. 百度贴吧的数据抓取和分析(一):指定条目帖子信息抓取
  4. 软件工程——理论、方法与实践 之 面相对象分析
  5. SpringBoot2.1.5(33)---SpringBoot整合 Thymeleaf 模板引擎
  6. 95-130-344-源码-source-kafka相关-AbstractFetcher
  7. cf1107e uva10559区间dp升维
  8. atitit.报表最佳实践oae 与报表引擎选型
  9. go-channel
  10. C# IntPtr类型和使用/unsafe选项编译程序
  11. java计算机毕业设计基于安卓/微信小程序的健身房健身管理系统
  12. win10防火墙_教你一招,在Win10上设置允许应用通过Windows防火墙,非常简单
  13. LeetCode 834
  14. ghost android x86,系统之家GHOST WIN7x86 纯净版v2019.11
  15. 串口打印乱码问题处理
  16. (翻译)在Y分钟学X:OpenCV (OpenCV入门)(中文注释)
  17. MySQL 分库分表实践
  18. 【数据结构】链表的增删改查| 组件化封装
  19. puzzle8(puzzle8填字游戏题目及答案)
  20. DataX 工具安装部署及使用

热门文章

  1. GMP与ERP 手心与手背(转)
  2. 苹果xsmax是什么接口_质量绝对媲美苹果官方同款,液态硅胶手机壳,拿手里太舒服了~...
  3. 0040__node.js中Express简介
  4. 网络安全进阶篇(十一章-6)APP渗透测试篇(中)
  5. ntp服务器linux(服务端和客户端)配置
  6. 热能与动力工程毕业论文题目
  7. 如何使用Github实现协同工作
  8. 关于Pycharm代码补全及高亮消失解决方案
  9. ECALL,BCALL,ICALL
  10. 微信查看共同好友python_微信中怎么查看共同好友?