快速上手
NeoLinks 是企业级稳定币/法币支付基础设施平台,为 B2B 商户与第三方集成方提供统一的收单、收款、付款、兑换与虚拟账户能力。通过 Partner OpenAPI,您可以在数分钟内完成沙箱集成并开始测试真实支付流程。
Partner OpenAPI
HMAC 签名鉴权,RESTful JSON API,覆盖收单/收款/付款/兑换全链路。
虚拟账户 VA
美元代收、路由账号分配,法币入金自动匹配收单订单。
稳定币链上
Vault 合约收单、HD 子地址、Scanner 实时入账、KYT 合规筛查。
基础设施能力总览
Ledger.Post 唯一入口;Partner API 路径与 Schema 以 OpenAPI YAML 为唯一事实来源(SSOT)。
环境与 Base URL
NeoLinks 提供 Sandbox 与 Production 两套环境。Sandbox 使用 stub 法币通道与 Anvil 本地链,可完整跑通 E2E 流程。
| 环境 | Base URL | 说明 |
|---|---|---|
| Sandbox | https://api.sandbox.neolinks.io/v1 |
测试环境,法币 stub 模式,链 ID 31337 (Anvil) |
| Production | https://api.prod.neolinks.io/v1 |
生产环境,真实 VA/银行通道与主网/测试网链 |
认证与签名
Partner API 使用 API Key + HMAC-SHA256 签名双重鉴权。所有写操作须携带幂等键 Idempotency-Key。
请求头
| Header | 类型 | 说明 |
|---|---|---|
| X-Api-Key必填 | string | Partner API Key,由运营后台分配 |
| X-Signature必填 | string | HMAC-SHA256 签名,十六进制编码 |
| X-Timestamp必填 | string | ISO8601 UTC 时间戳,与服务端偏移 ≤ 300 秒 |
| Idempotency-Key写操作必填 | uuid | 幂等键,TTL 72 小时 |
签名算法
签名字符串格式:
{timestamp}\n{METHOD}\n{path}\n{sha256(body)}
curl -X POST "https://api.sandbox.neolinks.io/v1/acquiring/orders" \
-H "Content-Type: application/json" \
-H "X-Api-Key: pk_sandbox_xxx" \
-H "X-Timestamp: 2026-06-22T08:00:00Z" \
-H "X-Signature: a1b2c3..." \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-d '{"merchant_order_id":"ord_001","amount":"100.00","currency":"USDC","payment_method":"crypto","chain_id":31337,"notify_url":"https://example.com/webhook"}'
通用响应格式
所有 API 响应均为 JSON,包含统一信封字段。成功时 code = 0,错误时 code 为字符串错误码。
{
"code": 0,
"message": "ok",
"data": { /* 业务对象 */ },
"trace_id": "tr_abc123",
"request_id": "req_xyz789"
}
{
"code": "INVALID_REQUEST",
"message": "amount must be a positive decimal string",
"trace_id": "tr_abc123",
"request_id": "req_xyz789"
}
幂等与限流
幂等规则
| 字段 | 唯一范围 | TTL |
|---|---|---|
| Idempotency-Key | per merchant | 72 小时 |
| merchant_order_id | per merchant | 永久 |
| third_party_order_id | per merchant(可选) | 永久 |
默认限流
| 维度 | 限制 |
|---|---|
| 建单(POST) | 100 req/min/merchant |
| 查询(GET) | 300 req/min/merchant |
收单 Acquiring
收单模块支持平台内 Invoices/Transactions 与 Partner OpenAPI 双订单源。创建订单后系统自动分配稳定币 Vault 地址或法币虚拟账户,并通过 Webhook 推送状态变更。
订单状态机
| 状态 | 说明 |
|---|---|
| AWAITING_PAYMENT | 已分配地址/VA,等待付款 |
| PAYMENT_DETECTED | 法币部分到账或累计不足额 |
| KYT_PENDING | 链上到账,KYT 筛查中 |
| COMPLETED | 足额到账且合规通过,订单完成 |
| KYT_FAILED | KYT 拒绝 |
| CLOSED | 商户或系统关单 |
创建收单订单。根据 payment_method 自动分配稳定币 Vault 地址或法币 VA 付款指引。
Request Body
| 参数 | 类型 | 说明 |
|---|---|---|
| merchant_order_id必填 | string | 商户侧唯一订单号 |
| amount必填 | string | 应付金额,十进制字符串,如 "100.00" |
| currency必填 | string | 币种,如 USDC、USD |
| payment_method必填 | enum | crypto 或 fiat |
| chain_idcrypto 必填 | integer | 链 ID,Sandbox 使用 31337 (Anvil) |
| notify_url可选 | uri | Webhook 回调地址 |
| third_party_order_id可选 | string | 第三方平台订单号 |
| metadata可选 | object | 自定义键值对,原样回传 |
{
"merchant_order_id": "mch_ord_001",
"amount": "100.00",
"currency": "USDC",
"payment_method": "crypto",
"chain_id": 31337,
"notify_url": "https://merchant.example.com/webhook"
}
{
"code": 0,
"message": "ok",
"data": {
"id": "acq_ord_abc123",
"merchant_order_id": "mch_ord_001",
"status": "AWAITING_PAYMENT",
"amount": "100.00",
"currency": "USDC",
"payment_rail": "contract",
"pay_contract": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"order_ref": "0x1a2b3c...",
"chain_id": 31337,
"network": "anvil",
"expires_at": "2026-06-23T08:00:00Z"
},
"trace_id": "tr_xxx",
"request_id": "req_xxx"
}
查询单笔收单订单详情,含当前状态、已检测金额与 VA 付款指引。
Path Parameters
| 参数 | 类型 | 说明 |
|---|---|---|
| id必填 | string | 收单订单 ID |
关闭未完成的收单订单。已完成的订单不可关单。
虚拟账户 Virtual Account
法币收单通过虚拟账户(VA)实现美元代收。创建 payment_method: "fiat" 的收单订单后,系统自动分配路由银行账号,付款方通过银行转账完成支付,附言(payment_reference)用于自动匹配。
VA 付款指引字段
法币收单响应中的 va / fiat_payment 对象包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| bank_name | string | 收款银行名称 |
| account_name | string | 账户户名 |
| account_number | string | 银行账号 / IBAN |
| swift | string | SWIFT/BIC 代码(跨境) |
| payment_reference | string | 付款附言,须原样填入银行转账备注 |
| global_account_id | string | 全局 VA 账户 ID |
{
"merchant_order_id": "mch_fiat_001",
"amount": "5000.00",
"currency": "USD",
"payment_method": "fiat",
"notify_url": "https://merchant.example.com/webhook"
}
{
"code": 0,
"data": {
"id": "acq_ord_fiat001",
"status": "AWAITING_PAYMENT",
"payment_rail": "fiat",
"va": {
"bank_name": "Community Federal Savings Bank",
"account_name": "NeoLinks Payments LLC",
"account_number": "****7890",
"swift": "CMFGUS33",
"payment_reference": "QX-ACQ-abc123",
"global_account_id": "ga_usd_001"
}
}
}
PAYMENT_DETECTED)与超额到账(settlement_status=OVERPAID)。Webhook 将分别推送 acquiring.order.payment_detected 与 acquiring.order.fiat_overpaid 事件。
收款 Collection
独立收款账户模块,适用于非收单场景的稳定币入账。创建收款单后分配 HD 子地址,链上确认 + KYT 通过后入账至收款账户(RECEIVE)。
创建收款单,分配链上收款地址。
Request Body
| 参数 | 类型 | 说明 |
|---|---|---|
| amount必填 | string | 期望收款金额 |
| currency必填 | string | 币种 |
| reference_no可选 | string | 商户参考号 |
| order_type可选 | string | 收款类型 |
查询收款单详情,含 pay_address、detected_amount 与当前状态。
付款 Payout
向受益人发起银行出款或链上 payout。扣款源可选收单清算户(ACQUIRING)、收款户(RECEIVE)或兑换交割户(EXCHANGE)。材料审核通过后由商户门户或 Partner API 执行。
Request Body
| 参数 | 类型 | 说明 |
|---|---|---|
| debit_business_account必填 | enum | ACQUIRING | RECEIVE | EXCHANGE |
| amount必填 | string | 付款金额 |
| currency必填 | string | 币种 |
| beneficiary_name必填 | string | 受益人名称 |
| beneficiary_account必填 | string | 受益人账号/地址 |
{
"debit_business_account": "ACQUIRING",
"amount": "1000.00",
"currency": "USDC",
"beneficiary_name": "Acme Corp",
"beneficiary_account": "0xRecipient..."
}
兑换 Exchange
实时锁价兑换,支持法币与稳定币互换。创建兑换单锁定汇率,确认后执行;失败自动回滚账务分录。
创建兑换单并锁定汇率。
Request Body
| 参数 | 类型 | 说明 |
|---|---|---|
| source_business_account必填 | string | 卖出方业务账户 |
| source_currency必填 | string | 卖出币种 |
| target_currency必填 | string | 买入币种 |
| amount必填 | string | 卖出金额 |
执行已锁价的兑换单。须在锁价有效期内调用。
入金 Deposits
入金记录查询接口,用于 T+1 对账。包含链上入账与 VA 法币入账的统一视图。
分页查询入金列表。支持 page、page_size 参数。
查询单笔入金详情。
余额 Balances
按币种与业务账户汇总可用余额,只读接口。付款前建议调用以确保余额充足。
{
"code": 0,
"data": [
{
"currency": "USDC",
"business_account": "ACQUIRING",
"available": "12500.00"
},
{
"currency": "USD",
"business_account": "ACQUIRING",
"available": "50000.00"
}
]
}
稳定币收单
稳定币收单通过 Vault 智能合约接收链上 USDC/USDT 等代币。创建订单后返回 pay_contract(Vault 地址)与 order_ref(bytes32 订单引用),付款方调用 Vault.pay(orderRef, amount) 完成支付。
- Scanner 实时监听链上
PaymentReceived事件 - 入账后触发 KYT 筛查,通过后状态流转至 COMPLETED
- 资金归集至商户收单清算账户(ACQUIRING)
- 本地开发使用 Anvil(chain_id=31337),生产环境按
configs/chains.yaml配置
法币收单
法币收单通过虚拟账户(VA)路由实现。开发阶段使用 stub 模式模拟银行入账回调,生产环境对接真实 VA/银行通道 adapter。
- 创建订单时
payment_method: "fiat",无需chain_id - 响应包含完整 VA 付款指引(银行名、账号、附言)
- VA Webhook 入账后自动匹配订单,支持部分/超额到账
- 通道模式由环境变量
VA_WEBHOOK_*/BANK_PAYOUT_MODE控制
保证金
收单业务可配置保证金要求。保证金不足时 API 返回 MARGIN_INSUFFICIENT(HTTP 403)。商户可通过商户门户或 Partner API 进行保证金充值(margin top-up)。
margin_topup 执行,资金从外部转入商户保证金子账户。详见商户门户「收单 → 保证金充值」页面。
KYT 合规
所有链上入账均触发 KYT(Know Your Transaction)筛查。KYT 为异步流程,订单状态先进入 KYT_PENDING,筛查完成后流转至 COMPLETED 或 KYT_FAILED。
- KYT 供应商通过 adapter 端口接入,开发阶段使用 stub 模式
- 拒绝时推送
acquiring.order.kyt_failedWebhook - AML 冻结由运营后台人工触发,优先级高于 Payment 操作
Webhook 事件
订单状态变更时,NeoLinks 向创建订单时指定的 notify_url 投递 JSON 事件。所有 Webhook 均经 Outbox 异步投递,支持指数退避重试。
事件列表
| 事件 | 触发时机 |
|---|---|
| acquiring.order.awaiting_payment | 已分配地址/VA |
| acquiring.order.payment_detected | 法币部分到账或累计不足额 |
| acquiring.order.completed | 足额到账且合规通过 |
| acquiring.order.fiat_overpaid | 法币超额到账 |
| acquiring.order.crypto_overpaid | 稳定币超额到账 |
| acquiring.order.kyt_failed | KYT 拒绝 |
| acquiring.order.closed | 关单 |
| acquiring.account.deposit_credited | 收单清算户 VA 入账 |
| collection.order.credited | 收款单入账完成 |
| collection.order.kyt_failed | 收款单 KYT 拒绝 |
| payout.order.completed | 付款成功 |
| payout.order.failed | 付款失败 |
| exchange.order.completed | 兑换完成 |
| exchange.account.deposit_credited | 兑换户入金匹配入账 |
{
"event": "acquiring.order.completed",
"created_at": "2026-06-22T08:00:00Z",
"data": {
"id": "acq_ord_abc123",
"merchant_order_id": "mch_ord_001",
"status": "COMPLETED",
"amount": "100.00",
"currency": "USDC"
}
}
签名验证
Webhook 请求携带以下 Header,接收方须验证签名以确保来源可信:
| Header | 说明 |
|---|---|
| X-Webhook-Signature | sha256=... HMAC 签名 |
| X-Webhook-Timestamp | ISO8601 UTC 时间戳 |
重试策略:1m → 5m → 30m → 2h → 8h。商户返回 HTTP 2xx 视为投递成功。
错误码
| code | HTTP | 说明 |
|---|---|---|
| 0 | 200 | 成功 |
| INVALID_REQUEST | 400 | 参数错误 |
| UNAUTHORIZED | 401 | 签名/密钥错误 |
| FORBIDDEN | 403 | 无权限 |
| MARGIN_INSUFFICIENT | 403 | 保证金不足 |
| NOT_FOUND | 404 | 资源不存在 |
| IDEMPOTENCY_CONFLICT | 409 | 幂等键冲突且 body 不一致 |
| ORDER_NOT_PAYABLE | 422 | 订单状态不允许 |
| KYT_REJECTED | 422 | KYT 拒绝 |
| RATE_LIMITED | 429 | 限流 |
| INTERNAL_ERROR | 500 | 内部错误 |
Sandbox 测试
Sandbox 环境提供完整的 stub 法币通道与 Anvil 本地链,可跑通收单/收款/付款/兑换全链路 E2E。
快速开始
- 联系销售获取 Sandbox API Key 与 Secret
- 阅读「认证与签名」章节,按 HMAC 规范构造请求头
- 创建 crypto 收单订单,使用 Anvil 测试账户向 Vault 地址转账
- 创建 fiat 收单订单,使用 stub VA 模拟入账回调
- 配置 Webhook 接收端点,验证签名与事件流转
# quantiex-platform 仓库
make up # Postgres + Redis
make up-anvil # 本地链 RPC :8545
make migrate # 数据库迁移
make deploy-anvil # 部署 Vault 合约
make smoke-anvil-chain # 链上 E2E 冒烟
更新日志
| 版本 | 日期 | 变更 |
|---|---|---|
| v1.1.0 | 2026-06 | 新增 Collection / Payout / Exchange Partner API;法币超额 Webhook |
| v1.0.0 | 2026-05 | MVP-1 发布:Acquiring + Deposits + Balances + Webhook |
