API開發文件

- OpenAPI documentation -

簡介

本 OpenAPI 採用 RSA2048 + SHA512withRSA 雙向簽名 進行身份認證與防篡改:請求由商戶私鑰簽名、平台用商戶公鑰驗簽;響應/通知由平台私鑰簽名、商戶用平台公鑰驗簽。傳輸保密由 HTTPS 保證,不再做 jsonData 加密、不使用 token

金額單位一律為「元」,保留 2 位小數,使用字串傳輸(例:"100.00")。所有請求 Content-Type: application/json,UTF-8。

安全模型與流程

  1. 商戶用自己的私鑰對簽名串做 SHA512withRSA 簽名,Base64 後放入 sign
  2. 平台校驗時間戳視窗(±5 分鐘)與來源 IP 白名單。
  3. 平台用商戶公鑰對原始報文驗簽,通過後解析 jsonData 執行業務並寫審計日誌。
  4. 平台用平台私鑰對結果簽名後返回;商戶用平台公鑰驗簽。

防重放:HTTPS + 時間戳 ±5 分鐘視窗 + out_trade_no 業務冪等(重複下單/出金返回同一單,查詢只讀,無資損)。

平台與商戶配置

項目說明
businessSubjectId商戶編碼,由平台分配(= 商戶後台 ID + 10000),對接時固定使用。
商戶公鑰商戶自行生成 RSA 2048 金鑰對,將公鑰 PEM 提交給平台(後台「商戶編輯」錄入),私鑰自行保管。
平台公鑰平台後台「OpenAPI 密鑰」頁取得平台公鑰 PEM 與指紋,用於驗證平台響應與通知。
IP 白名單可在後台配置允許調用的來源 IP(留空=不限制)。

統一信封結構

請求 Body(JSON)

欄位含義必填說明
businessSubjectId商戶編碼= 商戶 ID + 10000
jsonData業務參數業務 JSON 的明文字串(業務類型由 URL 決定)
timestamp毫秒時間戳13 位毫秒,±5 分鐘有效
sign簽名商戶私鑰對簽名串 SHA512withRSA 後 Base64

響應 Body(JSON)

{
  "code": "0000",
  "message": "success",
  "data": {
    "businessSubjectId": "10001",
    "jsonData": "{...業務返回明文...}",
    "timestamp": "1700000000000",
    "sign": "平台私鑰簽名(Base64)"
  }
}

早期失敗(未知商戶/驗簽失敗/IP 不符等)返回明文錯誤信封,datanull,無 sign

簽名演算法(SHA512withRSA)

演算法 SHA512withRSA(PHP: OPENSSL_ALGO_SHA512),簽名結果 Base64。

請求簽名串(順序固定,原樣拼接)

signStr = jsonData + "&" + businessSubjectId + "&" + timestamp
sign    = base64( RSA_SHA512_sign(signStr, 商戶私鑰) )

響應/通知驗簽串

響應: jsonData + "&" + businessSubjectId + "&" + timestamp
通知: jsonData + "&" + businessSubjectId + "&" + timestamp + "&" + businessType

實作紅線:驗簽必須針對原始報文中的 jsonData 字串值,禁止把解析後的物件重新 json_encode 再驗——鍵序/轉義一變簽名即失效。請用原始請求體(如 php://input)取 jsonData

調試介面

提交方式:POST

地址:閘道地址 + /Openapi_Debug_ping.html

驗簽通過後原樣回顯 jsonData,用於聯通與加簽自測。

統一下單(收款)

提交方式:POST 地址:閘道地址 + /Openapi_Collect_create.html

jsonData 業務欄位

欄位含義必填說明
out_trade_no商戶訂單號商戶側唯一,冪等鍵
amount金額元,2 位小數字串
productname商品名稱
notify_url異步通知地址收款成功後平台回調
callback_url頁面跳轉地址
attach附加資料原樣回傳

返回 jsonData

欄位含義說明
out_trade_no商戶訂單號
transaction_id平台訂單號
amount金額
bank_code收款銀行代碼下游向此卡付款
branch_code分行代碼
account_no收款卡號
account_name收款戶名
expire_at逾時時間YYYY-mm-dd HH:ii:ss
expire_seconds剩餘秒數

同一 out_trade_no 重複下單返回同一訂單與同一張卡(冪等,不重複鎖卡)。

收款異步通知

收款成功時,平台以信封格式 POST 到 notify_urlbusinessType=COLLECT_NOTIFY(參與簽名)。商戶用平台公鑰驗簽後,回傳純文字 SUCCESS 即停止;否則平台最多重試 5 次(每整點 1 次)。

通知 jsonData 欄位

欄位含義
out_trade_no商戶訂單號
transaction_id平台訂單號
amount金額
statussuccess
datetime時間 YmdHis
attach附加資料

訂單查詢

提交方式:POST 地址:閘道地址 + /Openapi_Collect_query.html

jsonData:{ "out_trade_no": "..." }

返回 jsonData

欄位含義說明
out_trade_no商戶訂單號
transaction_id平台訂單號
amount金額
trade_state交易狀態SUCCESS / NOTPAY
time_end成功時間成功時返回

出金申請

提交方式:POST 地址:閘道地址 + /Openapi_Payout_apply.html

jsonData 業務欄位

欄位含義必填說明
out_trade_no商戶訂單號冪等鍵
amount出金金額元,2 位小數字串
account_no客戶卡號
account_name客戶戶名
bank_name客戶銀行
branch_name客戶分行
province / city省 / 市
notify_url異步通知地址
attach附加資料原樣回傳

返回 jsonData:{ trade_no, out_trade_no, amount, fee }

出金查詢

提交方式:POST 地址:閘道地址 + /Openapi_Payout_query.html

jsonData:{ "out_trade_no": "..." }

欄位含義說明
trade_no平台出金單號
out_trade_no商戶訂單號
amount / fee金額 / 手續費
status狀態碼0 待審核 1 已放款 2 已駁回 3 放款中
status_text狀態文字
reject_reason駁回原因

出金異步通知

出金放款/駁回時,平台以信封格式 POST 到 notify_urlbusinessType=PAYOUT_NOTIFY(參與簽名)。商戶驗簽後回 SUCCESS 停止;最多 5 次、每整點重試。

欄位含義
out_trade_no / trade_no商戶單號 / 平台單號
amount / fee金額 / 手續費
statussuccess / fail
reject_reason駁回原因
attach / datetime附加資料 / 時間

錯誤碼

code含義
0000成功
4001參數缺失/非法
4002驗簽失敗
4003時間戳過期
4004來源 IP 不允許
4005商戶不存在/未配公鑰/已停用
5000業務失敗
5001餘額不足

渠道編碼

收款(銀行卡)渠道編碼為 999。如需指定可在下單 jsonData 傳 pay_bankcode,預設 999。

簽名範例與測試向量

官方 PHP Demo:docs/sdk/openapi_demo.php;凍結測試向量(測試金鑰 + 已知 jsonData/timestamp → 期望 sign):docs/sdk/test_vector.json(由自檢工具 php cli.php openapiSelfTest 產生)。

請求範例

POST /Openapi_Debug_ping.html
Content-Type: application/json

{
  "businessSubjectId": "10001",
  "jsonData": "{\"msg\":\"hello\",\"n\":1}",
  "timestamp": "1700000000000",
  "sign": "<商戶私鑰 SHA512withRSA 簽名(Base64)>"
}

簽名串(用於計算 sign)

{"msg":"hello","n":1}&10001&1700000000000
更智慧的洞察,更快的決策

立即開啟智慧支付

加入 4,500+ 高效團隊,一起切換到永旭支付。

立即註冊