Skip to content

法币充值 (入金 / Pay-in) ​

法币充值服务允许商户为终端买家提供法币购买数字资产(如 USDT)并完成充值入账的能力。网关负责聚合承兑商报价、锁定汇率并生成统一的收银台网页地址(payUrl),用户在收银台向撮合的承兑商完成法币转账后,承兑商确认放行,网关自动将数字资产记入商户账户并通过 Webhook 回调商户系统。


1. 业务交互时序 ​

mermaid
sequenceDiagram
    autonumber
    actor User as 终端买家
    participant Merchant as 商户系统
    participant Gateway as SureLink 网关
    actor Trader as 场外承兑商

    User->>Merchant: 1. 发起充值请求 (购买 100 USDT)
    Merchant->>Gateway: 2. POST /api/v1/orders (创建充值订单)
    Gateway-->>Merchant: 3. 返回 orderNo 与收银台 payUrl
    Merchant-->>User: 4. 引导用户跳转或在 WebView 中打开 payUrl
    User->>Gateway: 5. 访问收银台,查看承兑商收款银行卡信息
    User->>Trader: 6. 用户通过手机银行向承兑商法币打款
    User->>Gateway: 7. 在收银台点击「我已完成付款」
    Trader->>Gateway: 8. 承兑商查账确认收到法币并点击放行
    Gateway->>Gateway: 9. 结算入账至商户代币账户
    Gateway->>Merchant: 10. Webhook 异步推送 order.completed
    Merchant-->>User: 11. 商户业务系统为用户发放相应权益/额度

2. 创建充值订单 ​

POST /api/v1/orders

请求头 (Headers) ​

请求头类型是否必填说明
Content-Typestring必填固定 application/json
X-Api-Keystring必填商户 API Key
X-Timestampstring必填毫秒级时间戳
X-Noncestring必填16-64 位随机串
X-Signaturestring必填HMAC-SHA256 签名 hex
Idempotency-Keystring推荐唯一幂等键,缺省时自动取 merchantOrderNo

请求体 (Body) ​

字段类型是否必填约束说明
merchantOrderNostring必填商户系统唯一订单号,长度 1 ~ 64 位字符。
directionstring否固定 'DEPOSIT'(入金/充值),默认 'DEPOSIT'。
pairstring否交易对,目前固定为 'USDT/CNY'。
assetSymbolstring否资产代币符号,目前固定为 'USDT'。
assetAmountstring选填*欲购买的数字资产数量(正数,最多 6 位小数,如 "100.000000")。
fiatCurrencystring否法币币种,目前固定为 'CNY'。
fiatAmountstring选填*欲支付的法币金额(正数,必须严格 2 位小数,如 "725.50")。
metadataobject否商户自定义透传键值对对象(Record<string, string>)。

金额参数说明

assetAmount 与 fiatAmount 二者必填其一:

  • 若传入 assetAmount,网关将根据当前锁定汇率实时换算用户需支付的 fiatAmount。
  • 若传入 fiatAmount,网关将根据汇率自动计算最终到账的 assetAmount。

请求示例 ​

bash
curl -X POST "https://api-sandbox.surelink.io/api/v1/orders" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: mch_key_your_api_key" \
  -H "X-Timestamp: 1715000000000" \
  -H "X-Nonce: 9f8e7d6c5b4a392817263544a1b2c3d4" \
  -H "X-Signature: c8b9...f01" \
  -H "Idempotency-Key: MCH_PAYIN_20261011_001" \
  -d '{
    "merchantOrderNo": "MCH_PAYIN_20261011_001",
    "assetAmount": "100.000000",
    "pair": "USDT/CNY",
    "metadata": {
      "userId": "user_8848"
    }
  }'
typescript
import { sendSignedRequest } from './signer';

const response = await sendSignedRequest({
  apiKey: 'mch_key_...',
  apiSecret: 'sec_...',
  method: 'POST',
  url: 'https://api-sandbox.surelink.io/api/v1/orders',
  body: {
    merchantOrderNo: 'MCH_PAYIN_20261011_001',
    assetAmount: '100.000000',
    pair: 'USDT/CNY'
  }
});

响应说明 (Response) ​

  • HTTP 状态码:201 Created
json
{
  "orderId": "698c56fa-b0f1-460d-8302-39c09c916781",
  "orderNo": "ORD20261011000001",
  "status": "PENDING_PAYMENT",
  "assetAmount": "100.000000",
  "fiatAmount": "725.50",
  "fiatCurrency": "CNY",
  "usdAmount": "100.00",
  "usdFeeAmount": "0.50",
  "feeBps": 50,
  "expiresAt": "2026-10-11T08:50:00.000Z",
  "payUrl": "https://pay.surelink.io/orders/ORD20261011000001",
  "pricingSnapshot": {
    "fxRate": "7.2550",
    "fiatCurrency": "CNY",
    "fiatAmount": "725.50",
    "feeAmount": "0.50",
    "quotedAt": "2026-10-11T08:35:00.000Z"
  }
}

响应核心字段 ​

字段类型说明
orderIdstring网关系统内部唯一 UUID
orderNostring网关业务订单号(以 ORD 开头,全局唯一)
statusstring初始状态(通常为 PENDING_PAYMENT 或 PENDING_MATCH)
assetAmountstring最终入账代币数量
fiatAmountstring终端用户需支付的法币金额 (CNY)
expiresAtstring订单支付有效截止时间 (ISO 8601),超时未打款自动取消
payUrlstring收银台链接。商户应将买家重定向至此链接或在客户端内嵌 WebView 展示
pricingSnapshotobject锁定价格与汇率快照详情

