Merchant API Documentation

沃特嚴選|商戶 API 文件

本文件提供商戶系統串接收單、代付、商品查詢與異步通知規格。正式金流請使用 /api/v1/merchant/* 路由,金額目前以 TWD 為準;正式 Base URL 請使用 https://api-test.wattt.asia

文件版本 v2.5
2026-06-25 07:25
Public API Host
HTTPS Required JSON / x-www-form-urlencoded A-Z 排序 + MD5 大寫 正式 API 已包含付款連結 / 查詢 / 餘額 / 銀行 / 回調
正式 Base URL
https://api-test.wattt.asia
公開文件只顯示商戶 API 專用網域
商戶建單
收單 / 代付
/api/v1/merchant/*
驗證方式
UID + API Secret
Secret 僅能放在商戶後端
目前文件範圍
公開商戶 API
APP / 後台 / 內部 API 不公開

正式商戶 API

以下只列公開商戶可串接的正式 API;查詢、餘額、銀行列表、回調重送與相容功能都已納入正式 API 說明。

正式 Base URL:https://api-test.wattt.asia。此網域只開放公開文件與正式商戶 API,不開放後台、登入頁、APP API、Mock 或內部 Bridge。
功能Method路徑狀態說明
付款通道列表 POST /api/v1/merchant/payment-channels 已開放 商戶後端取得目前可用付款通道,例如天空交易所儲值。
商戶儲值金額設定 POST /api/v1/merchant/payment-amounts 已開放 取得後台設定的固定金額、自訂金額開關與上下限。
指定金額待付款短網址 POST /api/v1/merchant/payment-links/amount 已開放 商戶端先選金額後送出 amount,API 會驗證金額並直接建立待付款頁,回傳 /sky/purchase/wait/{token} 短網址。
取得付款跳轉連結 POST /api/v1/merchant/payment-links 已開放 購買點數前先取得天空交易所 redirect_url,再將會員導向該頁選擇金額。
建立收單 POST /api/v1/merchant/collections 已開放 正式商戶收單建立;支援 snake_case 與 v6.0 欄位相容、IP 白名單與簽名驗證。
收單查詢 POST /api/v1/merchant/collections/status 已開放 依 orderid、merchant_order_no、tradeNo 查詢收單狀態。
建立代付 POST /api/v1/merchant/payouts 已開放 正式商戶代付建立;支援 notify_url / reverse_url、snake_case 與 v6.0 欄位相容。
代付查詢 POST /api/v1/merchant/payouts/status 已開放 依 serial_no、merchant_order_no、tradeNo 查詢代付狀態。
商戶餘額 POST /api/v1/merchant/balance 已開放 回傳可用餘額、凍結金額、收單/代付統計與通道餘額。
銀行列表 GET /api/v1/merchant/banks 已開放 回傳台灣銀行代碼清單;也支援 q 參數搜尋。
回調重送 POST /api/v1/merchant/callbacks/retry 已開放 依訂單重新送出 notify_url / reverse_url,商戶端回傳純文字 success 視為成功。
商品列表 GET /api/v1/products 已開放 可用 merchant_uid 過濾商戶商品與平台通用商品。
IP 白名單限制 安全 MerchantApiIpWhitelist 已啟用 商戶設定 ip_whitelist 時會限制來源 IP;未設定時維持原串接行為。
v6.0 欄位相容 相容 merchantNo / orderNo / time / notifyUrl 已啟用 正式 API 會自動轉換參考 HTML 欄位至目前系統欄位。
v6.0 簽名相容 相容 Legacy sign compatible 已啟用 正式 API 保留目前簽名規則,也支援參考 HTML 舊簽名送法。
正式 API 已包含:付款通道列表、付款跳轉連結、收單查詢、代付查詢、商戶餘額、銀行列表、回調重送、IP 白名單限制、參考 HTML 欄位相容與 v6.0 簽名相容。公開文件不再另外拆出完成狀態區塊,也不顯示單數相容路由、Mock、APP、後台或內部 Bridge。

金鑰與簽名規則

商戶必要資訊
商戶需向平台取得 uidAPI Secret。正式請求必須帶 timestampsign
安全提醒
API Secret 不可放在前端網頁、APP、GitHub 或任何公開位置;簽名必須由商戶後端產生。

簽名步驟

  1. 取所有要送出的參數,排除 sign
  2. 排除 null 與空字串 ''
  3. 若參數是物件或陣列,例如 extra,簽名時轉成 JSON 字串。
  4. 參數名稱依 A-Z / ASCII 排序。
  5. 組成 key=value&key2=value2
  6. 最後接上 &key=API_SECRET
  7. 做 MD5,並轉成大寫 32 碼。
代付簽名提醒:notify_urlreverse_urlextra 若有送出,建議一併納入簽名。extra 為物件或陣列時,請使用實際送出的 JSON 結構計算簽名,避免前後端格式不同造成 簽名錯誤。平台後端也保留早期相容驗證,已串接商戶不受影響。
PHP 簽名範例
function makeSign(array $params, string $secret): string
{
    unset($params['sign']);

    $data = [];
    foreach ($params as $key => $value) {
        if ($value === null || $value === '') continue;
        $data[$key] = is_array($value)
            ? json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
            : $value;
    }

    ksort($data, SORT_STRING);

    $pairs = [];
    foreach ($data as $key => $value) {
        $pairs[] = $key . '=' . $value;
    }

    return strtoupper(md5(implode('&', $pairs) . '&key=' . $secret));
}
Node.js 簽名範例
const crypto = require('crypto');

function makeSign(params, secret) {
  const data = {};
  Object.keys(params).forEach((key) => {
    const value = params[key];
    if (key === 'sign') return;
    if (value === null || value === undefined || value === '') return;
    data[key] = typeof value === 'object' ? JSON.stringify(value) : String(value);
  });

  const base = Object.keys(data)
    .sort()
    .map((key) => `${key}=${data[key]}`)
    .join('&');

  return crypto.createHash('md5')
    .update(`${base}&key=${secret}`)
    .digest('hex')
    .toUpperCase();
}

購買點數跳轉流程

商戶會員購買點數時,建議不要直接在前端組天空交易所網址,而是由商戶後端先呼叫沃特 API 的 payment-links API 取得安全跳轉資訊,再將會員導向 redirect.url

安全串接方式:會員資料由商戶前端送回商戶後端;商戶後端加入 uidtimestamp 並使用 API Secret 產生 sign;商戶後端呼叫沃特 API;最後只把沃特 API 回傳的 data.redirect_url 或最外層 redirect_url 交給前端跳轉。API Secret 不可出現在瀏覽器。

流程

  1. 商戶系統取得會員編號、會員姓名、可選電話與付款銀行帳號。
  2. 商戶後端呼叫 POST /api/v1/merchant/payment-links
  3. 沃特 API 回傳可直接跳轉的 redirect_url / data.redirect_url、有效期限、第三方 session 與回調設定。
  4. 商戶前端直接導向 redirect_url,會員於天空交易所選擇儲值金額。
  5. 天空交易所將金額與會員資料送回沃特 API 建立收單,並進入 APP 代理匹配。
  6. APP 代理或後台完成後,沃特 API POST 回調到商戶 notify_url

取得付款通道列表

POSThttps://api-test.wattt.asia/api/v1/merchant/payment-channels
JSON Request 範例
{
    "uid": "ABCDE",
    "timestamp": 1782343543,
    "sign": "0BB022070F1578EC82C32D53F7EB7601"
}

取得商戶可選固定 / 自訂金額

POSThttps://api-test.wattt.asia/api/v1/merchant/payment-amounts

商戶前端顯示金額前,請由商戶後端呼叫此 API 取得後台設定的固定金額與自訂金額上下限。

JSON Request 範例
{
    "uid": "ABCDE",
    "timestamp": 1782343543,
    "sign": "0BB022070F1578EC82C32D53F7EB7601"
}
Response JSON 範例
{
    "ok": 1,
    "message": "success",
    "data": {
        "currency": "TWD",
        "fixed_amounts": [
            1000,
            2000,
            3000,
            5000,
            8000,
            10000
        ],
        "allow_custom": true,
        "custom_min": 1000,
        "custom_max": 30000,
        "payment_link_endpoint": "/api/v1/merchant/payment-links/amount"
    }
}

使用商戶端已選金額取得直接媒合 URL

POSThttps://api-test.wattt.asia/api/v1/merchant/payment-links/amount

會員在商戶端選好固定金額或自訂金額後,商戶後端帶 amount 呼叫此 API。系統會驗證金額是否符合後台設定,並回傳可直接跳轉且自動建立收單媒合的 redirect_url

注意:amount 必須等於 /payment-amounts 回傳的固定金額,或落在允許的自訂金額範圍內。成功後會直接回傳 /sky/purchase/wait/{token} 短網址,商戶不會收到會員與銀行資料 query string。
JSON Request 範例
{
    "uid": "ABCDE",
    "channel": "sky_coin",
    "merchant_order_no": "TPA202606250001",
    "amount": 5000,
    "member_no": "U1001",
    "member_account": "xinlun_user_1001",
    "member_name": "測試會員",
    "member_phone": "0912345678",
    "payer_bank_name": "華南銀行",
    "payer_bank_code": "008",
    "payer_account_no": "008123456789",
    "payer_account_last5": "56789",
    "notify_url": "https://merchant.example.com/notify/collection",
    "return_url": "https://merchant.example.com/return",
    "timestamp": 1782343543,
    "extra": {
        "source": "merchant-selected-amount"
    },
    "sign": "B50ADFC8326154B6D8C21E908982DB10"
}
Response JSON 範例:短網址
{
    "ok": 1,
    "message": "success",
    "url": "https://coin.mpglobal.asia/sky/purchase/wait/07lcAEjhukIcS8BnRem3e1m4LMpRJ562zBR2Mouv8nHa8x8T",
    "redirect_url": "https://coin.mpglobal.asia/sky/purchase/wait/07lcAEjhukIcS8BnRem3e1m4LMpRJ562zBR2Mouv8nHa8x8T",
    "payment_url": "https://coin.mpglobal.asia/sky/purchase/wait/07lcAEjhukIcS8BnRem3e1m4LMpRJ562zBR2Mouv8nHa8x8T",
    "wait_url": "https://coin.mpglobal.asia/sky/purchase/wait/07lcAEjhukIcS8BnRem3e1m4LMpRJ562zBR2Mouv8nHa8x8T",
    "method": "GET",
    "amount": 5000,
    "amount_mode": "fixed"
}
cURL 範例
curl -X POST "https://api-test.wattt.asia/api/v1/merchant/payment-links/amount" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"uid":"ABCDE","channel":"sky_coin","merchant_order_no":"TPA202606250001","amount":5000,"member_no":"U1001","member_account":"xinlun_user_1001","member_name":"測試會員","member_phone":"0912345678","payer_bank_name":"華南銀行","payer_bank_code":"008","payer_account_no":"008123456789","payer_account_last5":"56789","notify_url":"https://merchant.example.com/notify/collection","return_url":"https://merchant.example.com/return","timestamp":1782343543,"extra":{"source":"merchant-selected-amount"},"sign":"B50ADFC8326154B6D8C21E908982DB10"}'

取得天空交易所跳轉連結

POSThttps://api-test.wattt.asia/api/v1/merchant/payment-links
商戶端使用方式:本 API 已經回傳完整付款網址,請直接取 data.redirect_urlredirect_urlurl 跳轉,不需要自行組成 query_params
付款帳號必填建議:若要讓 APP 代理核對入款,請提供 payer_bank_namepayer_account_no,或至少提供 payer_account_last5 / payeeAccountNumber
參數必填說明
uid商戶 UID。
channel目前請填 sky_coin,未填預設 sky_coin。
merchant_order_no商戶購點訂單號,不建議重複。
member_no商戶會員編號。
member_name商戶會員姓名。
member_phone會員電話,會帶到天空交易所頁面。
member_account商戶會員帳號,會保留於付款流程與回調排查資料。
member_email商戶會員 Email,會保留於付款流程與回調排查資料。
payer_name建議付款人姓名;未填時可預設等於 member_name。
payer_bank_name建議付款會員銀行名稱,會帶到付款頁與 APP 代理核對資訊。
payer_bank_code付款會員銀行代碼。
payer_account_no建議付款會員完整銀行帳號;系統會轉成 customer_bank_account / member_bank_account。
payer_account_last5付款會員帳號末五碼;未填時系統可由 payer_account_no 推算。
payeeAccountNumber相容既有欄位;可放付款會員帳號末五碼。
member_bank_account舊相容欄位;建議新商戶改送 payer_account_no。
notify_url收單完成後沃特 API 回調商戶系統的網址。
return_url會員流程結束後可返回商戶頁面的網址。
timestampUNIX timestamp。
sign使用本文件簽名規則產生。
JSON Request 範例
{
    "uid": "ABCDE",
    "channel": "sky_coin",
    "merchant_order_no": "TP202606250001",
    "member_no": "U1001",
    "member_account": "xinlun_user_1001",
    "member_name": "測試會員",
    "member_phone": "0912345678",
    "member_email": "member1001@example.com",
    "payer_name": "測試會員",
    "payer_bank_name": "華南銀行",
    "payer_bank_code": "008",
    "payer_account_no": "008123456789",
    "payer_account_last5": "56789",
    "payerAccountNumber": "008123456789",
    "payeeAccountNumber": "56789",
    "notify_url": "https://merchant.example.com/notify/collection",
    "return_url": "https://merchant.example.com/return",
    "timestamp": 1782343543,
    "extra": {
        "source": "merchant-topup",
        "member_account": "xinlun_user_1001",
        "payer_account_no": "008123456789",
        "payer_account_last5": "56789"
    },
    "sign": "196129F91A0C73706C1E076E25EC35C8"
}
Response JSON 範例
{
    "ok": 1,
    "message": "success",
    "url": "https://coin.mpglobal.asia/sky/purchase/1?third_party_session=abc123def456ghi789jkl012&third_party_order_no=TP202606250001&user_no=U1001&user_name=%E6%B8%AC%E8%A9%A6%E6%9C%83%E5%93%A1",
    "redirect_url": "https://coin.mpglobal.asia/sky/purchase/1?third_party_session=abc123def456ghi789jkl012&third_party_order_no=TP202606250001&user_no=U1001&user_name=%E6%B8%AC%E8%A9%A6%E6%9C%83%E5%93%A1",
    "payment_url": "https://coin.mpglobal.asia/sky/purchase/1?third_party_session=abc123def456ghi789jkl012&third_party_order_no=TP202606250001&user_no=U1001&user_name=%E6%B8%AC%E8%A9%A6%E6%9C%83%E5%93%A1",
    "method": "GET",
    "data": {
        "url": "https://coin.mpglobal.asia/sky/purchase/1?third_party_session=abc123def456ghi789jkl012&third_party_order_no=TP202606250001&user_no=U1001&user_name=%E6%B8%AC%E8%A9%A6%E6%9C%83%E5%93%A1",
        "redirect_url": "https://coin.mpglobal.asia/sky/purchase/1?third_party_session=abc123def456ghi789jkl012&third_party_order_no=TP202606250001&user_no=U1001&user_name=%E6%B8%AC%E8%A9%A6%E6%9C%83%E5%93%A1",
        "payment_url": "https://coin.mpglobal.asia/sky/purchase/1?third_party_session=abc123def456ghi789jkl012&third_party_order_no=TP202606250001&user_no=U1001&user_name=%E6%B8%AC%E8%A9%A6%E6%9C%83%E5%93%A1",
        "method": "GET",
        "channel": {
            "code": "sky_coin",
            "name": "天空交易所儲值",
            "type": "redirect",
            "method": "GET"
        },
        "merchant_order_no": "TP202606250001",
        "third_party_session": "abc123def456ghi789jkl012",
        "expires_at": "2026-06-25 07:55:43",
        "redirect": {
            "method": "GET",
            "url": "https://coin.mpglobal.asia/sky/purchase/1?third_party_session=abc123def456ghi789jkl012&third_party_order_no=TP202606250001&user_no=U1001&user_name=%E6%B8%AC%E8%A9%A6%E6%9C%83%E5%93%A1",
            "query_params": {
                "third_party_order_no": "TP202606250001",
                "user_no": "U1001",
                "user_name": "測試會員",
                "user_account": "xinlun_user_1001",
                "customer_bank_name": "華南銀行",
                "customer_bank_account": "008123456789",
                "payer_account_last5": "56789",
                "payeeAccountNumber": "56789",
                "notify_url": "https://merchant.example.com/notify/collection",
                "link_sign": "由沃特 API 產生的 HMAC-SHA256"
            }
        },
        "callback": {
            "notify_url": "https://merchant.example.com/notify/collection",
            "return_success_body": "success",
            "events": [
                "collection.completed"
            ]
        }
    }
}
cURL 範例
curl -X POST "https://api-test.wattt.asia/api/v1/merchant/payment-links" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"uid":"ABCDE","channel":"sky_coin","merchant_order_no":"TP202606250001","member_no":"U1001","member_account":"xinlun_user_1001","member_name":"測試會員","member_phone":"0912345678","member_email":"member1001@example.com","payer_name":"測試會員","payer_bank_name":"華南銀行","payer_bank_code":"008","payer_account_no":"008123456789","payer_account_last5":"56789","payerAccountNumber":"008123456789","payeeAccountNumber":"56789","notify_url":"https://merchant.example.com/notify/collection","return_url":"https://merchant.example.com/return","timestamp":1782343543,"extra":{"source":"merchant-topup","member_account":"xinlun_user_1001","payer_account_no":"008123456789","payer_account_last5":"56789"},"sign":"196129F91A0C73706C1E076E25EC35C8"}'

Swagger / OpenAPI 測試

商戶技術人員可使用 OpenAPI JSON 匯入 Postman、Insomnia 或 Swagger Editor 測試。因本系統採用自訂 sign,Swagger 測試時仍需先用 API Secret 算出簽名後填入 request。

GEThttps://api-test.wattt.asia/api-docs/openapi.json

1. 建立收單

POSThttps://api-test.wattt.asia/api/v1/merchant/collections

用於商戶建立一筆代收 / 收單資料,資料會寫入收單列表,並可進入 APP 代理賣幣流程。

Request 欄位

參數必填格式說明
uidstring <= 20商戶 UID。
orderidstring <= 64平台收單唯一單號;同一商戶不可重複。
merchant_order_nostring <= 64商戶端訂單號;未填時預設等於 orderid。
gateway_codestring <= 30網關代碼;預設 gateway_c。
channelstring <= 30通道名稱 / 通道代碼。
currencystring <= 10幣別;目前建議固定 TWD。
amountnumeric >= 0.01收單金額,台幣。
paid_amountnumeric >= 0已付款金額;status=succeeded 且未填時預設等於 amount。
statuspending / succeeded / manualpending=未付,succeeded=已付,manual=已補。
collection_statuspending / matched / exception收單流程狀態;一般建單可送 pending。
collection_account_namestring <= 120平台收款戶名。
collection_account_nostring <= 80平台收款帳號。
collection_bank_namestring <= 120平台收款銀行。
counterparty_account建議string <= 120付款人銀行帳號;APP 代理確認末五碼會使用。
member_bank_namestring <= 120付款人銀行名稱。
user_idstring <= 64商戶會員 ID。
user_namestring <= 120商戶會員名稱。
notify_urlurl <= 255商戶異步通知網址。
return_urlurl <= 255付款完成返回網址。
paid_atdate/datetime已付時間;status=succeeded 時可帶。
timestampintegerUNIX timestamp。
extraobject/string自訂資料;JSON 物件或 v6.0 字串皆可。
signstring(32)簽名。

狀態值

  • pending:未付 / 待處理
  • succeeded:已付 / 成功
  • manual:後台補單 / 已補
  • collection_status=pending:待匹配
  • collection_status=matched:已匹配
  • collection_status=exception:異常
JSON Request 範例
{
    "uid": "ABCDE",
    "orderid": "COL202606250001",
    "merchant_order_no": "M-COL202606250001",
    "gateway_code": "gateway_c",
    "channel": "API",
    "currency": "TWD",
    "amount": 2500,
    "paid_amount": 0,
    "status": "pending",
    "collection_status": "pending",
    "collection_account_name": "測試收款戶",
    "collection_account_no": "80844397416179",
    "collection_bank_name": "中信銀行",
    "counterparty_account": "0040000256001018003",
    "member_bank_name": "台灣銀行",
    "user_id": "U1001",
    "user_name": "測試會員",
    "notify_url": "https://merchant.example.com/notify/collection",
    "return_url": "https://merchant.example.com/return",
    "timestamp": 1782343543,
    "sign": "B45FF87480B90C25DA7828FF820DF696"
}
cURL 範例
curl -X POST "https://api-test.wattt.asia/api/v1/merchant/collections" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"uid":"ABCDE","orderid":"COL202606250001","merchant_order_no":"M-COL202606250001","gateway_code":"gateway_c","channel":"API","currency":"TWD","amount":2500,"paid_amount":0,"status":"pending","collection_status":"pending","collection_account_name":"測試收款戶","collection_account_no":"80844397416179","collection_bank_name":"中信銀行","counterparty_account":"0040000256001018003","member_bank_name":"台灣銀行","user_id":"U1001","user_name":"測試會員","notify_url":"https://merchant.example.com/notify/collection","return_url":"https://merchant.example.com/return","timestamp":1782343543,"sign":"B45FF87480B90C25DA7828FF820DF696"}'

Response 成功範例

{
  "ok": 1,
  "message": "收單模擬資料已建立",
  "data": {
    "id": 123,
    "orderid": "COL202606250001",
    "merchant_order_no": "M-COL202606250001",
    "status": "pending",
    "amount": 2500,
    "paid_amount": 0,
    "payment_bank_account": "0040000256001018003",
    "counterparty_account": "0040000256001018003"
  }
}

2. 建立代付

POSThttps://api-test.wattt.asia/api/v1/merchant/payouts

用於商戶建立一筆代付資料,資料會寫入代付列表,並可進入 APP 代理買幣流程。

Request 欄位

參數必填格式說明
uidstring <= 20商戶 UID。
serial_nostring <= 40代付唯一流水號;同一流水號不可重複。
merchant_order_nostring <= 80商戶端訂單號;未填時預設等於 serial_no。
channelstring <= 30通道名稱;預設代付。
amountnumeric >= 0.01代付金額。
actual_amountnumeric >= 0實際代付金額;未填預設等於 amount。
statuspending / processed / cancelledpending=待處理,processed=已處理,cancelled=已撤銷。
payee_namestring <= 120收款人姓名。
payee_bankstring <= 120收款銀行。
payee_accountstring <= 80收款帳號。
payment_tagstring <= 60代付標籤 / 備註標籤。
beneficiary_namestring <= 120受款人名稱;未填預設等於 payee_name。
requested_atdate/datetime請求時間;未填預設 now()。
processed_atdate/datetime處理完成時間;status=processed 時可帶。
voucher_nostring <= 80憑證號。
notetext備註。
is_delayedboolean是否延遲處理。
notify_urlurl <= 255代付完成異步通知網址。
reverse_urlurl <= 255代付失敗 / 撤銷異步通知網址。
timestampintegerUNIX timestamp。
extraobject/string自訂資料;JSON 物件或 v6.0 字串皆可。
signstring(32)簽名。

狀態值

  • pending:待處理
  • processed:已處理 / 成功
  • cancelled:已撤銷 / 失敗 / 駁回
  • successsucceeded 會轉為 processed
  • failedrejected 會轉為 cancelled
JSON Request 範例
{
    "uid": "ABCDE",
    "serial_no": "PO202606250001",
    "merchant_order_no": "M-PO202606250001",
    "channel": "代付",
    "amount": 3000,
    "actual_amount": 3000,
    "status": "pending",
    "payee_name": "王小明",
    "payee_bank": "中國信託",
    "payee_account": "822123456789012",
    "payment_tag": "PAYOUT-TEST",
    "beneficiary_name": "王小明",
    "notify_url": "https://merchant.example.com/notify/payout",
    "reverse_url": "https://merchant.example.com/notify/payout-failed",
    "extra": {
        "member_no": "U1001",
        "member_name": "測試會員",
        "source": "merchant-api-test"
    },
    "timestamp": 1782343543,
    "sign": "78EA4FF0DF0FAB434CBD4DA51473598B"
}
cURL 範例
curl -X POST "https://api-test.wattt.asia/api/v1/merchant/payouts" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"uid":"ABCDE","serial_no":"PO202606250001","merchant_order_no":"M-PO202606250001","channel":"代付","amount":3000,"actual_amount":3000,"status":"pending","payee_name":"王小明","payee_bank":"中國信託","payee_account":"822123456789012","payment_tag":"PAYOUT-TEST","beneficiary_name":"王小明","notify_url":"https://merchant.example.com/notify/payout","reverse_url":"https://merchant.example.com/notify/payout-failed","extra":{"member_no":"U1001","member_name":"測試會員","source":"merchant-api-test"},"timestamp":1782343543,"sign":"78EA4FF0DF0FAB434CBD4DA51473598B"}'

Response 成功範例

{
  "ok": 1,
  "message": "代付模擬資料已建立",
  "data": {
    "id": 456,
    "serial_no": "PO202606250001",
    "merchant_order_no": "M-PO202606250001",
    "status": "pending",
    "amount": 3000
  }
}

3. 訂單查詢

收單與代付皆可用商戶單號或平台交易號查詢;回應同時提供目前系統欄位與 v6.0 常見欄位。

收單查詢

POSThttps://api-test.wattt.asia/api/v1/merchant/collections/status
{
    "uid": "ABCDE",
    "orderid": "COL202606250001",
    "timestamp": 1782343543,
    "sign": "090EA11DCC84AAE413F86C90FCD8276D"
}

代付查詢

POSThttps://api-test.wattt.asia/api/v1/merchant/payouts/status
{
    "uid": "ABCDE",
    "serial_no": "PO202606250001",
    "timestamp": 1782343543,
    "sign": "326801CC9834721E64EA9E158244E0B1"
}

Response 範例

{
  "ok": 1,
  "code": 0,
  "text": "success",
  "status": "PAID",
  "paid": 2500,
  "tradeNo": "123",
  "orderNo": "M-COL202606250001",
  "data": {
    "system_status": "succeeded",
    "amount": 2500,
    "paid_amount": 2500,
    "callback_status": "succeeded"
  }
}

4. 餘額查詢 / 銀行列表

商戶餘額查詢

POSThttps://api-test.wattt.asia/api/v1/merchant/balance
{
    "uid": "ABCDE",
    "timestamp": 1782343543,
    "sign": "0BB022070F1578EC82C32D53F7EB7601"
}

回傳欄位包含 balancebalance0balance1balance2,以及 data.summary 內的收單、代付、凍結與可用餘額明細。

銀行列表

GEThttps://api-test.wattt.asia/api/v1/merchant/banks
https://api-test.wattt.asia/api/v1/merchant/banks?q=中國信託

回調重送

POSThttps://api-test.wattt.asia/api/v1/merchant/callbacks/retry
{
    "uid": "ABCDE",
    "type": "collection",
    "orderid": "COL202606250001",
    "timestamp": 1782343543,
    "sign": "49D47BB110823333D39097E8178FC650"
}

5. 商品查詢

GEThttps://api-test.wattt.asia/api/v1/products

可帶 merchant_uid 過濾商戶商品與平台通用商品。

https://api-test.wattt.asia/api/v1/products?merchant_uid=ABCDE

Response 範例

{
  "ok": 1,
  "items": [
    {
      "id": "1",
      "uid": "PRODUCT_UID",
      "sku": "SKU001",
      "name": "商品名稱",
      "currency": "TWD",
      "price_hkd_cents": 100000
    }
  ]
}

6. 異步通知 / 回調

建單可帶 notify_url,代付也可帶 reverse_url。如需人工重送,可呼叫 POST /api/v1/merchant/callbacks/retry。商戶收到通知後請回應純文字 success。回調 status 僅會出現 successfailed

建議代收回調格式

{
  "type": "collection",
  "uid": "ABCDE",
  "orderid": "COL202606250001",
  "merchant_order_no": "M-COL202606250001",
  "trade_no": "123",
  "amount": 2500,
  "paid_amount": 2500,
  "status": "success",
  "paid_at": "2026-05-18 15:30:00",
  "timestamp": 1782343543,
  "sign": "MD5SIGN"
}

建議代付回調格式

{
  "type": "payout",
  "uid": "ABCDE",
  "serial_no": "PO202606250001",
  "merchant_order_no": "M-PO202606250001",
  "amount": 3000,
  "actual_amount": 3000,
  "status": "success",
  "processed_at": "2026-05-18 15:35:00",
  "timestamp": 1782343543,
  "sign": "MD5SIGN"
}
回調狀態只會送 success / failed;代付撤銷 / 駁回會優先通知 reverse_url。系統會依商戶回應是否為 success 更新重送結果。

7. 參考 HTML 欄位對照

你提供的參考 HTML 文件有部分欄位命名與目前系統不同。公開文件保留對照表,讓商戶知道目前正式 API 應送哪個欄位。

參考文件欄位目前系統欄位狀態說明
merchantNouid已相容目前請送 uid。
orderNo(收單)orderid已相容目前收單唯一單號使用 orderid。
orderNo(代付)serial_no已相容目前代付唯一流水號使用 serial_no。
timetimestamp已相容目前使用 UNIX timestamp。
notifyUrlnotify_url已相容目前使用 snake_case。
userNouser_id已相容付款會員 ID。
userNameuser_name已相容付款會員名稱。
name(代付)payee_name已相容收款人姓名。
bankNamepayee_bank / member_bank_name / payer_bank_name已相容依代付 / 收單 / 付款跳轉情境不同。
bankAccountpayee_account / counterparty_account / payer_account_no已相容依代付 / 收單 / 付款跳轉情境不同。
payerAccountNumberpayer_account_no已相容付款會員完整銀行帳號;payment-links 會轉給付款頁與 APP 代理核對。
payeeAccountNumberpayer_account_last5已相容付款會員帳號末五碼;相容既有核帳欄位。

8. 錯誤碼 / 回應格式

HTTP / ok訊息原因處理方式
422 / ok=0商戶不存在或未啟用uid 錯誤、商戶停用或未建立。確認商戶 UID 與後台商戶狀態。
422 / ok=0簽名錯誤sign 與平台計算結果不一致。檢查參數排序、空值處理、notify_url / reverse_url 是否納入、extra JSON 格式與商戶 API Secret。
422 / ok=0此商戶訂單號已存在收單 orderid 重複。每筆訂單使用唯一 orderid。
422 / ok=0代付流水號已存在代付 serial_no 重複。每筆代付使用唯一 serial_no。
422validation error缺少必填或格式錯誤。依照 Request 欄位表修正。