跳到主要内容

ECR 整合技術規格

備註

支援的終端機型號

  • Landi A8 / A8S:支援所有支付方式
  • PAX A920:僅支援 QR Code 支付

1. POS-KEY

POS-KEY 為用於加密交易資料的金鑰,透過 Haojin App 產生。

系統預設為 啟用加密。商戶可於商戶平台(MMS)開啟 / 關閉加密或重新產生 POS-KEY,並需於 Haojin App 進行裝置刷新後才會生效。

重新產生 POS-KEY:

  • Haojin App → 我的 → 設定 → POS-Key → 產生

查詢 POS-KEY:

  • 商戶平台 → 設定 → 裝置設定 → POS Key 管理

2. 加密方式(Encryption)

  • 所有交易資料皆使用 AES 加密
  • 加密金鑰:POS-KEY
  • IV:qfpay202306_hjsh
  • 加密後結果再進行 Base64 編碼

3. 請求資料格式(Request Payload)

參數必填型態說明
amtDouble交易金額(如 10.1 = HKD $10.10)
func_typeString功能指令代碼
channelString錢包 / 支付方式
out_trade_noString商戶交易參考號
camera_idInteger0 = 後鏡頭(預設),1 = 前鏡頭
payment_timeoutInteger支付逾時時間(秒)
wait_card_timeoutInteger等待刷卡時間(預設 120 秒,不建議修改)

3.1 付款(Payment)

備註
  • QR Code 模式:MPM / CPM 依最近一次使用自動切換
  • 鏡頭選擇camera_id 可選前/後鏡頭
  • 付款逾時設定
    • 刷卡交易:等待感應卡最大時間
    • 錢包交易:整筆交易最大等候時間
    • PayMe 最大僅支援 120 秒
  • 掃碼類型 (scan_type)
    • QRCODE_PAY
    • SCAN_PAY
  • 完成後返回首頁 (moveToBack)
    • 0:不返回(預設)
    • 1:交易完成後自動返回首頁
{
"content": {
"amt": 100,
"camera_id": 0,
"channel": "card_payment",
"func_type": 1001,
"moveToBack": 1,
"out_trade_no": "456799999999",
"wait_card_timeout": 120,
"scan_type": "SCAN_PAY"
},
"digest": "76b9186077cdc2bc5d78ae921309811d"
}

3.2 退款(Refund / Void)

欄位必填型別說明
orderIdStringQFPay 交易編號(syssn)
refund_amountString退款金額(預設為最大可退金額,支援部分退款)
allow_modify_flagInteger0 = 不可修改(預設),1 = 可修改
備註

Visa / Mastercard / 銀聯卡 / 美國運通卡
當日退款必須全額退款,不支援當日部分退款。

{
"content": {
"allow_modify_flag": 1,
"func_type": 1002,
"moveToBack": 1,
"orderId": "order_id",
"refund_amount": "0.05"
},
"digest": "9C8E9FB05C7C24B6CA04EBFA1263EF41"
}

3.3 列印收據(Print Receipt)

{
"content": {"orderId": "12345678","func_type": 3001},
"digest":"79fd145311d54d03e4e685d50f15dd7f"
}

3.4 3.4 列印交易摘要(Print Summary)

{
"content": {"func_type": 3002},
"digest":"79fd145311d54d03e4e685d50f15dd7f"
}

3.5 3.4 列印交易摘要(Print Summary)

支援參數 out_trade_no

{
"content": {"orderId": "12345678","func_type": 4001},
"digest":"99CE8BF9C7304AC964522D10F51660B4"
}

3.6 取消付款 / 退款請求

{
"content": {"func_type": 5001},
"digest":"99CE8BF9C7304AC964522D10F51660B4"
}

4. 簽名產生機制(Signature Generation)

簽名計算流程範例

// original payload
content={"amt":100,"channel": "card_payment","func_type":1001,"out_trade_no":"456799999999"}

// sorted keys in alphabetical ascending order
format_content={amt=100,channel='card_payment',func_type=1001,out_trade_no='456799999999'} 这种格式

// encryption
// !! if the value is empty, pass '' (empty string) instead
digest=md5(format_content + pos_key)
digest=(
md5(
{amt=100,channel='card_payment',func_type=1001,out_trade_no='456799999999'}f46b1f****aacd
)
)

如啟用加密,需先將 content 進行 AES 加密,再以加密結果計算 digest

加密後請求範例

{
"content": "{func_type: 3002}",
"digest":"79fd145311d54d03e4e685d50f15dd7f"
}

5. 欄位定義(Field Definitions)

5.1 func_type

數值說明
1001交易
1002退款
3001列印收據
3002列印交易摘要
4001交易查詢
5001取消請求

5.2 channel(付款方式)

CPM = 消費者出示碼
MPM = 商戶出示碼

說明PayType
card_paymentVisa / Mastercard802808
wx微信支付800208 / 800201
alipay支付寶800108 / 800101
paymePayMe805808 / 805801
union銀聯閃付800708 / 800701
fpsFPS802001
octopus八達通803708
unionpay_card銀聯卡806708
amex_card美國運通806808

6. 回應格式(Response Format)

