前言
本文面向「尽快在页面上跑通收款」的前端同学;需要自建下单、对账或与后台深度集成时,请一并阅读文末 与 REST API 的配合。
好多朋友都在给自己的网站添加收款的功能,自己手搓一个支付系统发现全是坑 。CPBOX团队干脆写出一整套的支付网关,直接解决了钱包互动,链上监听等多个方面的问题,只需要安装好相应的SDK,直接搞定你网站的支付功能
本文面向「尽快在页面上跑通收款」的前端同学;需要自建下单、对账或与后台深度集成时,请一并阅读文末 与 REST API 的配合
为什么选择 CPPay
CPPay 不仅是支付网关,更是一套面向加密收款的完整管理平台:
| 能力 | 说明 |
| 可视化管理台 | 在控制台查看订单列表、支付详情与收款记录;无需自建后台也能掌握资金动态 |
| Webhook 管理 | 在控制台配置、测试并查看 Webhook 推送日志,回调调试一目了然 |
| 无代码发起支付 | 即使没有线上项目,也可在「API Key 管理」中直接创建订单并发起支付,适合快速验证或临时收款 |
| 订阅支付 | 用户授权一次后,系统按周期自动扣款,无需重复引导 |
| x402 协议 | 基于 HTTP 402 的按次计费,适合 API 变现、按量付费 |
| 零 Web3 代码 | SDK 封装钱包连接、链切换、签名与广播;业务侧无需编写 Web3 逻辑,用户按弹窗步骤即可完成支付 |
| 多链与多币种 | 支持 Ethereum、BSC 等主流链,USDT、USDC、ETH、BNB 等均可收款 |
| 按需定制链 / 币种 | 有特殊链或代币需求,可加入 Telegram VIP 群,支持 7×24 沟通与定制方案 |
| 非托管架构 | 资金直接进入你的钱包,CPPay 不经手资产 |
整体流程(从用户点击到到账)
用户侧与系统侧大致经历:选链 / 选币 → 钱包签名与链上确认 → 平台确认 → 可选 Webhook 通知你的服务端。下面用一张简图串起来(便于和联调同事对齐术语)。

四步即可在网站内完成收款:安装 SDK → 配置密钥 → 唤起支付 → 处理支付结果(含可选 Webhook)。
环境与前置条件
| 项目 | 建议 |
| 运行环境 | 现代浏览器;用户需能安装或使用浏览器钱包插件(如 MetaMask 等,以实际弹窗引导为准) |
| 站点 | 生产环境请使用 HTTPS,避免混合内容与钱包交互异常 |
| 框架 | React、Vue 等常见 SPA 均可;下方示例分别给出 CppayProvider 与 CppayPlugin 用法 |
| 构建工具 | Vite、Webpack、Rspack 等均可;若使用 SSR(如 Next.js),请将带 CppayProvider 的 subtree 置于 仅客户端渲染 的分支,或动态 import SDK,避免服务端执行浏览器专有 API |
API Key 放在哪里
- 快速接入时,
apikey通常写在前端并传入showPayment。 - 从安全角度,Key 会出现在打包产物中,不宜与极高权限的后台操作共用同一枚 Key;若控制台支持「仅前端收银」类权限或域名白名单,请按官方说明收紧范围。
- 更稳妥的架构是:下单、改价、发货等放在你的服务端,用 Key 调用 创建订单 等接口;前端只拿你方业务订单号与短链或受控参数,具体以你方安全与产品要求为准。
第一步:准备
- 登录 CPPay 控制台。
- 进入 「API Key 管理」,点击右侧生成密钥。

