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查询到的列表,若存在,则核销补单。

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

相关推荐
BoomHe1 天前
Android AOSP13 原生 Launcher3 壁纸获取方式
android
Digitally1 天前
如何将联系人从 Android 转移到 Android
android
黄思搏1 天前
基于标注平台数据的 Unity UI 自动化构建工作流设计与工程实践
ui·unity·蓝湖·vectoui
李小枫1 天前
webflux接收application/x-www-form-urlencoded参数
android·java·开发语言
爱丽_1 天前
MySQL `EXPLAIN`:看懂执行计划、判断索引是否生效与排错套路
android·数据库·mysql
NPE~1 天前
[App逆向]环境搭建下篇 — — 逆向源码+hook实战
android·javascript·python·教程·逆向·hook·逆向分析
yewq-cn1 天前
AOSP 下载
android
cch89181 天前
Laravel vs ThinkPHP:PHP框架终极对决
android·php·laravel
米码收割机1 天前
【Android】基于安卓app的汽车租赁管理系统(源码+部署方式+论文)[独一无二]
android·汽车
流星雨在线1 天前
安卓使用 Startup 管理三方 SDK 初始化
android·startup