一、接入
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)。

需要注意:
- 确保测试包的 versionCode 和版本号和上传的apk的包的一样。
- 确保拉起支付的ProductId 与 后台一致。
- 确保手机登录的Google账号是测试人员的、且拉起支付的账号也是此测试账号(多账号登录时注意)
- 确保测试人员根据 测试链接(后台/测试/内部测试/测试用户数量,最下方)点击进入,并接受测试邀请。
点击进入商店 游戏页,连接手机到PC并安装(前提确保游戏已上架到商店)
之后,游戏将开始在手机上下载。
(若未开始下载,应检查网络,并停留在手机的Play 商店)
进入查看,即可看到"测试卡"支付方式。

单机游戏支付流程核销丢单问题
在Google Play单机游戏中,支付核销流程存在一个关键风险点:
1、用户完成支付
2、客户端发起核销请求
3、Google Play服务器完成核销
4、客户端等待核销完成回调下发奖励
用户可能在步骤3完成后立即杀死应用,导致步骤4无法执行。
此时,Google Play服务器已核销该订单,但客户端未发奖;
客户端即使向 Google Play请求 QueryPurchases 查询未完成订单,也查不到,所以也无法补单。
解决办法:
本地再维护一个 已支付未发奖的列表。
尝试补单时,优先QueryPurchases查询到的列表,若存在,则核销补单。
若不存在,则查看 本地已支付未发奖的列表,然后直接发奖。