GooglePlay支付接入记录

一、接入

1、Google Play 结算系统简介

https://developer.android.com/google/play/billing?hl=zh-cn

2、设置

此设置包括创建开发者账号、创建和配置要销售的商品,以及启用和配置用于销售和管理商品的 API。此外,本主题还介绍了如何配置实时开发者通知,以便在商品的状态发生变化时随时收到通知。

https://developer.android.com/google/play/billing/getting-ready?hl=zh-cn

⑴、设置 Google Play 开发者账号

⑵、在 Google Play 管理中心内启用结算相关功能

⑶、添加库依赖项Assets/Editor/GooglePlayBilling/GooglePlayBillingDependencies.cs

⑷、上传应用到测试轨道

3、将 Google Play 结算库集成到您的应用中

https://developer.android.com/google/play/billing/integrate?hl=zh-cn

Assets/Editor/GooglePlayBilling/GooglePlayBillingDependencies.cs

4、开始支付(主要操作1)

⑴、设置支付回调

⑵、检查建立连接状态(若已连接则跳过)

⑶、查询商品列表(若已取得则跳过)

⑷、从列表中获取此次购买的商品

⑸、确认此商品购买状态(如:有的商品只能购买一次,且购买后尚未消耗)

⑹、调起支付(注意使用setObfuscatedAccountId透传zplayId)

⑺、处理购买交易(支付回调中):

客户端向服务器 发送 token。

服务器 验证购买交易、向游戏账号发货、标记商品为已消耗。

https://developer.android.com/google/play/billing/security?hl=zh-cn#verify

5、补单(主要操作2)

要补单的原因:

⑴、在购买过程中出现网络问题:用户成功购买了商品并收到了 Google 的确认消息,但用户设备在通过 PurchasesUpdatedListener 收到购买交易的通知之前失去了网络连接。

⑵、多部设备:用户在一部设备上购买了一件商品,然后在切换设备时期望看到该商品。

⑶、处理在您的应用外进行的购买交易:某些购买交易(如促销活动兑换)可能会在您的应用外进行。

https://developer.android.com/google/play/billing/integrate?hl=zh-cn#fetch

开始补单

⑴、检查建立连接状态(若已连接则跳过)

⑵、提取购买交易(建议在 onResume 中)

⑶、处理购买交易(提取购买交易回调中(返回结果与支付回调完全相同))

购买生命周期和 RTDN

https://developer.android.com/google/play/billing/lifecycle?hl=zh-cn

一次性购买生命周期(图)(较简单)

https://developer.android.com/google/play/billing/lifecycle/one-time?hl=zh-cn

订阅生命周期(图)(较复杂)(暂无)

https://developer.android.com/google/play/billing/lifecycle/subscriptions?hl=zh-cn

在后端处理一次性商品购买交易

https://developer.android.com/google/play/billing/lifecycle/one-time?hl=zh-cn#process

测试

https://developer.android.com/google/play/billing/test?hl=zh-cn

在提供待售商品之前,检查用户是否尚未拥有该商品。如果用户的消耗型商品仍在其商品库中,用户必须先消耗掉该商品,然后才能再次购买。

若一个商品已支付未消费。再此购买,将显示"您已拥有此内容"(错误码7)

打包报错:com.google.common.collect不存在

解决:

GooglePlayBillingDependencies.xml 中加入 com.google.guava:guava:31.1-android

(在 Maven Central 中搜索 guava 查看可用版本)

运行报错:java.lang.IllegalArgumentException: Pending purchases for one-time products must be supported.

解决:

java 复制代码
mBillingClient = BillingClient.newBuilder(mActivity)
  .setListener(purchasesUpdatedListener)
  .enablePendingPurchases() //增加此行
  .build();

要在谷歌后台配置商品,需要先上传一个带Billing权限的包

