Google Play Developer API 现在包含 报告来自备选结算系统的交易,或 外部优惠系统。本指南将介绍如何报告替代性数据, 结算或外部优惠交易。
从后端处理应用内购买交易时,可能需要用到一些组件。如需构建这些组件,您需要按照配置 Google Play Developer API 中的说明设置后端集成。对于 所有不特定于备选结算系统的开发者后端功能 或外部优惠 API 的说明, Google Play 结算系统文档适用。
向 Google Play 报告新的外部交易
与 Externaltransactions APIs
集成
报告 Google Play 结算系统以外发生的交易,
支持的国家/地区,包括通过免费试用产生的 0 美元交易
购买。通过备选结算系统或外部优惠系统进行的交易
仅在系统允许的情况下,才应针对符合条件的用户所在国家/地区启动和报告
在备选结算系统下,或者
外部优惠计划,否则,API 调用将
已被拒绝。这适用于所有交易,包括新购买、续订
充值、升级、降级等操作。
外部交易报告
您应该调用 Externaltransactions API
来报告外部交易
在通过备选结算系统获得授权后,或者
外部优惠系统这适用于所有交易,包括
扣款、续订、退款等。所有交易都必须
会在交易发生 24 小时内报告。
系统会为每一笔外部交易报告一个外部交易 ID。对于周期性购买交易(例如自动续订型订阅),您需要发送与这笔周期性购买交易中的第一笔交易相关联的外部交易 ID,以用作后续所有交易(包括退款)的参数。这样就能记录相应购买交易的一系列交易。如果商品发生变化(例如升级或降级),或者周期性交易被取消或过期且之后同一商品再次被购买,您就需要针对相应交易发送新的外部交易 ID。您不得添加任何个人身份信息 这些信息、专有信息或机密信息, 交易 ID。
报告新购买交易
每当通过备选结算系统完成新购买交易时
或外部优惠系统,对 Externaltransactions
API 的调用会
必填字段。对于这些新的购买交易,您需要提供唯一
externalTransactionId
以查询的形式与后端中的购买交易相关联
参数。此externalTransactionId
不能在同一应用的
软件包 ID。
应用通过externalTransactionToken
UserChoiceBillingListener
、AlternativeBillingOnlyReportingDetailsListener
、
或 ExternalOfferReportingDetailsListener
回调作为
一次性购买和首次交易的请求正文
周期性购买(例如订阅)。无论是哪种情况,都称为
初始交易。完成初始交易后,
externalTransactionToken
不再需要,您后续报告
通过提供新的唯一身份
externalTransactionId
。请参阅报告购买交易的后续交易
,详细了解如何报告后续交易。
示例:
- 开发者在其应用中配置并启用备选结算系统。
- 用户 1 位于韩国(受支持的国家/地区),尝试购买
product1
,价格为 12634.10 韩元/月,并可获得 1 个月的免费试用优惠。 - 应用启动购买流程,并采用针对
product1
的ProductDetails
以及用户选择的优惠。 - 用户 1 选择开发者的备选结算系统。
UserChoiceBillingListener
收到my_token
值作为externalTransactionToken
。- 然后,开发者将相关信息(
externalTransactionToken
值和所购商品)发送到其后端,接着在备选结算系统中启动product1
的购买流程。此交易在开发者端获配一个唯一的交易 ID (123-456-789),用于向 Google Play 报告。即使用户正在免费试用商品,开发者也必须提供交易 ID。 - 在备选结算系统中发生购买交易后,开发者会使用以下请求向 Google Play 报告该交易。最初报告一笔金额为 0 美元的交易,因为用户会免费享用一个月。
POST /androidpublisher/v3/applications/com.myapp.android/externalTransactions?externalTransactionId=123-456-789
Body
{
"originalPreTaxAmount" : {
"priceMicros": "0",
"currency": "KRW"
},
"originalTaxAmount" : {
"priceMicros": "0",
"currency": "KRW"
},
"transactionTime" : "2022-02-22T12:45:00Z",
"recurringTransaction" : {
"externalTransactionToken": "my_token",
"externalSubscription" {
"subscriptionType": "RECURRING"
}
},
"userTaxAddress" : {
"regionCode": "KR"
}
}
如果与印度境内的用户进行交易,由于该国税费因用户所在的行政区(例如州或省)而异,请务必在 userTaxAddress 下包含该行政区。如需了解适用的行政区,请参阅 API 参考指南中的预定义字符串列表。
POST /androidpublisher/v3/applications/com.myapp.android/externalTransactions?externalTransactionId=123-456-789
Body
{
"originalPreTaxAmount" : {
"priceMicros": "0",
"currency": "INR"
},
"originalTaxAmount" : {
"priceMicros": "0",
"currency": "INR"
},
"transactionTime" : "2023-11-01T12:45:00Z",
"recurringTransaction" : {
"externalTransactionToken": "my_token",
"externalSubscription" {
"subscriptionType": "RECURRING"
}
},
"userTaxAddress" : {
# Tax varies in India based on state, so include that information in
# administrativeArea
"regionCode": "IN"
"administrativeArea": "KERALA"
}
}
报告购买交易的后续交易
在某些情况下,同一外部购买交易有多笔相关联的用户付款(例如,续订或预付费方案充值)。您可以在 Externaltransactions
中使用同一 API 报告这些后续交易。如报告新购买交易中所述,后续交易不需要 externalTransactionToken
。不过,系统会为每笔续订或充值交易发送新的唯一 externalTransactionId
作为查询参数,并将初始交易的 ID 包含在 initialExternalTransactionId
字段中。
接着之前的示例:
- 用户 1 的首次续订发生在备选结算系统中。初始交易 ID 为 123-456-789。
- 开发者将网址查询参数中的周期性交易 ID 报告为这笔新交易的外部交易 ID,同时引用
initialExternalTransactionId
字段中初始交易的外部交易 ID。
示例交易:
POST /androidpublisher/v3/applications/com.myapp.android/externalTransactions?externalTransactionId=abc-def-ghi
Body
{
"originalPreTaxAmount" : {
"priceMicros": "12634000000",
"currency": "KRW"
},
"originalTaxAmount" : {
"priceMicros": "1263000000",
"currency": "KRW"
},
"transactionTime" : "2022-02-22T12:45:00Z",
"recurringTransaction" : {
"initialExternalTransactionId": "123-456-789",
"externalSubscription" {
"subscriptionType": "RECURRING"
}
},
"userTaxAddress" : {
"regionCode": "KR"
}
}
报告升级或降级
若要当用户拥有一项订阅的情况下在备选结算系统中报告升级或降级,您可在 Externaltransactions
API 中使用相同的端点和函数,发送为升级或降级交易而提供给应用的 externalTransactionToken
。这与报告新购买交易类似。
停止手动报告备选结算系统交易
如需迁移您以非自动化报告方式提供备选结算系统期间开始的有效订阅,请使用 migratedTransactionProgram
字段(而不是指定 initialExternalTransactionId
或 externalTransactionToken
)创建一笔新的 0 费用交易。将每项有效订阅的 transactionTime
设置为用户最初注册该订阅的时间。之后,照常通过 API 报告这些订阅的每一笔后续交易,并提供之前使用的 initialExternalTransactionId
创建续订交易。迁移订阅后,您无需再手动报告订阅的后续交易,但前提是这些交易是通过本页介绍的自动化方式报告的。
迁移订阅时,请留意当前的配额限制,以确保迁移不会用尽配额。如果有很多订阅需要 分几天进行迁移,或申请提高配额 配额 ,了解所有最新动态。
只有在从手动报告迁移时,才可以使用 migratedTransactionProgram
字段。当手动报告不再受支持后,该字段将被废弃。
示例交易:
# Note that the externalTransactionId specified here will used to report subsequent
# transactions.
POST /androidpublisher/v3/applications/com.myapp.android/externalTransactions?externalTransactionId=abc-def-ghi
Body
{
# Be sure to set the price to 0 for this transaction since it does not reflect
# an actual subscription renewal.
"originalPreTaxAmount" : {
"priceMicros": "0",
"currency": "KRW"
},
"originalTaxAmount" : {
"priceMicros": "0",
"currency": "KRW"
},
# The transaction time should be set to when the user signed up for this
# subscription.
"transactionTime" : "2022-02-22T12:45:00Z",
"recurringTransaction" : {
"migratedTransactionProgram": "USER_CHOICE_BILLING",
"externalSubscription" {
"subscriptionType": "RECURRING"
}
},
"userTaxAddress" : {
"regionCode": "KR"
}
}
举报 Play 合作伙伴计划
参与合作伙伴计划(例如
Play 媒体体验计划必须提供
transaction_program_code
(报告外部交易时)。如果您
如果您是符合条件的开发者,请与您的业务发展经理联系以了解详情
了解如何设置此字段。
向 Google Play 报告购买交易退款
与 Externaltransactions
API 集成后,您可报告在 Google Play 结算系统以外向用户退款的交易。为了让 Play 正确识别哪一笔交易已退款,您应将之前所报告交易的相应 externalTransactionId
添加为网址参数的一部分。
报告订阅购买交易的退款时,请引用被退款订阅的具体周期性交易的 externalTransactionId
。
示例:假设一项订阅包含以下交易:
- 初始交易的外部交易 ID 为 ABC.1234-5678-9012-34567
- 首笔周期性交易的外部交易 ID 为 ABC.1234-5678-9012-34567..0
- 第二笔周期性交易的外部交易 ID 为 ABC.1234-5678-9012-34567..1
如需报告该订阅所有交易的退款,您需要发出三个单独的退款请求:一个针对初始交易,两个针对后续交易。
此方法接受全额退款 (其中金额与用户在原始外部 交易)和部分退款 (金额小于用户在原始外部 交易)。对于部分退款,您需要指定退还的税前金额。
API 配额
Externaltransactions
API 受每日 API 配额限制
就像 Google Play Developer API 中的任何其他端点一样。
此外,在调用 Externaltransactions.createexternaltransaction
或 Externaltransactions.refundexternaltransaction
时,Externaltransactions
API 的每分钟查询数量 (QPM) 上限为 1,200 个。对 Externaltransactions.getexternaltransaction
的调用不会计入此 1,200 QPM 的限额。