{\"respcd\": \"6000\",\"data\": \"{"aaaaaa"}\",\"respmsg\": \"xxxxxxxxxx\",\"resperr\":\"xxxxxxxxxx\"}

回應代碼(Response Codes)

代碼說明
4003請求被拒絕
5001解密失敗
4004請求方法錯誤(請使用 POST)
4005其他錯誤
4006參數錯誤
6000請求成功
6001使用者取消
6002請求失敗

通用回應欄位(Common Fields)

欄位說明
respcd回應代碼
respmsg回應訊息
resperr錯誤訊息
data業務資料區塊

交易回應資料(Trade Response Data)

欄位說明
mchntnm商戶名稱
sysdtmQF 系統時間
userid門店 ID
busicd交易業務代碼(PayType)
txamt交易金額
txcurrcd交易幣別
chnlsn通道訂單號
paydtm錢包支付時間
udid裝置 / 使用者 ID
syssnQF 訂單號
clisn客戶端序號
out_trade_no商戶訂單號
cardscheme卡組織(VISA / MASTERCARD / UNIONPAY / AMEX)

退款回應資料(Refund Response Data)

欄位說明
orig_syssn原始交易單號
syssn退款交易單號
txamt退款金額
originTxamt原始交易金額
sysdtm系統時間
paydtm退款完成時間

交易查詢回應資料(Transaction Inquiry Data)

欄位說明
server_time伺服器時間
cancel取消狀態
clisn客戶端序號
opuid操作員 ID
syssnQF 訂單號
tradetp交易類型(payment / refund)
sysdtm系統時間
txcurrcd交易幣別
origssn原始交易單號
opuser操作員名稱
nickname門店名稱
allow_refund_amt可退款金額
desc交易描述
txamt交易金額
busicd目前交易 PayType
origbusicd原始交易 PayType
chnlsn錢包訂單號
cardscheme卡組織(VISA / MASTERCARD / UNIONPAY / AMEX)
cardno遮罩卡號(例:520000******1096)
cardtype卡種類(CREDIT / DEBIT)
batchno批次號
refno參考號

7. USB 資料傳輸方式

  1. 以 USB 連接 POS 與收銀機
  2. 依 USB 通訊協議封裝資料
  3. 回傳資料需依協議解析後再進行 AES 解密

8. HTTP 通訊協議(HTTP Protocol)

  1. HTTP 傳輸需指定 POS 主機 IP 與 Port,預設 Port 為 9001

  2. 資料格式

    • 使用 AES 演算法對請求資料進行加密。
    • 加密後的 Payload 以 HTTP POST 方法傳送至指定端點。
  3. API 路徑對應表

操作項目API 路徑
發起交易/api/pos/trade
發起退款/api/pos/cancel
列印收據/api/pos/print_receipt
列印交易摘要/api/pos/transaction_info
查詢交易結果/api/pos/query_transaction
取消交易/退款請求/api/pos/cancel_request
  1. HTTP 請求標頭(Header)
欄位
Content-Typeapplication/json
  1. HTTP 回應處理

回傳結果亦為 AES 加密內容,接收端需進行解密才能取得交易結果資料。

9. TCP 協議

  • 預設通訊埠:9002
  • 以 Socket 方式連線
  • 內容皆為 AES 加密資料

10. 收銀機與 POS 通訊協議(USB)

10.1 使用場景

透過 Haojin App 進行付款與取消交易。

10.2 傳輸方式

  • 使用 Micro USB 或底座轉換 USB Host
  • USB 較 WiFi 穩定、安全

10.3 封包結構

欄位內容說明長度
Start indicator0x2f6e封包起始2 Bytes
version0x01版本1 Byte
payload type0x10 / 0x20 / 0x30請求 / 回應 / 錯誤1 Byte
ref number0x01~0x7f封包對應碼1 Byte
payload length總長度2 Bytes
data length資料長度2 Bytes
data segment資料主體不定
End indicator0x2f6e封包結尾2 Bytes
注意

0x2f6e 為 ASCII 編碼中字串 /n 的十六進制表示,不是換行字元

10.4 錯誤碼

代碼說明
0x30不明錯誤
0x31格式錯誤
0x32驗證錯誤
0x33解密錯誤
0x34資料格式錯誤
0x35封包拼接錯誤

10.5 Timeout

回應逾時為 1000ms

10.6 AES 加密規格

  • AES-128 / CBC / PKCS5Padding

10.7 串列埠設定

設定
Baud rate9600
Stop bit1
Parity0
Data bits8
Flow controlOff
USB-to-Serial 晶片支援
晶片是否支援
PL2303 HXD
CH340
FT232
備註

此支援表僅適用於 本 USB 模式整合
若商戶使用 HTTP / TCP 整合方式,則晶片限制不適用。
一般穩定性與相容性排序為:FT232 > CH340 > PL2303

10.8 封包範例

明文封包範例:

{\"content\":\"{\\\"amt\\\":100,\\\"channel\\\":\\\"wx\\\",\\\"funcType\\\":1,\\\"mode\\\":1}\",\"digest\":\"2f0c4683e25a7b9407265033070e9034\"}

Hex 封包範例: 2f6e011001007f00747b22636f6e74656e74223a227b5c22616d745c223a3130302c5c226368616e6e656c5c223a5c2277785c222c5c2266756e63547970655c223a312c5c226d6f64655c223a317d222c22646967657374223a223266306334363833653235613762393430373236353033333037306539303334227d2f6e