商家接入 · 快速开始
5 分钟接入。流程:用户在你的网站消费硬币 → 你上报一次事件 → CoinHub 把 USDT 直接打款给目标用户 → 你设置的手续费回流到你的商家账户。
CoinHub 怎么帮你结算?
- 你只负责上报「谁 / 在你站内的什么 / 花了多少硬币」。
- CoinHub 直接把对应金额打款给目标用户(创作者 / 卖家 / 被打赏方),用户无需注册 CoinHub。
- 你自己设定的手续费部分,按月结算到你的虚拟币收款地址。
- 资金不经过你的服务器,避免合规与代收风险。
01
创建商家账号
前往 商家免费接入,邮箱注册并输入 6 位邮箱验证码完成验证,再添加你的网站域名并完成所有权验证(在站点根目录放置指定 HTML 文件)。
02
获取 API 密钥与回调地址
登录后在 商家中心 → 开发者:
- API Key:请求头
X-API-Key携带。 - API Secret:仅创建时展示一次,作为
X-API-Signature = HMAC-SHA256(secret, rawBody)。 - 回调地址:CoinHub 完成打款后会 POST 到这里,事件为
payout.sent/payout.failed, 请求头X-Webhook-Signature用同一 secret 校验。
Secret 丢失只能轮换。不要写入前端或公开仓库。
03
上报兑换事件(最小可用请求)
用户在你的网站点击「用 100 硬币打赏作者」时,你的后端调用一次:
POST https://easy-coin-mart.lovable.app/api/public/merchant/charge
Content-Type: application/json
X-API-Key: ck_xxx
X-API-Signature: <hex(hmac_sha256(secret, rawBody))>
{
"user_email": "spender@example.com", // 在你站内消费硬币的用户
"coins": 100, // 本次消费的硬币数
"reference": "tip-2026-0001", // 幂等键:同一值重复请求不会重复处理
"description": "打赏文章 #1234 作者 alice@example.com"
}成功返回 200 { ok: true, charge_id, fee_coins, net_coins, balance }。 CoinHub 会按 description 中你登记的「收款用户」把对应 USDT 直接打到对方钱包,对方无需在 CoinHub 注册。如需指定收款人,扩展字段 payee:
{
"user_email": "spender@example.com",
"coins": 100,
"reference": "tip-2026-0001",
"payee": {
"chain": "TRC20",
"address": "TXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ref": "creator:alice@example.com"
}
}04
复制示例 — Node.js / curl
// Node.js
import crypto from "crypto";
const body = JSON.stringify({
user_email: "spender@example.com",
coins: 100,
reference: "tip-2026-0001",
payee: { chain: "TRC20", address: "TXxxx...", ref: "creator:alice" },
});
const sig = crypto.createHmac("sha256", process.env.COINHUB_SECRET)
.update(body).digest("hex");
await fetch("https://easy-coin-mart.lovable.app/api/public/merchant/charge", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.COINHUB_KEY,
"X-API-Signature": sig,
},
body,
});# curl
BODY='{"user_email":"spender@example.com","coins":100,"reference":"tip-2026-0001"}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$COINHUB_SECRET" | awk '{print $2}')
curl -X POST https://easy-coin-mart.lovable.app/api/public/merchant/charge \
-H "Content-Type: application/json" \
-H "X-API-Key: $COINHUB_KEY" \
-H "X-API-Signature: $SIG" \
-d "$BODY"05
接收打款回调(可选)
CoinHub 完成对目标用户打款后会推送:
{
"event": "payout.sent",
"reference": "tip-2026-0001",
"payee_ref": "creator:alice@example.com",
"chain": "TRC20",
"address": "TXxxx...",
"amount_usdt": "13.47",
"txid": "0xabc...",
"fee_coins": 3, // 你站点设置的手续费(将按月结算给你)
"at": "2026-06-07T10:00:00Z"
}请求头 X-Webhook-Signature = hex(hmac_sha256(callback_secret, rawBody)),X-Webhook-Event 为事件名。务必先验签再处理,否则任何人都可以伪造打款回调。
// Node.js (Express) 验签示例
import crypto from "crypto";
app.post("/coinhub/webhook", express.raw({ type: "application/json" }), (req, res) => {
const sig = req.header("X-Webhook-Signature") ?? "";
const expected = crypto.createHmac("sha256", process.env.COINHUB_CB_SECRET)
.update(req.body).digest("hex");
const ok = sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
if (!ok) return res.status(401).end("bad signature");
const evt = JSON.parse(req.body.toString("utf8"));
// evt.event === "payout.sent" | "payout.failed"
res.json({ ok: true });
});打款进度也可以在 商家中心 · 打款记录 按批次查看、重试或转人工。
06
常见错误码对照
每一行的 code 都可点击跳转到 接入日志,按该错误码筛选你最近的真实请求。
| HTTP | code | 说明 / 处理建议 |
|---|---|---|
| 401 | missing_auth_headers | 未带 X-API-Key 或 X-API-Signature |
| 401 | invalid_api_key | API Key 不存在或已被删除 |
| 401 | invalid_signature | HMAC-SHA256 签名不匹配,检查 secret 与 body 字节是否一致 |
| 403 | site_not_verified | 对应网站尚未完成所有权验证 |
| 400 | invalid_body | 请求体字段缺失/类型错误,参考 Schema |
| 409 | duplicate_reference | 同一 reference 已上报过(幂等命中) |
| 422 | insufficient_balance | 目标用户在该站点的硬币余额不足 |
| 429 | rate_limited | 1 分钟内失败 5 次已被临时封禁 15 分钟 |
遇到问题?
查看 FAQ 或邮件 support@coinhub.example。