注意:在生产密钥时,根据你产品的支付需求,选择需要的支付方式cppay提供了三种支付方式:单次支付、订阅支付、以及X402支付。这里我们选用默认的单词支付Instant
- 选择你api支付模式,以及需要接受的网络资产,目前支持BSC和ETH的原生代币和USDC,USDT
第二步:安装 SDK
CPPay JS SDK 面向多链加密货币支付场景,支持一次性支付与订阅。通过 SDK 暴露的接口,可在现有页面中弹出统一的支付 UI。
npm install @cppay.finance/sdk
# 或
# yarn add @cppay.finance/sdk
# 或
# pnpm add @cppay.finance/sdk
第三步:在前端唤起一次性支付
React 示例
在应用根组件外包一层 CppayProvider:
// App.tsx
import { CppayProvider } from "@cppay.finance/sdk/react";
import { PayButton } from "./PayButton";
function App() {
return (
<CppayProvider>
<PayButton />
</CppayProvider>
);
}
export default App;
在需要收款的组件中调用 showPayment:
// PayButton.tsx
import { useCppayPayment } from "@cppay.finance/sdk/react";
export function PayButton() {
const { showPayment } = useCppayPayment();
const pay = () => {
showPayment({
apikey: "your-api-key",
plain: "instant",
// 若你有后台且需与用户订单关联,请使用业务侧唯一 ID;否则可自定义生成
orderId: "ORDER_20250420_001",
amount: "10.5", // 金额,USD 字符串
onSuccess: () => {
alert("支付成功");
},
onError: () => {
alert("支付失败,请重试");
},
onExpired: () => {
alert("支付超时,请重新发起");
},
onFailed: () => {
alert("支付失败,请重试");
},
});
};
return <button onClick={pay}>立即支付</button>;
}
Vue 示例
在入口注册插件:
// main.ts
import { createApp } from "vue";
import App from "./App.vue";
import { CppayPlugin } from "@cppay.finance/sdk/vue";
const app = createApp(App);
app.use(CppayPlugin);
app.mount("#app");
在页面中唤起支付:
<script setup lang="ts">
import { useCppayPayment } from "@cppay.finance/sdk/vue";
const { showPayment } = useCppayPayment();
const pay = () => {
showPayment({
apikey: "your-api-key",
plain: "instant",
orderId: "ORDER_20250420_001",
amount: "10.5",
onSuccess: () => alert("支付成功"),
onError: () => alert("支付失败,请重试"),
onExpired: () => alert("支付超时,请重新发起"),
onFailed: () => alert("支付失败,请重试"),
});
};
</script>
<template>
<button @click="pay">立即支付</button>
</template>
参数说明
| 参数 / 回调 | 说明 |
| apikey | 控制台创建的 API Key |
| plain | 一次性支付固定为 “instant” |
| orderId | 你方订单号,需保证在业务范围内唯一;若同一 orderId 已用于成功支付,再次发起可能被拒绝或产生歧义,见 常见误区 |
| amount | 订单金额,以 USD 计价的字符串(如 “10.5”);链上实际支付的代币数量由系统按汇率换算 |
| onSuccess | 支付流程在 SDK 侧判定为成功时的回调 |
| onError | 发生错误(如网络、参数、环境异常等,具体以 SDK 行为为准) |
| onExpired | 支付超时或订单过期;官方 REST 文档中一次性订单默认约 30 分钟 有效,过期后需用户重新发起 |
| onFailed | 支付失败(用户拒绝、链上失败等场景,与 onError 区分:前者偏「结果」,后者偏「异常」) |
前端回调与服务端状态如何对齐
SDK 回调用于即时反馈 UI;发货、开通权益、记账等应以服务端为准。官方 查询支付订单 接口返回的 status 包括:pending(待支付)、paid(已支付)、expired(已过期)、failed(失败)。Webhook 与查询结果应一起纳入你的状态机设计。
支付演示
代码成功跑通后,我们就能够直接进入到支付页面。这个页面就是CPPay组件里自带的支付样式。
如果你能成功进入这个页面,就表示你网站的支付功能已经成功接入了!

进入该页面后用户可以选择使用钱包支付或者是手动扫码支付。CPPAY会自动的帮你检查转账是否到账。
那如果你在支付成功后还需要有一些消息的提示,或者是触发下一步,就需要你自行配置WebHook
Webhook:服务端确认支付(可选)
若希望订单状态自动落库或与后台对账,建议配置 Webhook。
配置步骤
- 在控制台打开 Webhook 配置。
- 填写可公网访问的 HTTPS 地址,例如:
https://api.your-domain.com/webhook/cppay。 - 保存。
本地开发时,若无法被公网访问,可使用内网穿透或先在控制台用「测试」能力(若有)验证 URL,再部署到可访问环境。
回调载荷示例
对接完成后,你的服务端可能收到类似结构:
{
"order_no": "ORDER_20250420_001",
"payment_type": "instant",
"payment_id": "PAY_1234567890",
"status": "payment.success"
}
响应要求
建议返回 HTTP 200,且响应体包含:
{ "code": 1, "message": "success" }
code: 1表示本次处理成功;具体约定以控制台与正式接口文档为准。
安全建议
- 幂等:同一笔订单可能多次推送,业务需幂等,避免重复发货或重复记账。
- 二次校验:收到成功通知后,建议再调用官方查询接口确认订单状态,再执行发货等副作用;避免因异常或重放通知导致误处理。查询接口见 即时支付 API 文档。
- HTTPS 与鉴权:回调 URL 仅对可信网络开放;若官方文档提供签名或 IP 白名单,请按文档校验请求来源。
与 REST API 的配合(可选)
SDK 适合快速接入收银台;若你要在服务端创建订单、展示「应付代币数量」、或做自动化对账,可直接使用同一 API Key 调用 HTTP 接口(与 一次性支付 API 一致):
| 能力 | 方法 | 典型用途 |
| 查询支持的代币 | GET /api/srv/payment/token | 展示当前链、币种、参考价格 |
| 创建支付订单 | POST /api/srv/payment/create | 服务端生成 order_no、payment_id、收款地址与过期时间 |
| 查询订单 | GET /api/srv/payment/query | Webhook 或定时任务对账,确认 paid 后再发货 |
与 amount 的关系:REST 文档说明,amount 为商户期望收到的 USD 金额,系统会按代币价格换算链上应付数量;这与前端 showPayment 的 amount 含义一致,便于前后端共用同一套订单语义。
常见误区
- 不要对同一笔业务重复使用已支付过的
orderId。 - 若前端提示超时,用户可重新发起支付;服务端仍以 Webhook 与查询接口为准。
- Webhook 可能重试,处理逻辑须可安全重复执行。
- 仅依赖
onSuccess发货有风险:用户关闭页面、网络抖动时,应以 Webhook + 查询接口为准。
常见问题(简要)
| 问题 | 说明 |
| 弹窗打不开或白屏 | 检查是否在 HTTPS、是否被广告插件拦截、控制台是否有跨域或 CSP 报错 |
| 金额与链上不一致 | USD 标价会换算为代币数量,以订单详情与查询接口返回的 pay_amount 为准 |
| 想先在后端创建订单 | 使用 POST /api/srv/payment/create,前端再带同一 order_no 走 SDK,或按你们产品流程设计(以官方文档为准) |
