API 文档与开发者指南
v1 · 正式版快速接入
在站点上接收加密支付只需三步:创建 API 密钥、登记收款钱包地址、开出第一笔订单。由于全程非托管,收款资金直接进入由您控制的钱包。
POST /v1/merchants/{merchant_id}/api-keys— 生成用于签名请求的 API 密钥对。POST /v1/addresses— 登记 USDT 等代币收款所用的固定钱包地址(每个网络与资产各一个)。POST /v1/sweep-addresses— 登记 TRX、BNB、GRAM 等原生币收款归集的主钱包。POST /v1/webhooks— 登记付款完成时接收通知的 URL 接口。
请求签名(HMAC)
所有 HTTP 请求均使用 HMAC-SHA256 签名。签名基于请求的原始报文体(raw bytes)计算,因此即使 JSON 字段顺序发生变化,签名依然有效。
METHOD \n PATH \n TIMESTAMP \n NONCE \n SHA256(raw_body)- X-Api-Key
- API 密钥 ID(pk_…)
- X-Timestamp
- Unix 时间戳(秒,允许服务器时钟容差)
- X-Nonce
- 唯一随机字符串(最长 128 字符,一次性)
- X-Signature
- hex(hmac_sha256(secret, canonical))
请求安全由两层保障:时间戳须落在容差窗口内,且每个 nonce 仅可使用一次。重复提交同一请求会被自动拒绝(HTTP 401)。
import hashlib, hmac, os, time, json, urllib.request KEY_ID = os.environ["COINZEN_KEY_ID"]SECRET = os.environ["COINZEN_SECRET"]BASE = "https://coinzen.cerceyn.com" def request(method: str, path: str, payload: dict | None = None) -> bytes: body = json.dumps(payload).encode() if payload is not None else b"" ts = str(int(time.time())) nonce = os.urandom(16).hex() canonical = "\n".join( [method.upper(), path, ts, nonce, hashlib.sha256(body).hexdigest()] ) signature = hmac.new(SECRET.encode(), canonical.encode(), hashlib.sha256).hexdigest() req = urllib.request.Request( BASE + path, data=body or None, method=method.upper(), headers={ "X-Api-Key": KEY_ID, "X-Timestamp": ts, "X-Nonce": nonce, "X-Signature": signature, "Content-Type": "application/json", }, ) with urllib.request.urlopen(req) as resp: return resp.read()订单生命周期
创建订单后即进入状态机。若未指定网络与资产,订单以 selecting 状态开始。客户在支付页面选定网络与币种后,订单转入 pending 并分配收款地址。
selecting→pending,expired,cancelledpending→confirming,partially_paid,expired,cancelledconfirming→paid,overpaid,failedpaid⇄overpaid— 若客户对已付订单再次转账,金额会自动更新。
paid、overpaid、expired、cancelled 与 failed 为终态。遇到链上重组或迟到付款时,系统会自动更新状态并通过回调通知您的系统。
amount_exact 为 true 时,客户须转账与指定金额完全一致的数额,系统才能即时且无歧义地完成对账。回调通知
订单状态的每次变化都会推送到您登记的回调接口。每个数据包均使用 HMAC-SHA256 签名,您可据此确认数据完整且确实来自 Coinzen。
- X-Coinzen-Signature
- t=<unix>,v1=<hex hmac_sha256(secret, "<t>.<raw_body>")>
- X-Coinzen-Delivery
- 唯一投递 ID(UUID)
- X-Coinzen-Event
- 触发的事件名称(例如 invoice.paid)
import hashlib, hmac, time def verify(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool: """X-Coinzen-Signature: t=<unix>,v1=<hex>""" parts = dict(p.split("=", 1) for p in header.split(",")) t, v1 = parts["t"], parts["v1"] if abs(time.time() - int(t)) > tolerance: return False expected = hmac.new( secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, v1)支持的回调事件
invoice.pendinginvoice.confirminginvoice.partially_paidinvoice.paidinvoice.overpaidinvoice.expiredinvoice.cancelledpayment.reverteddeposit.unmatchedcredit.lowcredit.exhausted
自动重试机制
首次投递在付款完成后立即进行。若您的服务器未返回 200 OK,系统会按 30 · 120 · 600 · 3600 · 21600 · 86400 秒的间隔分七级自动重试。全部重试失败后,记录转入 dead_letter 状态,可在控制台一键重新入队。
手续费与服务余额
Coinzen 从不从客户付款中扣取手续费。USDT 及其他加密货币付款直接进入您的地址,该钱包的私钥仅由您持有。平台服务费从您预先充值的服务余额中扣减,因此收款始终足额。
- 标准费率为 1%。新开通账户前 45 天适用 0.1% 的优惠费率。当前适用费率可在
GET /v1/credit响应的fee_bps字段查看(基点:10 = 0.1%,100 = 1%)。 - 仅对成功完成的订单(
paid与overpaid)收取手续费。 - 已取消、已过期或金额不足的订单不收取任何手续费。
- 服务余额用尽时,已开订单的收款流程不受影响,正常处理;仅新建订单的请求会收到余额提示(HTTP
402)。
两步扣费模型
订单付款完成时,手续费记录立即以 pending 状态创建,不依赖任何外部服务,以免拖慢链上跟踪速度。汇率换算在后台完成后,净额从余额中扣减。
若发生链上重组导致付款回退,手续费扣减会立即作废;若已扣减,则以 reversal 记录退回余额。
服务余额充值
调用 POST /v1/credit/deposit-addresses 可获得专属的 USDT 长期充值地址。向该地址转入的资金在链上确认后即自动计入服务余额,无需人工审核或等待。
自动补足
启用后,即使服务余额归零,您的销售也不会中断。系统会将下一笔小额订单的收款直接转入服务余额,服务持续可用。
- 转入服务余额的该笔订单不再另行收取手续费。
- 出于安全考虑设有上限(默认 25 USD)。超过上限的订单不会被转入,大额订单不受影响。
- 可随时通过
PUT /v1/credit/auto接口或控制台启停,并自行设定上限。
余额提醒
服务余额低于阈值时触发 credit.low 事件,用尽时触发 credit.exhausted,让您提前知悉。
支持的区块链网络与资产
下表为正式网络注册表的摘要。如需运行时的实时清单,请调用 GET /v1/networks。
| 区块链网络 | 资产 | 小数位数 | 收款模式 | 合约地址 |
|---|---|---|---|---|
| TRON | TRX | 6 | 逐单动态地址 | 原生币 |
| TRON | USDT | 6 | 固定地址 + 唯一金额 | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t |
| BSC | BNB | 18 | 逐单动态地址 | 原生币 |
| BSC | USDT | 18 | 固定地址 + 唯一金额 | 0x55d398326f99059fF775485246999027B3197955 |
| TON | GRAM | 9 | 逐单动态地址 | 原生币 |
| TON | USDT | 6 | 固定地址 + 唯一金额 | EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs |
API 接口
| 方法 | 路径 | 功能说明 | 权限范围 |
|---|---|---|---|
| GET | /healthz | 服务健康检查 | public |
| GET | /readyz | 依赖与就绪状态 | public |
| GET | /v1/networks | 支持的区块链网络与资产 | public |
| POST | /v1/invoices | 创建收款订单 | invoices:write |
| GET | /v1/invoices | 订单列表(分页) | invoices:read |
| GET | /v1/invoices/{invoice_id} | 获取订单详情 | invoices:read |
| POST | /v1/invoices/{invoice_id}/cancel | 取消订单 | invoices:write |
| GET | /v1/rates | 获取可锁定的汇率报价 | invoices:read |
| GET | /v1/balances | 按网络与资产查询钱包余额 | invoices:read |
| GET | /v1/deposits/unmatched | 列出未匹配的入账转账 | invoices:read |
| POST | /v1/deposits/{deposit_id}/attach | 手动将入账转账关联到订单 | invoices:write |
| POST | /v1/addresses | 登记固定收款钱包 | invoices:write |
| GET | /v1/addresses | 列出已登记的固定地址 | invoices:read |
| POST | /v1/sweep-addresses | 登记原生币归集钱包 | invoices:write |
| GET | /v1/credit | 当前服务余额 | invoices:read |
| GET | /v1/credit/entries | 余额明细与变动记录 | invoices:read |
| POST | /v1/credit/deposit-addresses | 获取服务余额充值地址 | invoices:write |
| PUT | /v1/credit/auto | 更新自动补足设置 | invoices:write |
| PUT | /v1/merchants/{merchant_id}/credit/fee | 更新商户专属费率 | admin |
| POST | /v1/webhooks | 登记回调接口 | webhooks:write |
| GET | /v1/webhooks/deliveries | 回调通知与投递记录 | webhooks:read |
| POST | /v1/webhooks/deliveries/{delivery_id}/replay | 重发失败的通知 | webhooks:write |