3. 分页查询充值订单列表 ​

GET /api/v1/orders

商户可通过本接口批量分页拉取自身创建的充值订单记录,支持按平台单号、商户单号、订单状态以及时间范围多维度组合检索。

请求头 (Headers) ​

携带标准 HMAC 鉴权请求头(X-Api-Key、X-Timestamp、X-Nonce、X-Signature)。

Query 参数 ​

参数名类型是否必填默认值描述
pagenumber否1当前页码,从 1 开始
pageSizenumber否20每页数量,最大 100
orderNostring否-按平台业务订单号精准筛选(如 ORD20261011000001)
merchantOrderNostring否-按商户外部订单号精准筛选(如 MCH_PAYIN_20261011_001)
statusstring否-订单状态筛选,多个状态可用逗号分隔(如 COMPLETED 或 PENDING_PAYMENT,PAYMENT_SUBMITTED)
directionstring否DEPOSIT订单方向,查询入金充值固定或缺省为 DEPOSIT
fromstring否-创建时间起始范围 (ISO 8601,如 2026-10-01T00:00:00.000Z)
tostring否-创建时间截止范围 (ISO 8601,如 2026-10-11T23:59:59.000Z)

请求示例 ​

bash
curl -X GET "https://api-sandbox.surelink.io/api/v1/orders?page=1&pageSize=20&status=COMPLETED" \
  -H "X-Api-Key: mch_key_your_api_key" \
  -H "X-Timestamp: 1715000000000" \
  -H "X-Nonce: 9f8e7d6c5b4a392817263544a1b2c3d4" \
  -H "X-Signature: c8b9...f01"
typescript
import { sendSignedRequest } from './signer';

const result = await sendSignedRequest({
  apiKey: 'mch_key_...',
  apiSecret: 'sec_...',
  method: 'GET',
  url: 'https://api-sandbox.surelink.io/api/v1/orders?page=1&pageSize=20&status=COMPLETED'
});
console.log('总订单数:', result.total);
console.log('订单列表:', result.items);

响应说明 (Response) ​

  • HTTP 状态码:200 OK
json
{
  "items": [
    {
      "id": "698c56fa-b0f1-460d-8302-39c09c916781",
      "orderNo": "ORD20261011000001",
      "merchantOrderNo": "MCH_PAYIN_20261011_001",
      "merchantId": "mch_12345",
      "traderId": "tra_67890",
      "direction": "DEPOSIT",
      "status": "COMPLETED",
      "pair": "USDT/CNY",
      "assetSymbol": "USDT",
      "assetAmount": "100.000000",
      "fiatCurrency": "CNY",
      "fiatAmount": "725.50",
      "fxRate": "7.2550",
      "usdAmount": "100.00",
      "usdFeeAmount": "0.50",
      "paymentSubmittedAt": "2026-10-11T08:38:12.000Z",
      "completedAt": "2026-10-11T08:40:05.000Z",
      "createdAt": "2026-10-11T08:35:00.000Z",
      "updatedAt": "2026-10-11T08:40:05.000Z"
    }
  ],
  "page": 1,
  "pageSize": 20,
  "total": 1
}

4. 查询单笔充值订单详情 ​

GET /api/v1/orders/:orderNo

支持按 平台业务订单号(orderNo) 或 商户外部订单号(merchantOrderNo) 查询单笔充值订单的状态与详情。

路由参数 ​

  • orderNo (string): 平台的订单号(如 ORD20261011000001)或商户自定义单号(如 MCH_PAYIN_20261011_001)。

响应说明 (Response) ​

  • HTTP 状态码:200 OK
json
{
  "id": "698c56fa-b0f1-460d-8302-39c09c916781",
  "orderNo": "ORD20261011000001",
  "merchantOrderNo": "MCH_PAYIN_20261011_001",
  "merchantId": "mch_12345",
  "traderId": "tra_67890",
  "direction": "DEPOSIT",
  "status": "COMPLETED",
  "pair": "USDT/CNY",
  "assetSymbol": "USDT",
  "assetAmount": "100.000000",
  "fiatCurrency": "CNY",
  "fiatAmount": "725.50",
  "fxRate": "7.2550",
  "usdAmount": "100.00",
  "usdFeeAmount": "0.50",
  "paymentSubmittedAt": "2026-10-11T08:38:12.000Z",
  "completedAt": "2026-10-11T08:40:05.000Z",
  "disputeReason": null,
  "chainTxKey": null,
  "source": "API",
  "createdAt": "2026-10-11T08:35:00.000Z",
  "updatedAt": "2026-10-11T08:40:05.000Z"
}

租户安全隔离

若尝试查询属于其他商户的订单,系统统一返回 404 Not Found (ORDER_NOT_FOUND),杜绝订单号撞单枚举探测。


5. 充值订单状态机全生命周期 ​

状态代码状态名称说明是否终态
PENDING_MATCH待匹配承兑商订单已创建,网关正在撮合最优承兑商分配收款卡否
PENDING_PAYMENT待买家支付承兑商已锁定,买家可在收银台查看收款卡并转账否
PAYMENT_SUBMITTED买家已付款买家在收银台点击「我已付款」,等待承兑商查账核验否
PENDING_RELEASE待放行承兑商确认收到法币,进入代币解冻与划转阶段否
SETTLING结算中系统正在执行账本变更与出入金分账否
COMPLETED交易成功代币已划转至商户账户,终态,触发 Webhook是
CANCELLED订单取消超过支付时限未打款或用户自主取消,终态是
DISPUTED争议中承兑商未收到款或金额不符发起申诉,人工客服介入处理否
FAILED交易失败结算失败或仲裁撤销,终态是