加密货币支付
如何通过 Coinbase Commerce 或 NOWPayments 等网关收 USDC/USDT/BTC,不在账上持有加密货币。
为什么
一小部分但发声强烈的用户 — 注重隐私的开发者、加密原生产品、被 Stripe 封锁国家的客户 — 只用加密货币支付。收稳定币(USDC/USDT)让你获得这部分收入而无持 BTC 的波动风险,因为网关结算时自动转法币。合规负担比看起来低:用托管网关且不碰私钥,多数司法管辖区下你不是货币传送者。主要成本是会 计复杂度 — 加密支付在收到时是应税事件,需 Koinly 等工具跟踪成本基准。对多数 SaaS 这是 1 天集成换 2-5% 收入解锁。
何时使用
当有加密原生用户、卖到制裁邻近地区、或做隐私产品时。企业采购受众跳过 — 他们不能付加密货币。
如何做
1. 选网关:Coinbase Commerce(托管结账,仅美国)、NOWPayments(全球,50+ 币)、BitPay(企业)。除非有合规团队,避免自托管。 2. 创建账号,完成 KYB(了解你的业务),生成 API key 3. 每次结账服务端创建 charge:POST /v1/charges 带法币金额,网关按锁定汇率转所选币 4. 重定向到托管结账页,或在页面嵌入网关 widget 5. 设 webhook 监听 charge:confirmed 和 charge:failed — 网关等链上确认(通常 1-3 个区块)才确认 6. 确认后授权;存 txid 和币种用于退款/对账 7. 配置自动结算为法币,永不过夜持币(Coinbase Commerce 默认如此) 8. 退款通过网关 API 用原 charge id 发起 — 绝不手动退币
示例
// 服务端:创建 Coinbase Commerce charge
const res = await fetch("https://api.commerce.coinbase.com/charges", {
method: "POST",
headers: {
"X-CC-Api-Key": process.env.COINBASE_COMMERCE_KEY!,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Pro 计划 — 月付",
description: "EZ4Code Pro 订阅",
pricing_type: "fixed_price",
local_price: { amount: "29.00", currency: "USD" },
metadata: { userId: user.id },
}),
});
const { data } = await res.json();
// 重定向到 data.hosted_url
// webhook:等链上确认
app.post("/api/crypto-webhook", async (req, res) => {
const event = req.body;
if (event.type === "charge:confirmed") {
const userId = event.data.metadata.userId;
await grantEntitlement(userId, { source: "crypto", txid: event.data.id });
}
res.status(200).send("ok");
});常见问题
- ⚠收波动币(BTC/ETH)不自动转换 — charge 到确认间价跌 20%,99 美元计划卖了 79 美元。用稳定币或开自动转法币。
- ⚠链上确认前就授权 — 用户可广播双花拿到权益。始终等网关 charge:confirmed 事件,它隐含 N 次确认。
- ⚠手动退币 — 地址打错退款永远消失无追索。始终通过网关 API 退款,它跟踪原 charge。
最佳实践
- ✓默认稳定币(USDC/USDT),BTC 为辅 — 稳定币给你加密受众而无国库管理头痛。
- ✓用托管结账页而非嵌入支付 widget — 网关处理钱包连接、二维码、链选择,你不碰任何钱包逻辑。
- ✓记录 charge 时法币金额而非加密金额 — 会计按收到时美元价值报告,网关结算报告给成本基准。