Skip to content

Postman — API Checkout

請替換示例憑證

在預請求腳本中替換所有佔位符:

  • 'your-api-secret' → 商戶後台的實際 API Secret
  • URL 中的 MCH_20240101_ABC123 → 您的實際商戶號

API Checkout 不使用 X-Api-Key,只設置 X-TimestampX-Signature

需要開通權限

API Checkout 為獨立產品,需單獨申請開通。請聯繫技術支持啟用。

簽名說明

API Checkout 使用與託管支付相同的簽名算法,但不包含 X-Api-Key

POST 簽名: Base64(HMAC-SHA256(timestamp\nPOST\npath\nBase64(SHA256(body)), apiSecret))

GET 簽名: Base64(HMAC-SHA256(timestamp\nGET\npath, apiSecret))


獲取支付方式

渲染支付界面前,必須在運行時調用此接口,禁止硬編碼幣種/網絡組合。

1. 配置請求

方法: GETURL: https://api.paystablecoin.global/api/v1/merchants/MCH_20240101_ABC123/checkout/payment-methods

MCH_20240101_ABC123 替換為您的商戶號。

2. 添加預請求腳本

javascript
// ── 配置 ────────────────────────────────────────────────────────────
const secretKey = 'your-api-secret';

// ── 時間戳 ──────────────────────────────────────────────────────────
const timestamp = Date.now().toString();

// ── 請求詳情 ────────────────────────────────────────────────────────
const method = pm.request.method;                 // "GET"
const urlObj = new URL(pm.request.url.toString());
const path   = urlObj.pathname;

// ── 構建簽名字符串(無請求體,無查詢字符串)────────────────────────
const stringToSign = [timestamp, method, path].join('\n');

console.log('=== API Checkout — 獲取支付方式 ===');
console.log('String to Sign:', stringToSign.replace(/\n/g, ' | '));

// ── HMAC-SHA256 → Base64 ────────────────────────────────────────────
const signature = CryptoJS.enc.Base64.stringify(
    CryptoJS.HmacSHA256(stringToSign, secretKey)
);

// ── 設置請求頭(API Checkout 不使用 X-Api-Key)──────────────────────
pm.request.headers.upsert({ key: 'X-Timestamp', value: timestamp });
pm.request.headers.upsert({ key: 'X-Signature', value: signature });

響應包含可用的支付方式列表。按 displayOrder 升序排列後展示給用戶。


創建 Checkout 訂單

客戶選擇幣種和網絡後,立即創建訂單。

1. 配置請求

方法: POSTURL: https://api.paystablecoin.global/api/v1/merchants/MCH_20240101_ABC123/checkout/orders

2. 設置請求體

進入 BodyrawJSON

json
{
  "merchantOrderId": "ORDER_{{$timestamp}}",
  "orderAmount": {
    "value": "100.50",
    "currency": "USDC"
  },
  "paymentMethodType": "ON_CHAIN_TRANSFER",
  "network": "tron",
  "expiresAt": "2026-12-31T23:59:59Z",
  "callbackUrl": "https://yoursite.com/webhook/checkout"
}

WARNING

orderAmount.currency 必須為穩定幣:USDCUSDTUSD1。API Checkout 不支持法幣計價。

3. 添加預請求腳本

javascript
// ── 配置 ────────────────────────────────────────────────────────────
const secretKey = 'your-api-secret';

// ── 時間戳 ──────────────────────────────────────────────────────────
const timestamp = Date.now().toString();

// ── 請求詳情 ────────────────────────────────────────────────────────
const method = pm.request.method;                 // "POST"
const urlObj = new URL(pm.request.url.toString());
const path   = urlObj.pathname;

// ── 請求體:替換 Postman 變量並壓縮 ────────────────────────────────
let body = pm.request.body.raw;
body = body.replace(/\{\{\$timestamp\}\}/g, timestamp);
body = JSON.stringify(JSON.parse(body));          // 壓縮
pm.request.body.raw = body;

// ── 請求體哈希:SHA256 → Base64 ─────────────────────────────────────
const bodyHash = CryptoJS.SHA256(body).toString(CryptoJS.enc.Base64);

// ── 構建簽名字符串 ──────────────────────────────────────────────────
const stringToSign = [timestamp, method, path, bodyHash].join('\n');

console.log('=== API Checkout — 創建訂單 ===');
console.log('Timestamp:', timestamp);
console.log('Method:', method);
console.log('Path:', path);
console.log('Body Hash (Base64):', bodyHash);
console.log('String to Sign:', stringToSign.replace(/\n/g, ' | '));

// ── HMAC-SHA256 → Base64 ────────────────────────────────────────────
const signature = CryptoJS.enc.Base64.stringify(
    CryptoJS.HmacSHA256(stringToSign, secretKey)
);
console.log('Signature:', signature);

// ── 設置請求頭(API Checkout 不使用 X-Api-Key)──────────────────────
pm.request.headers.upsert({ key: 'Content-Type', value: 'application/json' });
pm.request.headers.upsert({ key: 'X-Timestamp',  value: timestamp });
pm.request.headers.upsert({ key: 'X-Signature',  value: signature });

4. 發送並驗證

成功響應包含展示給客戶的收款信息:

json
{
  "code": "00000",
  "data": {
    "depositAddress": "TXyz...1234",
    "cryptoPaymentAmount": { "value": "100.50", "currency": "USDC" },
    "networkDisplayName": "TRON Network",
    "expiresAt": "2026-12-31T23:59:59Z"
  }
}

WARNING

向客戶展示 cryptoPaymentAmount而非 orderAmount。兩者可能因手續費存在差異。


查詢 Checkout 訂單

當 Webhook 未收到時作為備選方案。

1. 配置請求

方法: GETURL: https://api.paystablecoin.global/api/v1/merchants/MCH_20240101_ABC123/checkout/orders/ORDER_1738112345000

將末尾的訂單號替換為實際的 merchantOrderId

2. 添加預請求腳本

javascript
// ── 配置 ────────────────────────────────────────────────────────────
const secretKey = 'your-api-secret';

// ── 時間戳 ──────────────────────────────────────────────────────────
const timestamp = Date.now().toString();

// ── 請求詳情 ────────────────────────────────────────────────────────
const method = pm.request.method;                 // "GET"
const urlObj = new URL(pm.request.url.toString());
const path   = urlObj.pathname;

// ── 構建簽名字符串 ──────────────────────────────────────────────────
const stringToSign = [timestamp, method, path].join('\n');

// ── HMAC-SHA256 → Base64 ────────────────────────────────────────────
const signature = CryptoJS.enc.Base64.stringify(
    CryptoJS.HmacSHA256(stringToSign, secretKey)
);

// ── 設置請求頭 ──────────────────────────────────────────────────────
pm.request.headers.upsert({ key: 'X-Timestamp', value: timestamp });
pm.request.headers.upsert({ key: 'X-Signature', value: signature });

每 5-10 秒輪詢一次,直到 status 達到終態:SUCCEEDEDFAILEDCLOSED


常見問題排查

錯誤可能原因解決方法
Invalid signature密鑰錯誤或請求體不匹配在 Console 查看請求體哈希;驗證 secretKey
API_PERMISSION_DISABLED (50010)Checkout 未開通聯繫技術支持啟用 API Checkout
Invalid or expired timestamp系統時間不同步同步系統時間;時間戳必須在 ±5 分鐘以內
穩定幣幣種錯誤使用了法幣orderAmount.currency 請使用 USDCUSDTUSD1

相關文檔

Released under the MIT License.