Reminder: By Aug 31, 2024, all new apps and updates to existing apps must use Billing Library version 6 or newer. If you need more time to update your app, you will be able to request an extension until Nov 1, 2024.
Learn more .
开发者载荷
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
开发者载荷向来被用于各种不同用途,包括防欺诈以及将购买交易归因于正确的用户。在 Google Play 结算库 2.2 及更高版本中,以前依赖于开发者载荷的预期用例现在也在该库的其他部分获得完全支持。
因为有了这样的支持,从 Google Play 结算库 2.2 版开始,我们已弃用开发者载荷。与开发者载荷关联的方法在 2.2 版中已废弃,且在 3.0 版中已移除。请注意,对于使用先前版本的库或 AIDL 完成的购买交易,应用可继续检索开发者载荷。
如需查看详细的变更清单,请参阅 Google Play 结算库 2.2 版本说明 和 Google Play 结算库 3.0 版本说明 。
购物验证
为确保购买交易的真实性并防止伪造或重播,Google 建议您将购买令牌(通过 Purchase
对象中的 getPurchaseToken()
方法获取)与 Google Play Developer API 配合使用,验证购买交易的真实性。如需了解详情,请参阅打击欺诈和滥用行为 。
购买交易归因
许多应用(特别是游戏)需要确保将购买交易正确归因于发起购买交易的游戏内角色/头像或应用内用户个人资料。从 Google Play 结算库 2.2 开始,应用在启动购买对话框时可将经过混淆处理的账号和个人资料标识符传递给 Google,而在应用检索购买交易时也会返回相应信息。
在 BillingFlowParams
中使用 setObfuscatedAccountId()
和 setObfuscatedProfileId()
参数,并使用 Purchase
对象中的 getAccountIdentifiers()
方法检索这些参数。
注意 :使用先前版本的库完成的购买交易使用的是 setAccountId()
(已重命名为 setObfuscatedAccountId()
),getAccountIdentifiers()
不会返回这些购买交易。
将元数据与购买交易相关联
Google 建议您将有关购买交易的元数据存储在您维护的安全后端服务器上。此购买交易元数据应与通过 Purchase
对象中的 getPurchaseToken
方法获取的购买令牌相关联。在成功完成购买交易后调用 PurchasesUpdatedListener
时将购买令牌和元数据传递到您的后端,就可以保留这些数据。
为确保在购买流程中断的情况下关联元数据,Google 建议在启动购买对话框之前将元数据存储在后端服务器上,并将其与用户的账号 ID、正在购买的 SKU 和当前时间戳相关联。
如果购买流程在调用 PurchasesUpdatedListener
之前中断,当应用恢复并调用 BillingClient.queryPurchasesAsync()
后,应用会立即发现购买交易。然后,您可以将从 Purchase
对象的 getPurchaseTime()
、getSku()
和 getPurchaseToken()
方法检索到的值发送到后端服务器,以查询元数据,将元数据与购买令牌关联,并继续处理购买交易。请注意,您最初存储的时间戳与 Purchase
对象的 getPurchaseTime()
中的值不会完全匹配,因此您需要大致地对比二者。例如,您可以检查值之间是否相隔在特定时间段内。
本页面上的内容和代码示例受内容许可 部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-05-14。
[{
"type": "thumb-down",
"id": "missingTheInformationINeed",
"label":"没有我需要的信息"
},{
"type": "thumb-down",
"id": "tooComplicatedTooManySteps",
"label":"太复杂/步骤太多"
},{
"type": "thumb-down",
"id": "outOfDate",
"label":"内容需要更新"
},{
"type": "thumb-down",
"id": "translationIssue",
"label":"翻译问题"
},{
"type": "thumb-down",
"id": "samplesCodeIssue",
"label":"示例/代码问题"
},{
"type": "thumb-down",
"id": "otherDown",
"label":"其他"
}]
[{
"type": "thumb-up",
"id": "easyToUnderstand",
"label":"易于理解"
},{
"type": "thumb-up",
"id": "solvedMyProblem",
"label":"解决了我的问题"
},{
"type": "thumb-up",
"id": "otherUp",
"label":"其他"
}]
{"lastModified": "\u6700\u540e\u66f4\u65b0\u65f6\u95f4 (UTC)\uff1a2024-05-14\u3002"}
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["没有我需要的信息","missingTheInformationINeed","thumb-down"],["太复杂/步骤太多","tooComplicatedTooManySteps","thumb-down"],["内容需要更新","outOfDate","thumb-down"],["翻译问题","translationIssue","thumb-down"],["示例/代码问题","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2024-05-14。"]]