正式商戶 API
以下只列公開商戶可串接的正式 API;查詢、餘額、銀行列表、回調重送與相容功能都已納入正式 API 說明。
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 舊簽名送法。 |
金鑰與簽名規則
商戶需向平台取得
uid 與 API Secret。正式請求必須帶 timestamp 與 sign。API Secret 不可放在前端網頁、APP、GitHub 或任何公開位置;簽名必須由商戶後端產生。簽名步驟
- 取所有要送出的參數,排除
sign。 - 排除
null與空字串''。 - 若參數是物件或陣列,例如
extra,簽名時轉成 JSON 字串。 - 參數名稱依 A-Z / ASCII 排序。
- 組成
key=value&key2=value2。 - 最後接上
&key=API_SECRET。 - 做 MD5,並轉成大寫 32 碼。
notify_url、reverse_url 與 extra 若有送出,建議一併納入簽名。extra 為物件或陣列時,請使用實際送出的 JSON 結構計算簽名,避免前後端格式不同造成 簽名錯誤。平台後端也保留早期相容驗證,已串接商戶不受影響。
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));
}
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。
uid、timestamp 並使用 API Secret 產生 sign;商戶後端呼叫沃特 API;最後只把沃特 API 回傳的 data.redirect_url 或最外層 redirect_url 交給前端跳轉。API Secret 不可出現在瀏覽器。流程
- 商戶系統取得會員編號、會員姓名、可選電話與付款銀行帳號。
- 商戶後端呼叫
POST /api/v1/merchant/payment-links。 - 沃特 API 回傳可直接跳轉的
redirect_url/data.redirect_url、有效期限、第三方 session 與回調設定。 - 商戶前端直接導向
redirect_url,會員於天空交易所選擇儲值金額。 - 天空交易所將金額與會員資料送回沃特 API 建立收單,並進入 APP 代理匹配。
- APP 代理或後台完成後,沃特 API POST 回調到商戶
notify_url。
取得付款通道列表
https://api-test.wattt.asia/api/v1/merchant/payment-channels{
"uid": "ABCDE",
"timestamp": 1782343543,
"sign": "0BB022070F1578EC82C32D53F7EB7601"
}
取得商戶可選固定 / 自訂金額
https://api-test.wattt.asia/api/v1/merchant/payment-amounts商戶前端顯示金額前,請由商戶後端呼叫此 API 取得後台設定的固定金額與自訂金額上下限。
{
"uid": "ABCDE",
"timestamp": 1782343543,
"sign": "0BB022070F1578EC82C32D53F7EB7601"
}
{
"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
https://api-test.wattt.asia/api/v1/merchant/payment-links/amount會員在商戶端選好固定金額或自訂金額後,商戶後端帶 amount 呼叫此 API。系統會驗證金額是否符合後台設定,並回傳可直接跳轉且自動建立收單媒合的 redirect_url。
amount 必須等於 /payment-amounts 回傳的固定金額,或落在允許的自訂金額範圍內。成功後會直接回傳 /sky/purchase/wait/{token} 短網址,商戶不會收到會員與銀行資料 query string。{
"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"
}
{
"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 -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"}'
取得天空交易所跳轉連結
https://api-test.wattt.asia/api/v1/merchant/payment-linksdata.redirect_url、redirect_url 或 url 跳轉,不需要自行組成 query_params。payer_bank_name、payer_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 | 否 | 會員流程結束後可返回商戶頁面的網址。 |
timestamp | 是 | UNIX timestamp。 |
sign | 是 | 使用本文件簽名規則產生。 |
{
"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"
}
{
"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 -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。
https://api-test.wattt.asia/api-docs/openapi.json1. 建立收單
https://api-test.wattt.asia/api/v1/merchant/collections用於商戶建立一筆代收 / 收單資料,資料會寫入收單列表,並可進入 APP 代理賣幣流程。
Request 欄位
| 參數 | 必填 | 格式 | 說明 |
|---|---|---|---|
uid | 是 | string <= 20 | 商戶 UID。 |
orderid | 是 | string <= 64 | 平台收單唯一單號;同一商戶不可重複。 |
merchant_order_no | 否 | string <= 64 | 商戶端訂單號;未填時預設等於 orderid。 |
gateway_code | 否 | string <= 30 | 網關代碼;預設 gateway_c。 |
channel | 否 | string <= 30 | 通道名稱 / 通道代碼。 |
currency | 否 | string <= 10 | 幣別;目前建議固定 TWD。 |
amount | 是 | numeric >= 0.01 | 收單金額,台幣。 |
paid_amount | 否 | numeric >= 0 | 已付款金額;status=succeeded 且未填時預設等於 amount。 |
status | 否 | pending / succeeded / manual | pending=未付,succeeded=已付,manual=已補。 |
collection_status | 否 | pending / matched / exception | 收單流程狀態;一般建單可送 pending。 |
collection_account_name | 否 | string <= 120 | 平台收款戶名。 |
collection_account_no | 否 | string <= 80 | 平台收款帳號。 |
collection_bank_name | 否 | string <= 120 | 平台收款銀行。 |
counterparty_account | 建議 | string <= 120 | 付款人銀行帳號;APP 代理確認末五碼會使用。 |
member_bank_name | 否 | string <= 120 | 付款人銀行名稱。 |
user_id | 否 | string <= 64 | 商戶會員 ID。 |
user_name | 否 | string <= 120 | 商戶會員名稱。 |
notify_url | 否 | url <= 255 | 商戶異步通知網址。 |
return_url | 否 | url <= 255 | 付款完成返回網址。 |
paid_at | 否 | date/datetime | 已付時間;status=succeeded 時可帶。 |
timestamp | 是 | integer | UNIX timestamp。 |
extra | 否 | object/string | 自訂資料;JSON 物件或 v6.0 字串皆可。 |
sign | 是 | string(32) | 簽名。 |
狀態值
pending:未付 / 待處理succeeded:已付 / 成功manual:後台補單 / 已補collection_status=pending:待匹配collection_status=matched:已匹配collection_status=exception:異常
{
"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 -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. 建立代付
https://api-test.wattt.asia/api/v1/merchant/payouts用於商戶建立一筆代付資料,資料會寫入代付列表,並可進入 APP 代理買幣流程。
Request 欄位
| 參數 | 必填 | 格式 | 說明 |
|---|---|---|---|
uid | 是 | string <= 20 | 商戶 UID。 |
serial_no | 是 | string <= 40 | 代付唯一流水號;同一流水號不可重複。 |
merchant_order_no | 否 | string <= 80 | 商戶端訂單號;未填時預設等於 serial_no。 |
channel | 否 | string <= 30 | 通道名稱;預設代付。 |
amount | 是 | numeric >= 0.01 | 代付金額。 |
actual_amount | 否 | numeric >= 0 | 實際代付金額;未填預設等於 amount。 |
status | 否 | pending / processed / cancelled | pending=待處理,processed=已處理,cancelled=已撤銷。 |
payee_name | 是 | string <= 120 | 收款人姓名。 |
payee_bank | 否 | string <= 120 | 收款銀行。 |
payee_account | 否 | string <= 80 | 收款帳號。 |
payment_tag | 否 | string <= 60 | 代付標籤 / 備註標籤。 |
beneficiary_name | 否 | string <= 120 | 受款人名稱;未填預設等於 payee_name。 |
requested_at | 否 | date/datetime | 請求時間;未填預設 now()。 |
processed_at | 否 | date/datetime | 處理完成時間;status=processed 時可帶。 |
voucher_no | 否 | string <= 80 | 憑證號。 |
note | 否 | text | 備註。 |
is_delayed | 否 | boolean | 是否延遲處理。 |
notify_url | 否 | url <= 255 | 代付完成異步通知網址。 |
reverse_url | 否 | url <= 255 | 代付失敗 / 撤銷異步通知網址。 |
timestamp | 是 | integer | UNIX timestamp。 |
extra | 否 | object/string | 自訂資料;JSON 物件或 v6.0 字串皆可。 |
sign | 是 | string(32) | 簽名。 |
狀態值
pending:待處理processed:已處理 / 成功cancelled:已撤銷 / 失敗 / 駁回success、succeeded會轉為processedfailed、rejected會轉為cancelled
{
"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 -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 常見欄位。
收單查詢
https://api-test.wattt.asia/api/v1/merchant/collections/status{
"uid": "ABCDE",
"orderid": "COL202606250001",
"timestamp": 1782343543,
"sign": "090EA11DCC84AAE413F86C90FCD8276D"
}
代付查詢
https://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. 餘額查詢 / 銀行列表
商戶餘額查詢
https://api-test.wattt.asia/api/v1/merchant/balance{
"uid": "ABCDE",
"timestamp": 1782343543,
"sign": "0BB022070F1578EC82C32D53F7EB7601"
}
回傳欄位包含 balance、balance0、balance1、balance2,以及 data.summary 內的收單、代付、凍結與可用餘額明細。
銀行列表
https://api-test.wattt.asia/api/v1/merchant/bankshttps://api-test.wattt.asia/api/v1/merchant/banks?q=中國信託
回調重送
https://api-test.wattt.asia/api/v1/merchant/callbacks/retry{
"uid": "ABCDE",
"type": "collection",
"orderid": "COL202606250001",
"timestamp": 1782343543,
"sign": "49D47BB110823333D39097E8178FC650"
}
5. 商品查詢
https://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 僅會出現 success 或 failed。
建議代收回調格式
{
"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 應送哪個欄位。
| 參考文件欄位 | 目前系統欄位 | 狀態 | 說明 |
|---|---|---|---|
merchantNo | uid | 已相容 | 目前請送 uid。 |
orderNo(收單) | orderid | 已相容 | 目前收單唯一單號使用 orderid。 |
orderNo(代付) | serial_no | 已相容 | 目前代付唯一流水號使用 serial_no。 |
time | timestamp | 已相容 | 目前使用 UNIX timestamp。 |
notifyUrl | notify_url | 已相容 | 目前使用 snake_case。 |
userNo | user_id | 已相容 | 付款會員 ID。 |
userName | user_name | 已相容 | 付款會員名稱。 |
name(代付) | payee_name | 已相容 | 收款人姓名。 |
bankName | payee_bank / member_bank_name / payer_bank_name | 已相容 | 依代付 / 收單 / 付款跳轉情境不同。 |
bankAccount | payee_account / counterparty_account / payer_account_no | 已相容 | 依代付 / 收單 / 付款跳轉情境不同。 |
payerAccountNumber | payer_account_no | 已相容 | 付款會員完整銀行帳號;payment-links 會轉給付款頁與 APP 代理核對。 |
payeeAccountNumber | payer_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。 |
422 | validation error | 缺少必填或格式錯誤。 | 依照 Request 欄位表修正。 |