在 Android 应用中集成 Third party Payment 的限制
明确结论
Android 操作系统通常不会禁止应用接入第三方支付,也不会因为应用调用了第三方支付 SDK 就向开发者收费。
相关限制主要取决于应用的分发渠道和交易内容:
- 销售实体商品或线下服务,如外卖、打车、酒店和机票,一般可以使用第三方支付。
- 通过 Google Play 分发应用,并销售应用内使用的数字内容、会员、订阅或虚拟功能时,通常需要使用 Google Play Billing。
- 部分国家或地区允许替代结算、用户选择结算或外部支付链接,但各地的适用范围、申请条件、信息披露要求和服务费不同。
- 不通过 Google Play 分发的应用,不受 Google Play 结算政策直接约束,但仍须遵守支付服务商、所在应用商店及当地法律的规定。
因此,不能只看它是不是 Android 应用。商品类型、上架渠道和目标地区都需要确认。
为什么会有这些限制
Android 是操作系统,Google Play 则是独立的应用分发平台。应用能够在技术上安装和运行第三方支付 SDK,不等于这种结算方式符合 Google Play 的上架政策。
判断支付方式时,先要分清交易对象:
| 交易内容 | 常见结算方式 |
|---|---|
| 实体商品、外卖、交通、住宿等 | 通常可使用第三方支付 |
| 应用内数字功能、虚拟货币、数字内容 | 通过 Google Play 分发时通常使用 Google Play Billing |
| 数字订阅或会员权益 | 通常属于数字内容,需结合权益的使用场景判断 |
| 捐赠、金融服务、点对点付款等 | 可能适用专门规则,需要单独核对 |
商品叫不叫“会员”,并不能决定使用哪种支付方式。会员权益如果主要是应用内数字内容,通常会被视为数字购买;如果权益对应线下健身房、实体配送等服务,则可能属于实体服务。
是否需要向 Google 支付费用
需要根据具体情况判断:
-
直接安装、企业分发或其他应用商店
Android 不会因为应用集成第三方支付而自动收费。是否产生费用,要看第三方支付服务商、分发平台和相关合同。
-
通过 Google Play 销售数字商品
通常需要接入 Google Play Billing,并根据开发者账号、交易类型和适用政策支付相应的服务费。具体比例可能随开发者计划、订阅类型、地区和政策调整,不应在实现中写死某个固定比例。
-
参加替代结算相关计划
获准使用第三方结算,不一定代表无需向 Google 支付服务费。部分计划仍可能收取调整后的服务费,并要求开发者申报交易、展示选择界面或提供客户支持。
第三方支付服务商一般也会收取通道费、退款费、跨境费或货币转换费,这些费用与 Google 无关。
推荐的实施步骤
1. 确定商品性质
列出应用中的每项收费内容,并判断它属于哪种类型:
- 实体商品;
- 线下服务;
- 应用内数字商品;
- 自动续订订阅;
- 金融、捐赠或其他特殊交易。
不要把数字商品改名为“服务费”后接入第三方支付。平台审核通常看实际交付的内容,而不只看商品名称。
2. 确定分发渠道和地区
确认应用的分发情况:
- 是否发布到 Google Play;
- 是否同时发布到多个应用商店;
- 是否通过官网或企业渠道分发;
- 是否面向允许替代结算的特定国家或地区。
如果应用有多个分发渠道,可以使用不同的构建变体隔离支付实现,但不能通过运行时配置规避某个商店的审核要求。
interface PaymentGateway {
fun startPurchase(productId: String)
}
class PlayBillingGateway : PaymentGateway {
override fun startPurchase(productId: String) {
// Start a Google Play Billing purchase flow.
}
}
class ThirdPartyPaymentGateway : PaymentGateway {
override fun startPurchase(productId: String) {
// Start the approved third-party payment flow.
}
}
例如,可以在构建阶段为不同渠道注入对应的实现:
val paymentGateway: PaymentGateway =
if (BuildConfig.DISTRIBUTION_CHANNEL == "google_play") {
PlayBillingGateway()
} else {
ThirdPartyPaymentGateway()
}
这里的渠道判断只应用于维护合规的发行版本,不能用来绕过 Google Play Billing 的要求。
3. 数字商品使用 Google Play Billing
Google Play 版本销售应用内数字商品时,可以使用 BillingClient 建立连接:
val billingClient = BillingClient.newBuilder(context)
.setListener { billingResult, purchases ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
purchases?.forEach { purchase ->
// Send purchase.purchaseToken to the backend for verification.
}
}
}
.enablePendingPurchases()
.build()
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
// Billing service is ready. Query product details here.
}
}
override fun onBillingServiceDisconnected() {
// Retry later with an appropriate backoff strategy.
}
})
完整实现还需要查询 ProductDetails、调用 launchBillingFlow(),并在服务端验证 purchaseToken。购买完成后,应根据商品类型进行确认或消耗处理。权益发放不能只依赖客户端回调。
4. 实体商品接入第三方支付
如果交易属于允许使用第三方支付的场景,可以集成支付服务商提供的 Android SDK。支付订单应由服务端创建,商户密钥不能写入 APK:
data class PaymentRequest(
val orderId: String,
val amountMinor: Long,
val currency: String
)
fun startPayment(request: PaymentRequest) {
// Obtain a short-lived payment token from your backend.
// Pass the token to the payment provider's official Android SDK.
}
amountMinor 表示最小货币单位,例如人民币分。实际金额应由服务端根据订单重新计算,不能信任客户端上传的金额。
推荐采用以下流程:
Android App
→ Backend creates order
→ Payment provider creates payment session
→ Android App opens provider SDK
→ Provider notifies backend through webhook
→ Backend verifies notification and updates order
→ Android App queries the final order status
付款成功页面只是给用户看的界面反馈。最终发货或开通权益,应以服务端验证后的支付状态为准。
还需要遵守的条款
除了应用商店规则,通常还要检查:
- 第三方支付服务商的商户协议和禁止交易清单;
- 支付服务商对 SDK、品牌标识和支付页面的使用要求;
- 隐私政策、数据收集说明和用户授权;
- 支付卡数据安全要求,如适用时的 PCI DSS;
- 当地有关消费者保护、退款、自动续费和税务的规定;
- 用户取消订阅、关闭自动续费和查询账单的途径;
- Webhook 签名验证、订单幂等和重复通知处理;
- Google Play 对外部链接及引导用户使用其他支付渠道的限制。
支付政策会随地区和时间变化。上线前,应根据目标市场核对 Google Play 最新的支付政策、适用计划条款和第三方支付服务商文档。如果销售的是数字商品,不能仅凭技术上可以打开网页或第三方 SDK,就认定这种支付方式能够通过审核。
备注:内容仅供参考。
