第三方 App 通过标准 Android Intent 调用 HopoPay(原 8BPay)完成支付扣款。 无需服务器、无需审核、无需引入 SDK,三步即可接入:构造 Intent → 启动支付 → 校验返回令牌。
HopoPay 以 Android Intent 动作(Action)对外暴露支付能力。调用方无需持有任何支付凭证, 用户在 HopoPay 中选择支付账户并经指纹验证后,扣款即完成,结果随 onActivityResult 原样返回。
声明支付动作,携带金额、收款方、商品名与一次性 paymentToken。
startActivityForResult / Activity Result API 唤起 HopoPay 支付页。
在 onActivityResult 中比对返回的 token 是否与发送时一致,一致才可信。
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 是否已安装;未安装时引导用户前往下载页。
以下参数通过 Intent 的 putExtra 传递:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| amount | Double / Int / Float | — | 0 | 支付金额,如 99.50,支持三种数字类型 |
| timeAmount | Double / Int / Float | — | 0 | 扣除时长(分钟) |
| opportunityType | String | — | — | 机会类型:extraLarge / big / medium / small |
| opportunityAmount | Int | — | 0 | 扣除机会数量 |
| payee | String | 是 | 未知收款方 | 收款方名称,显示在支付页 |
| productName | String | 是 | 商品购买 | 商品 / 服务名称 |
| paymentToken | String | 推荐 | — | 调用方生成随机值(如 UUID),成功时原样返回用于校验 |
| description | String | — | — | 补充说明,留空不显示 |
| Extra | 类型 | 说明 |
|---|---|---|
| transactionId | Long | 交易流水号(时间戳) |
| amount / timeAmount / opportunity* | — | 实际扣款金额 / 时长 / 机会数量 |
| payee | String | 收款方名称 |
| productName | String | 商品名称 |
| paymentToken | String | 调用方传入的令牌,原样返回,用于校验 |
| userId | Long | 支付用户的 HopoPay 内部 ID |
| username | String | 支付用户的昵称(回退为用户名) |
以下情况返回取消:
推荐使用 Activity Result API(API 30+),无需处理请求码生命周期:
// 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 } }
换用对应动作与参数即可:
// 时长支付:扣 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) }
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) }
| 项 | 值 |
|---|---|
| 品牌 | 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 打开编译 |