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

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

相关推荐
一碗情深38 分钟前
Android 开发环境解析:从SDK、NDK到版本兼容性指南
android·安卓·sdk·ndk
00后程序员张1 小时前
App 上架全流程指南,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 分发与 App Store 审核经验分享
android·ios·小程序·https·uni-app·iphone·webview
2501_916013741 小时前
iOS App 上架流程详解,苹果应用发布步骤、App Store 审核规则、ipa 文件上传与测试分发实战经验
android·ios·小程序·https·uni-app·iphone·webview
PaoloBanchero1 小时前
Unity 虚拟仿真实验中设计模式的使用 ——命令模式(Command Pattern)
unity·设计模式·命令模式
HELLOMILI1 小时前
[UnrealEngine] 虚幻引擎UE5下载及安装(UE4、UE5)
游戏·ue5·游戏引擎·ue4·虚幻·软件需求
gopyer2 小时前
180课时吃透Go语言游戏后端开发2:Go语言中的变量
开发语言·游戏·golang·游戏后端开发
周杰伦的稻香3 小时前
MySQL中的空间碎片率计算分析
android·数据库·mysql
用户094 小时前
MVI架构如何改变Android开发模式
android·面试·kotlin
梦终剧4 小时前
【Android之路】.sp和界面层次结构
android
2501_916008894 小时前
iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略
android·macos·ios·小程序·uni-app·cocoa·iphone