INTEGRATION · V2.0 · 2026.08

HopoPay 支付接入文档

第三方 App 通过标准 Android Intent 调用 HopoPay(原 8BPay)完成支付扣款。 无需服务器、无需审核、无需引入 SDK,三步即可接入:构造 Intent → 启动支付 → 校验返回令牌。

01接入流程

HopoPay 以 Android Intent 动作(Action)对外暴露支付能力。调用方无需持有任何支付凭证, 用户在 HopoPay 中选择支付账户并经指纹验证后,扣款即完成,结果随 onActivityResult 原样返回。

第三方 App 生成随机 token HopoPay 支付页 指纹验证 扣款 + 返回 token
1

构造 Intent

声明支付动作,携带金额、收款方、商品名与一次性 paymentToken。

2

启动支付

startActivityForResult / Activity Result API 唤起 HopoPay 支付页。

3

校验令牌

在 onActivityResult 中比对返回的 token 是否与发送时一致,一致才可信。

核心安全点 paymentToken 防伪校验:调用前生成 UUID 传入,成功后比对返回令牌是否一致,可防止第三方 App 收到伪造的 RESULT_OK 回调。

02Intent 动作声明

HopoPay 提供三个支付动作,对应三种资产类型:

动作 (Action)资产类型必带参数
com.eightb.pay.action.PAY Money · 金额 amount
com.eightb.pay.action.PAY_TIME Time · 时长(分钟) timeAmount
com.eightb.pay.action.PAY_CHANCE Chance · 机会(特大/大/中/小) opportunityType + opportunityAmount

请在发起前使用 resolveActivity 检查 HopoPay 是否已安装;未安装时引导用户前往下载页。

03参数说明

以下参数通过 Intent 的 putExtra 传递:

参数类型必填默认值说明
amountDouble / Int / Float0支付金额,如 99.50,支持三种数字类型
timeAmountDouble / Int / Float0扣除时长(分钟)
opportunityTypeString机会类型:extraLarge / big / medium / small
opportunityAmountInt0扣除机会数量
payeeString未知收款方收款方名称,显示在支付页
productNameString商品购买商品 / 服务名称
paymentTokenString推荐调用方生成随机值(如 UUID),成功时原样返回用于校验
descriptionString补充说明,留空不显示
注意 amount 必须 ≤ 用户余额,否则该用户不会出现在支付账户选择器中。

04返回结果

成功 · RESULT_OK

Extra类型说明
transactionIdLong交易流水号(时间戳)
amount / timeAmount / opportunity*实际扣款金额 / 时长 / 机会数量
payeeString收款方名称
productNameString商品名称
paymentTokenString调用方传入的令牌,原样返回,用于校验
userIdLong支付用户的 HopoPay 内部 ID
usernameString支付用户的昵称(回退为用户名)

取消 · RESULT_CANCELED

以下情况返回取消:

  • 所有用户余额不足(跳转前直接返回)
  • 用户主动点击取消
  • 指纹验证失败

05完整示例

推荐使用 Activity Result API(API 30+),无需处理请求码生命周期:

ModernPaymentActivity.kt
// 1. 注册结果回调
private var pendingToken: String? = null

private val payLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    if (result.resultCode == RESULT_OK && result.data != null) {
        val data = result.data!!
        // ★ 校验令牌,防止伪造回调
        if (data.getStringExtra("paymentToken") != pendingToken) return@registerForActivityResult
        val amount = data.getDoubleExtra("amount", 0.0)
        val username = data.getStringExtra("username") ?: ""
        Toast.makeText(this, "$username 支付 ¥$amount 成功", Toast.LENGTH_SHORT).show()
    } else {
        Toast.makeText(this, "支付取消", Toast.LENGTH_SHORT).show()
    }
}

// 2. 发起支付
fun pay(amount: Double, payee: String, product: String) {
    val token = UUID.randomUUID().toString()
    pendingToken = token
    val intent = Intent("com.eightb.pay.action.PAY").apply {
        putExtra("amount", amount)
        putExtra("payee", payee)
        putExtra("productName", product)
        putExtra("paymentToken", token)
    }
    if (intent.resolveActivity(packageManager) != null) {
        payLauncher.launch(intent)
    } else {
        // 引导用户安装 HopoPay
    }
}

时长 / 机会支付

换用对应动作与参数即可:

TimeAndChance.kt
// 时长支付:扣 30 分钟
Intent("com.eightb.pay.action.PAY_TIME").apply {
    putExtra("timeAmount", 30)
    putExtra("payee", payee); putExtra("productName", product)
    putExtra("paymentToken", token)
}

// 机会支付:扣 2 个「大」机会
Intent("com.eightb.pay.action.PAY_CHANCE").apply {
    putExtra("opportunityType", "big")
    putExtra("opportunityAmount", 2)
    putExtra("payee", payee); putExtra("productName", product)
    putExtra("paymentToken", token)
}

06错误处理

检查 HopoPay 是否安装

Installer.kt
fun isHopoPayInstalled(): Boolean {
    val intent = Intent("com.eightb.pay.action.PAY")
    return intent.resolveActivity(packageManager) != null
}

fun goToDownload() {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = Uri.parse("https://hopopay.example.com/download")
    }
    startActivity(intent)
}
重要 收到 RESULT_OK 不代表支付必然可信:任何返回结果都应在比对 paymentToken 一致后再接受。

07注意事项

  1. 必须提前安装 HopoPay,并通过 resolveActivity 检查可用性。
  2. 用户需预先在 HopoPay 中添加账户并充值,余额不足的用户不会出现在选择器中。
  3. 若 HopoPay 启用了指纹验证,支付时会弹出系统指纹确认,调用方无需额外处理。
  4. transactionId 是 HopoPay 内部流水号,建议第三方 App 自行维护业务订单号。
  5. 强烈建议使用 paymentToken 校验机制,防止收到伪造的 RESULT_OK。
  6. HopoPay 支持 cleartext HTTP,但建议第三方 App 的服务器通信仍使用 HTTPS。
  7. HopoPay 不会向任何远程服务器发送支付数据,所有扣款仅在本地完成。
  8. 支付页用户选择器为横向卡片样式,圆形头像 + 姓名 + 余额展示。

08版本与兼容

品牌HopoPay(原 8BPay,Web / 官网统一更名)
接入版本文档 v2.0 · 2026.08 · App 3.2+
支付动作com.eightb.pay.action.PAY / PAY_TIME / PAY_CHANCE
兼容方式startActivityForResult(全 API)+ Activity Result API(API 30+)
示例工程仓库 sample-client 目录,可直接用 Android Studio 打开编译
立即体验 动手试试:前往 云端体验,在浏览器中模拟完整支付流程。