实际上,Google Play 结算库 1.0 版(2017-09-19,公告

在库的清单内嵌入了结算权限,因此不再需要在 Android 主清单内添加 com.android.vending.BILLING 权限。

https://developer.android.com/google/play/billing/release-notes?hl=zh-cn#release-1_0

接入google支付后,传包,后台变为:

然后添加商品

运行测试

测试前请看文档,确保 测试人员已添加、后台已发布(配置了)一次性商品和订阅内容。

https://developer.android.com/google/play/billing/test?hl=zh-cn

https://support.google.com/googleplay/android-developer/answer/6062777?hl=zh-Hans

还要结合 errorCode 和 errorMsg 来分析运行时错误。

https://developer.android.com/google/play/billing/errors?hl=zh-cn

运行问题1:

errorCode:-2(FEATURE_NOT_SUPPORTED),

errorMsg:Client does not support ProductDetails.

原因:

https://developer.android.com/google/play/billing/migrate-gpblv6?hl=zh-cn

在极少数情况下,某些设备无法支持 ProductDetails 和 queryProductDetailsAsync(),这通常是因为 Google Play 服务版本已过时。为了确保对此场景提供适当的支持,请先针对 ++++PRODUCT_DETAILS++++功能调用 ++++isFeatureSupported()++++,然后再调用 queryProductDetailsAsync。如果响应为 ++++OK++++,表示设备支持该功能,您可以继续调用 queryProductDetailsAsync()。如果响应为 ++++FEATURE_NOT_SUPPORTED++++,您可以改用 ++++querySkuDetailsAsync()++++请求可用的向后兼容产品列表。如需详细了解如何使用向后兼容功能,请参阅 [++++2022 年 5 月的订阅功能指南++++](#2022 年 5 月的订阅功能指南)

参考:

https://github.com/android/play-billing-samples/issues/563

解决:

判断功能是否后,对查询和支付代码做兼容。

主要包括:

⑴、判断mBillingClient.isFeatureSupported(BillingClient.FeatureType.PRODUCT_DETAILS);

⑵、查询 queryProductDetailsAsync兼容为 querySkuDetailsAsync

⑶、调起支付时 setProductDetailsParamsList 兼容为 setSkuDetails

运行问题2:

errorCode:2(++++SERVICE_UNAVAILABLE++++),

errorMsg:An internal error occurred.

原因:我是因为没连vpn,连不到外网网络

(但从提示看,这个错误的原因可能不一定是这个问题)

运行问题3:

使用未成为测试人员的账号调起支付,看不到测试支付的选项"测试卡"。

解决:在GooglePlay后台添加 许可测试人员(注意区别测试人员)

运行问题4:

使用加测试人员的账号调起支付,显示"系统无法找到您要购买的商品"(错误码4)。

需要注意:

  1. 确保测试包的 versionCode 和版本号和上传的apk的包的一样。
  2. 确保拉起支付的ProductId 与 后台一致。
  3. 确保手机登录的Google账号是测试人员的、且拉起支付的账号也是此测试账号(多账号登录时注意)
  4. 确保测试人员根据 测试链接(后台/测试/内部测试/测试用户数量,最下方)点击进入,并接受测试邀请。

点击进入商店 游戏页,连接手机到PC并安装(前提确保游戏已上架到商店)

之后,游戏将开始在手机上下载。

(若未开始下载,应检查网络,并停留在手机的Play 商店)

进入查看,即可看到"测试卡"支付方式。

单机游戏支付流程核销丢单问题

在Google Play单机游戏中,支付核销流程存在一个关键风险点:

1、用户完成支付

2、客户端发起核销请求

3、Google Play服务器完成核销

4、客户端等待核销完成回调下发奖励

用户可能在步骤3完成后立即杀死应用,导致步骤4无法执行。

此时,Google Play服务器已核销该订单,但客户端未发奖;

客户端即使向 Google Play请求 QueryPurchases 查询未完成订单,也查不到,所以也无法补单。

解决办法:

本地再维护一个 已支付未发奖的列表。

尝试补单时,优先QueryPurchases查询到的列表,若存在,则核销补单。

若不存在,则查看 本地已支付未发奖的列表,然后直接发奖。

相关推荐
CYRUS_STUDIO7 小时前
一步步带你移植 FART 到 Android 10,实现自动化脱壳
android·java·逆向
CYRUS_STUDIO7 小时前
FART 主动调用组件深度解析:破解 ART 下函数抽取壳的终极武器
android·java·逆向
蓝倾97610 小时前
淘宝/天猫店铺商品搜索API(taobao.item_search_shop)返回值详解
android·大数据·开发语言·python·开放api接口·淘宝开放平台
Propeller11 小时前
【Android】LayoutInflater 控件实例化的桥梁类
android
国家二级编程爱好者11 小时前
Android开机广播是有序还是无序?广播耗时原因是什么?
android
猿小蔡-Cool11 小时前
Robolectric如何启动一个Activity
android·单元测试·rebolectric
Industio_触觉智能11 小时前
瑞芯微RK3576开发板Android14三屏异显开发教程
android·开发板·瑞芯微·rk3576·多屏异显·rk3576j·三屏异显
AI视觉网奇13 小时前
android adb调试 鸿蒙
android
在下历飞雨14 小时前
为啥选了Kuikly?2025“液态玻璃时代“六大跨端框架横向对比
android·harmonyos