Bitcoin API:无需运行节点即可接受 BTC 支付
通过 REST API 接受 BTC 支付。生成存款地址,跟踪确认数,无需运行完整的 Bitcoin 节点即可发送提现。
搜索 Bitcoin API,第一个结果通常是 Bitcoin Core 的 RPC 参考文档。它是这条网络的规范接口,并且假定你在运行一个完整节点:安装 bitcoind,同步大约几百 GB 的链数据,让机器保持在线,并在每次发布时重复升级周期。对某些项目来说,这是正确的路径。但如果你只是想在应用中接受 BTC 付款,这就绕了远路。
Chaingateway 的 Bitcoin API 是 REST 版的替代方案。你通过普通 HTTPS 创建钱包和存款地址,用一次 POST 发送 BTC,并在代币到账时收到 Webhook。从最朴素的意义上说,这就是一个 BTC API:进去是 HTTPS,出来是 JSON。认证方式是来自免费 7 天试用的 Bearer 令牌——开始时无需节点,无需 KYC。
通过 REST 使用 Bitcoin,而不是 JSON-RPC
Bitcoin Core 的 JSON-RPC 在给出第一个有用的响应之前,需要一个已同步的节点。REST API 需要的是一个 API 密钥。这个区别会体现在你的日程表上:在典型硬件上,初始区块下载需要数天,之后节点还会持续占用磁盘和带宽,并在产品存续期间一直需要监控。我们关于 blockchain API 与 blockchain node 对比的文章详细比较了这两种方式。当你需要对网络视图拥有策略层面的控制权时,运行自己的节点;当支付才是目标时,使用 API。
日常调用能干净地映射到 REST 模型上。节点集成需要包装 getnewaddress 和 listtransactions 并轮询变化,而 API 只需分配地址,让 Webhook 负责监视。轮询循环消失了,随之消失的还有那些在周末悄悄崩溃的 cron 任务。
还有第二个区别。原始的 RPC 方法返回原始数据。Chaingateway 返回带有可读字段的结构化 JSON,因此响应可以直接进入你的数据库,而不必经过一层解析。
使用 bitcoin-core RPC 需要做什么,并排对比
一旦把实际工作列出来,这个对比就变得具体了。假设任务是「为每个客户提供一个存款地址,并在 BTC 到账时为其账户入账」。
| 任务 | 使用 Bitcoin Core(JSON-RPC) | 使用 REST API |
|---|---|---|
| 前提条件 | 一个已同步的完整节点:bitcoind 加上几百 GB 的链数据 | 一个 API 密钥 |
| 新的存款地址 | 每个客户调用一次 getnewaddress,外加你自己写脚本实现的钱包备份机制 | POST /api/v2/bitcoin/wallets/{wallet}/addresses |
| 检测传入 BTC | 配置 walletnotify,或者定时轮询 listsinceblock / gettransaction | 签名的 Webhook POST 发送到你的服务器 |
| 发送 BTC | sendtoaddress,外加节点中的热钱包、你自己掌控的手续费设置和钱包文件备份 | POST /api/v2/bitcoin/transactions |
| 追踪确认数 | 反复轮询 gettransaction,直到确认数满足你的策略 | 轮询 GET /api/v2/bitcoin/transactions/{txid}/decoded,其中携带确认数 |
| 审计追踪 | 解析 listtransactions 的输出并在自己的代码中去重 | GET /api/v2/bitcoin/webhooks/notifications |
| 持续成本 | 磁盘、带宽、升级、监控 | 提供商的问题 |
出账付款值得更仔细地看一看。sendtoaddress 看起来只是一次调用,但它假定节点内有一个热钱包、手续费设置由你掌控,并且钱包文件有经过测试的备份。即便是 getbalance 也比看起来更窄:它报告的是节点钱包的余额,而不是任意地址的余额,因此交易所式的记账工作仍然落在你的代码里。这些都不是在批评 Bitcoin Core——它是运营这条网络的参考软件,并且在这项工作上表现出色。它从来就不是为 Web 应用的支付后端而设计的,这也是为什么围绕它会积累这么多胶水代码。
通过 REST 发送 BTC
发送路径的 REST 一侧只有三个接口。POST /api/v2/bitcoin/wallets 创建一个钱包,用 Chaingateway 不会存储的密码加密——丢失密码就没有人能恢复该钱包,这正是设计的目的。POST /api/v2/bitcoin/wallets/{wallet}/addresses 在其下派生出你需要数量的地址;一个钱包承载全部地址。而 POST /api/v2/bitcoin/transactions 负责发送:
curl -X POST https://app.chaingateway.io/api/v2/bitcoin/transactions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
"amount": 0.0015,
"walletname": "treasury",
"password": "wallet-password",
"speed": "medium"
}'
响应携带已广播交易的 txid。speed 可取 fast、medium 或 slow,用于设定手续费等级——即成本与首次确认时间之间的权衡。可选的 subtractfee: true 会从金额中扣除网络手续费,而不是额外叠加,这在客户提取全部余额时很有用。
这就是完整的发送调用——创建账户,用你自己的钱包在测试网上运行它。
接受 BTC 所需的一切
Webhook(IPN)
面向传入交易的即时支付通知,在匹配的交易在链上结算后立即发送。在你的个人资料中设置一个私密密钥,每条通知就会携带一个可供你的服务器验证的 X-Signature 请求头。投递失败的记录列在 GET /api/v2/bitcoin/webhooks/notifications/failed,一次调用即可重新发送。
可预测的 REST 接口
用简洁、一致的 API 创建地址并追踪付款。请求和响应的风格与 Chaingateway 平台的其他部分一致,因此已经对接过一条链的开发者无需说明书就能读懂 Bitcoin 的响应。
安全的地址处理
从设计上就是非托管的,并内置地址校验。格式错误或拼写错误的地址会在触碰链之前就被拒绝。
解码后的查询
交易数据以结构化 JSON 返回,而不是原始十六进制,包含你后端需要据以行动的金额和确认状态。
出块时间与确认数:应有的预期
比特币大约每十分钟出一个区块,尽管单次间隔差异很大。在包含你交易的区块之上每挖出一个新区块,就会增加一次确认,每一次确认都让回滚变得更困难。
| 付款金额 | 建议等待的确认数 |
|---|---|
| 小额,约 1,000 美元以内 | 1(约 10 分钟) |
| 中等,约 10,000 美元以内 | 3(约 30 分钟) |
| 大额 | 6(约 1 小时) |
| 超大额,超过 100 万美元 | 10 次或更多 |
六次确认——大约一小时——自早期交易所时代以来一直是「已结算」的事实标准,截至 2026 年年中依然成立。
十分钟是平均值,不是时间表
难度调整会让它在长期内保持稳定,但单次间隔围绕这个平均值大幅波动——一分钟内出两个区块会发生,四十分钟没有区块的情况也会发生。支付体验设计必须尊重这一点:「大约十分钟」是一个平均值,不是一个承诺,因此你的结账页面应该写「通常在一小时内」,而不是运行一个它无法遵守的倒计时。
为什么不在零确认时就入账?
因为在交易被打包进区块之前,它停留在内存池(mempool)中,在那里可能被替换或双花,即使是最新的区块,也可能在链重组中被移出主链。API 把这项工作拆成两部分。Webhook 会在交易于链上结算的那一刻触发——payload 携带金额、地址、txid 和区块号——因此你的界面可以立即做出反应。之后,GET /api/v2/bitcoin/transactions/{txid}/decoded 返回当前的确认数,让你的账本只为达到你设定阈值的资金入账。及早展示进度,延后完成结算。
UTXO:为什么比特币存款不同于 EVM 链
比特币没有账户余额这一概念。链上存储的是未花费的交易输出——UTXO,每一个都是锁定在某个地址上的一小笔独立价值。一个钱包的「余额」是你的软件通过汇总其地址控制的每一个 UTXO 计算出来的数字;协议本身从不在任何地方存储这个总和。花费会消耗整个 UTXO 并创建新的 UTXO,包括返还给自己的找零输出——就像用一张十欧元纸币支付一笔七欧元账单会找回零钱一样。
以太坊采用相反的模型。一个账户对应一个余额,链直接存储它,一次存款就是一次递增。在 EVM 链上,给客户一个地址、让上百笔存款在多年间堆积在这个地址上,是很正常的做法。
对存款处理而言,UTXO 模型有一个实际的优势:它天然引导你为每位客户或每张发票使用一个地址,而这本来就是更干净的设计。每一笔传入付款都是发往你所监控地址的一个新输出,因此归属是明确无歧义的——无需解析备注,无需按金额匹配。这也意味着「某个地址的余额」是一个由索引器而不是链本身回答的问题,而这正是你通过使用带 Webhook 的 API、而不是自己搭建这套机制所外包出去的记账工作。通知会告诉你:这笔金额、这个地址、这笔交易、这个区块。剩下的交给你的账本。
存款流程,逐步说明
Chaingateway 上大多数比特币集成都围绕存款展开:每个客户一个地址,每笔付款一个 Webhook。
- 从你的钱包为每位客户分配一个存款地址(
POST /api/v2/bitcoin/wallets/{wallet}/addresses)。 - 客户发送 BTC。
- 一旦交易在链上结算,Chaingateway 会向你的服务器 POST 一条签名通知,携带金额、地址、txid 和区块号。
- 你的后端验证签名,并在确认数——从
GET /api/v2/bitcoin/transactions/{txid}/decoded读取——达到你的阈值后为账户入账。
有两点实现细节需要注意。投递并非严格恰好一次——你通过 API 重新发送的一条失败通知会完整地再次到达——因此要让你的处理程序具备幂等性,并以交易 ID 而不是回调次数作为入账的键。同时确认数的存在是有原因的:最新的区块仍可能在重组中被孤立,这也是为什么入账决策应该基于确认数,而不能仅凭 Webhook。
把每一笔存款建模为一个小型状态机,而不是一个布尔值会很有帮助。一个订单从 awaiting_payment 开始,Webhook 触发时进入 detected,在你的轮询器监视确认数期间经过 confirming,达到阈值后落到 settled——并用 underpaid 和 expired 作为明确的旁路出口。有些客户会针对 0.001 BTC 的发票只发送 0.00095 BTC,通常是因为他们的钱包从输入金额中扣除了网络手续费;请提前决定你的容忍度是吸收这个差额,还是让订单等待补足差价。并为发票设置有效期。汇率在变动,因此周一与发票金额匹配的地址,不应该在下一周按过时的价格结算。
为便于审计和对账,你的账户收到的每一条通知都可以通过 API 列出:
curl https://app.chaingateway.io/api/v2/bitcoin/webhooks/notifications \
-H "Authorization: Bearer YOUR_API_KEY"先用 Testnet
加上请求头 X-Network: testnet,本页每一次调用都会运行在比特币测试网络上:相同的路由,相同的响应结构,代币没有任何价值。水龙头免费发放测试用 BTC,因此整个存款流程——地址、付款、Webhook、确认——都可以从头到尾演练一遍,而不花一聪(satoshi)。
把这个请求头放在配置里,而不是散落在代码各处,并为你的预发布环境设置一个独立的回调 URL,这样测试存款就不会泄漏进生产账本。当演练顺利通过后,移除这个请求头。集成的其他部分不需要任何改动,这正是它的意义所在:第一笔主网存款应该是平淡无奇的。
当出现故障时
支付后端的价值恰恰体现在糟糕的日子里,所以要明确规划失败路径。
在 HTTP 层面,规则是标准的 REST 规则。401 意味着 Bearer 令牌错误或缺失;修正密钥,而不是重试。其他 4xx 响应指向请求本身——记录响应体,它会说明问题所在,并把它当作一个 bug 来处理。5xx 范围的响应和超时是临时性的;用退避策略重试它们。
比特币特有的失败模式存在于 HTTP 之上。一笔始终无法确认的存款通常是手续费给得太低、卡在内存池中;它可能几小时后确认,也可能彻底消失,这也是为什么 detected 和 settled 在你的系统中必须是分开的状态。一条金额低于发票的通知是一项业务决策,而不是错误——用代码来处理它,而不是靠支持工单。如果你的 Webhook 接口曾经宕机,失败的投递会在那里等你:GET /api/v2/bitcoin/webhooks/notifications/failed 会列出它们,POST /api/v2/bitcoin/webhooks/notifications/{id}/retry 可以逐条重新发送,而 GET /api/v2/bitcoin/webhooks/notifications 上的完整列表能让你与账本比对差异并补上缺口。即使一切看起来正常,也要每晚执行一次这种比对。只有在出事之后才运行的对账机制,只会在生产环境中发现自己的 bug。
需要在 BTC 之外支持稳定币?
比特币本身没有 USDT 或 USDC——稳定币生活在其他链上。共享平台带来的是先发优势:你的比特币集成已经使用与我们的 Ethereum 和 TRON 接口相同的 API。今天接受 BTC,下个冲刺周期用同一个密钥、同一个 Webhook 处理程序在 TRON 上加上 USDT。blockchain API 总览列出了全部七条受支持的链。
对大多数团队来说,实用的顺序是:先上线 BTC 存款,因为这是客户会直接指名要求的功能,然后让支付数据告诉你接下来该加哪条稳定币通道。在 Chaingateway 上,这条第二通道会原样复用你的签名验证、对账任务和存款状态机。
为什么开发者选择在 Bitcoin 上构建
- 它拥有所有区块链中最长的运行记录,自 2009 年运行至今,也拥有终端用户中最广泛的认可度。
- 网络全天候结算。没有银行营业时间,也没有地区截止时间。
- 确认遵循可预测的节奏,大约每十分钟一个新区块,这让支付流程易于推理。
- 其采用规模是所有加密网络中最大的,因此「你们接受比特币吗?」仍然是客户最先问的问题。
这些特性都不是来自某次路线图更新;它们与该网络最初发布时提供的保证完全相同。这种稳定性正是在长周期产品中选择 BTC 的理由:今年构建的集成不会因为明年的协议转向而被淘汰——这是大多数支付技术栈都无法承诺的。
为真实支付场景而生
最明显的场景是收银台:客户选择比特币,你的应用分配一个地址;Webhook 确认付款。同样的构建模块也能承载更重的负载。交易所和游戏平台为每位用户运行一个存款地址,在确认后为余额入账。付款和汇款流程无需中间的代理银行即可推动跨境转账。订阅业务在每个周期生成一个全新的发票地址,让 Webhook 完成收尾。
这些场景的共同点在于工作的形态。比特币负责结算;你的应用负责状态。API 位于两者之间,把链上事件转化为你的框架已经知道如何路由的 HTTP 调用——这也是为什么收银场景和交易所场景可以运行在同样几个接口上。
三步完成集成
获取你的 API 密钥。注册免费,试用期开始时无需 KYC。
发出你的第一个请求。用 GET /api/account 确认密钥有效,然后创建一个钱包和你的存款地址。
设置 Webhook 并上线。把通知指向你的接口,验证 HMAC 签名,然后移除 X-Network: testnet 请求头——同样的代码就能运行在主网上。
各条链支持哪些功能
Bitcoin 是唯一没有代币转账列的一行:这条链没有代币标准,因此原生 BTC 通过自己的钱包模型运行,而不是通过类似 ERC-20 的调用。以下是它与其他六条链的对比。
| 链 | 地址 | 代币转账 | 存款 Webhook |
|---|---|---|---|
| Bitcoin | POST /api/v2/bitcoin/wallets/{wallet}/addresses | —(无代币标准) | GET /api/v2/bitcoin/webhooks/notifications |
| Ethereum | POST /api/v2/ethereum/addresses/import | ERC-20:POST /api/v2/ethereum/transactions/erc20 | GET /api/v2/ethereum/webhooks/notifications |
| TRON | POST /api/v2/tron/addresses/import | TRC-20 和 TRC-10:POST /api/v2/tron/transactions/trc20 和 .../trc10 | GET /api/v2/tron/webhooks/notifications |
| Solana | POST /api/v2/solana/addresses | SPL:POST /api/v2/solana/transactions/SPL | — |
| BNB Smart Chain | POST /api/v2/bsc/addresses/import | BEP-20:POST /api/v2/bsc/transactions/bep20 | GET /api/v2/bsc/webhooks/notifications |
| Polygon | POST /api/v2/polygon/addresses/import | ERC-20:POST /api/v2/polygon/transactions/erc20 | GET /api/v2/polygon/webhooks/notifications |
| Arbitrum | POST /api/v2/arbitrum/addresses/import | ERC-20:POST /api/v2/arbitrum/transactions/erc20 | GET /api/v2/arbitrum/webhooks/notifications |
正确理解此表需要两点说明。第一:TRON 是平台上集成最深的链。除上述路由外,参考文档还记录了质押(POST /api/v2/tron/freeze 和 /delegate)、链参数,以及一对自签名接口——/transactions/trc20/build 用于构建交易,/transactions/broadcast 用于提交本地签名后的交易。如果你的合规团队坚持要求私钥永远不离开你的服务器,这种 build-and-broadcast 模式就是你的方案。
第二:表格中的破折号表示当前参考文档尚未记录该单元格对应的 v2 路由,并不意味着该网络是二等公民。Bitcoin 没有代币标准,因此代币列为空——原生 BTC 通过自己的钱包模型运行:使用 POST /api/v2/bitcoin/wallets 创建密码加密的钱包,在其下派生存款地址,并通过 POST /api/v2/bitcoin/transactions 发送。Solana 的参考文档涵盖地址创建、SOL 和 SPL 转账,以及余额和区块查询,但尚无 Webhook。此处未列出的内容,请参阅 API 参考文档 获取当前状态。
常见问题
准备好接受比特币支付了吗?
在 app.chaingateway.io/register 创建账户,创建一个钱包并在测试网上发送一笔 BTC 转账。完整接口参考见 文档,套餐和速率限制在单独的页面上。