---
tags: NewPOS
---
# EDC
:::info
EDC交易 要補寫入TDL PAY (付款別)
:::
[TOC]
## 卡機連接
:::info
EDC卡機使用ATEN USB 轉RS-232轉換器(UC232A),lsusb只能辨識到RS-232轉換器,因此無法使用VID + PID做EDC裝置辨識。

```
<1> <2> <3> <4>
| | | |
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
<1> 裝置所在的 USB bus 編號;一個 USB bus 可以連接多個裝置,每個裝置有不同的編號。(裝置編號從 002 開始,001 代表 USB bus 自己)
<2> 裝置在該 USB bus 下的編號 (device number)。
<3> 冒號前後分別是裝置的 vendor ID (製造商) 與 product ID (產品)。
<4> Vendor ID 與 product ID 對應的名稱。例如這裡的 1d6b 代表的是 Linux Foundation,而 0002 則代表 2.0 root hub。
```
Ref:
[The USB ID Repository](https://usb-ids.gowdy.us/read/UD/)
[lsusb](https://imsardine.github.io/2016/11/06/lsusb-command/)
:::
- 裝置辨識
:::success
目前辨識ATEN USB 轉RS-232轉換器()"vid": 0x0557,"pid": 0x2008) 為EDC
:::
```
if plugin device is EDC then
send 卡機確認訊息(tk3c特規)
object EDC_Bank
switch(response msg.CardNumber)
case "2" // 富邦
EDC_Bank.name = "fubon"
break;
case "" // NCCC
EDC_Bank.name = "nccc"
break;
case "" // 台新
EDC_Bank.name = "tspg"
break;
EDC_Bank.UID = vendor ID + product ID + serial port
end if
```
## 流程圖
### 刷卡流程
``` mermaid
graph TD;
既有流程至選付款別-->選取連線信用卡
既有流程至選付款別-->選取離線信用卡
選取離線信用卡-->輸入信用卡卡號
輸入信用卡卡號-->POS完成交易結束流程
POS完成交易結束流程-->人工操作卡機授權
選取連線信用卡-->MPOS發送MQTT訊息詢問DOCK卡機是否存活
MPOS發送MQTT訊息詢問DOCK卡機是否存活-->DOCK回傳卡機狀態及訊息
DOCK回傳卡機狀態及訊息-->列出可使用卡機
列出可使用卡機-->選擇刷卡機
選擇刷卡機-->台新;
選擇刷卡機-->富邦;
選擇刷卡機-->NCCC;
台新-->透過MQTT往DOCK發送訊息;
透過MQTT往DOCK發送訊息-->DOCK往卡機發送刷卡訊息;
DOCK往卡機發送刷卡訊息-->DOCK等待回傳訊息;
DOCK等待回傳訊息-->卡機選擇刷卡類型;
卡機選擇刷卡類型-->一般;
卡機選擇刷卡類型-->分期;
卡機選擇刷卡類型-->紅利折抵;
一般-->回傳結果;
分期-->回傳結果;
紅利折抵-->回傳結果;
回傳結果-->授權成功;
回傳結果-->授權失敗;
DOCK等待回傳訊息-->逾時;
授權成功-->DOCK接收回傳訊息;
授權失敗-->DOCK接收回傳訊息;
逾時-->DOCK接收回傳訊息;
DOCK接收回傳訊息-->往MPOS發送訊息;
```
#### 注意
1. 各家銀行規格前端處理(因為目前交易規格都一樣)DOCK保持邏輯乾淨
2. 連線信用卡回填資料以卡機回覆為準,離線信用卡則以操作者選擇為準
### 銷退流程
``` mermaid
graph TD;
查詢退貨訂單-->輸入交易序號;
輸入交易序號-->查閱明細;
查閱明細-->退貨;
退貨-->檢查是刷卡機還是PR;
檢查是刷卡機還是PR-->PR;
PR-->走自動退授權流程;
檢查是刷卡機還是PR-->刷卡機;
刷卡機-->跳出提示到刷卡機人工退授權;
走自動退授權流程-->回壓訂單狀態;
跳出提示到刷卡機人工退授權-->回壓訂單狀態;
```
#### 欲解決問題
1. 訂單明細格式<font color="#f00">(是否需要因應卡機新增資訊)</font>
2. 目前刷卡退授權與否控制在前端
## 離線信用卡交易要求
```plantuml
@startuml
|mPOS/POS|
start
:信用卡付款;
:輸入信用卡號碼;
:提示使用者至卡機操作;
split
:訂單完成;
stop
split again
|卡機|
:操作人員到卡機操作授權;
stop
@enduml
```
## 離線信用卡取消交易要求
```plantuml
@startuml
|mPOS/POS|
start
:信用卡取消授權;
:提示使用者至卡機操作;
split
:修改訂單狀態;
stop
split again
|卡機|
:操作人員到卡機操作退授權;
stop
@enduml
```
# EDC TSB 台新刷卡機
## 信用卡交易要求 (多元: 一般/分期/紅利)

### Request
```json
{
"Trans_Type": "01"
"Trans_Amount": 1
"Store_Id": "705"
"CUP_Indicator": "C"/*CUP*/ "N"/*Default*/
}
```
:::spoiler schema
```json
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"Trans_Type": {
"type": "string"
},
"Trans_Amount": {
"type": "integer",
"minimum": 1,
"maximum": 999999999999
},
"Store_Id": {
"type": "string",
"minLength": 1,
"maxLength": 10
},
"CUP_Indicator": {
"type": "string",
"pattern": "^[CN]$"
}
},
"required": [
"Trans_Type",
"Trans_Amount",
"Store_Id",
]
}
```
:::
### Response
- [一般交易](#信用卡交易要求-一般交易)
- [分期](#信用卡交易要求-分期)
- [紅利](#信用卡交易要求-紅利)
```plantuml
@startuml
|mPOS/POS|
start
:信用卡結帳;
:輸入金額;
:發送 Dock info Message;
|DOCK Service|
:publish dock service info + subservice info;
|mPOS/POS|
:選擇 台新(一般/分期);
:發送卡機Message;
split
:等待超過1min;
:交易失敗 / 交易結果未知;
end
split again
|DOCK Service|
repeat
:發送卡機電文;
|台新 EDC|
switch (選擇交易類別)
case ()
:一般交易;
case ()
:分期交易;
:輸入分期期數;
case ()
:紅利交易;
endswitch
|DOCK Service|
:等待/接收卡機回復電文;
repeat while (卡機回復結果) is (電文格式錯誤, 重試最多三次)
-> 電文格式OK 或 已等待超過1Min;
:發送卡機交易結果Message;
|mPOS/POS|
:接收Dock卡機回復Message;
if (交易結果) then (ECR_Response_Code == "0000")
:交易結果;
else (else)
:交易失敗;
endif
stop
@enduml
```
## 信用卡交易要求 (一般交易)
### Request
```json
{
"Trans_Type": "01" / "11"
"Trans_Amount": 1
"Store_Id": "705"
"CUP_Indicator": "C"/*CUP*/ "N"/*Default*/
}
```
### Response
```json
{
"Trans_Type":"11",
"Host_ID":"03",
"Receipt_No":"000015",
"Card_No":"XXXXXXXXXXXXXXXX ",
"Trans_Amount":"000000000100",
"Trans_Date":"210803",
"Trans_Time":"114201",
"Approval_No":"TT4201 ",
"ECR_Response_Code":"0000",
"EDC_Terminal_ID":"64604484",
"Card_type":"04",
"CUP_Indicator":"0",
"_edcresp_raw":"\u00021103000015XXXXXXXXXXXXXXXX 000000000100210803114201TT4201 000000000000000064604484000000000000000000000000000000000000000000000400000000\u0003\u0002"
}
```
<!--
```plantuml
@startuml
|mPOS/POS|
start
:信用卡結帳;
:輸入金額;
:選擇 台新(一般/分期);
:發送卡機Message;
split
:等待超過1min;
end
split again
|DOCK Service|
repeat
:發送卡機電文;
|台新 EDC|
:一般交易;
|DOCK Service|
:接收卡機回復電文;
repeat while (卡機回復結果) is (電文格式錯誤, 重試最多三次)
-> 電文格式OK 或 已等待超過1Min;
:發送卡機交易結果Message;
|mPOS/POS|
:接收Dock卡機回復Message;
if (交易結果) then (ECR_Response_Code == "0000")
:交易結果;
else (else)
:交易失敗;
endif
stop
@enduml
```
-->
## 信用卡交易要求 (分期)
### Request
```json
{
"Trans_Type": "01" / "04"
"Trans_Amount": 交易金額: int
"Store_Id": 櫃號/發票號碼
"CUP_Indicator": "C"/*CUP*/ "N"/*Default*/
}
```
### Response
```json
{
"Trans_Type":"04",
"Host_ID":"04",
"Receipt_No":"000018",
"Card_No":"XXXXXXXXXXXXXXXX ",
"Trans_Amount":"000000000100",
"Trans_Date":"210803",
"Trans_Time":"133947",
"Approval_No":"TT3947 ",
"Installment_Period":"03",
"ECR_Response_Code":"0000",
"EDC_Terminal_ID":"64604484",
"Installment_Total_Amount":"000000000100",
"Downpayment_Amount":"000000000100",
"Eachpayment_Amount":"000000000000",
"Order_No":"210803133947000000",
"Card_type":"04",
"_edcresp_raw":"\u00020404000018XXXXXXXXXXXXXXXX 000000000100210803133947TT3947 000000000100000064604484000000000100000000000000210803133947000000030400000000\u0003\u000e",
}
```
<!--
```plantuml
@startuml
|mPOS/POS|
start
:信用卡結帳;
:輸入金額;
:選擇 台新(一般/分期);
:發送卡機Message;
split
:等待超過1min;
end
split again
|DOCK Service|
repeat
:發送卡機電文;
|台新 EDC|
:分期交易;
:輸入分期期數;
|DOCK Service|
:接收卡機回復電文;
repeat while (卡機回復結果) is (電文格式錯誤, 重試最多三次)
-> 電文格式OK 或 已等待超過1Min;
:發送卡機交易結果Message;
|mPOS/POS|
:接收Dock卡機回復Message;
if (交易結果) then (ECR_Response_Code == "0000")
:交易結果;
else (else)
:交易失敗;
endif
stop
@enduml
``` -->
## 信用卡交易要求 (紅利)
### Request
```json
{
"Trans_Type": "01" / "05"
"Trans_Amount": 交易金額: int
"Store_Id": 櫃號/發票號碼
"CUP_Indicator": "C"/*CUP*/ "N"/*Default*/
}
```
### Response
```json
{
"Trans_Type":"05",
"Host_ID":"05",
"Receipt_No":"000017",
"Card_No":"XXXXXXXXXXXXXXXX ",
"Trans_Amount":"000000000100",
"Trans_Date":"210803",
"Trans_Time":"125755",
"Approval_No":"TT5755 ",
"Rebate_Point":"000000000000",
"ECR_Response_Code":"0000",
"EDC_Terminal_ID":"64604484",
"Real_Amount":"000000000100",
"Rebate_Amount":"000000000000",
"Order_No":"123456789012000000",
"Card_type":"04",
"_edcresp_raw":"\u00020505000017XXXXXXXXXXXXXXXX 000000000100210803125755TT5755 000000000000000064604484000000000100000000000000123456789012000000000400000000\u0003\u0003",
}
```
<!--
```plantuml
@startuml
|mPOS/POS|
start
:信用卡結帳;
:輸入金額;
:選擇 台新(一般/分期);
:發送卡機Message;
split
:等待超過1min;
end
split again
|DOCK Service|
repeat
:發送卡機電文;
|台新 EDC|
:紅利交易;
|DOCK Service|
:接收卡機回復電文;
repeat while (卡機回復結果) is (電文格式錯誤, 重試最多三次)
-> 電文格式OK 或 已等待超過1Min;
:發送卡機交易結果Message;
|mPOS/POS|
:接收Dock卡機回復Message;
if (交易結果) then (ECR_Response_Code == "0000")
:交易結果;
else (else)
:交易失敗;
endif
stop
@enduml
```
-->
## 信用卡取消交易要求
### Request
```json
{
"Trans_Type": "30"
"Host_ID": 銀行別/授權中心編碼
"Receipt_No": EDC 簽單序號
}
```
:::spoiler schema
```json
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"Host_ID": {
"type": "string",
"minimum": 1,
"maximum": 999999999999
},
"Receipt_No": {
"type": "string",
"minLength": 1,
"maxLength": 10
}
},
"required": [
"Host_ID",
"Receipt_No",
]
}
```
:::
### Response
```json
{
"Trans_Type":"30",
"Host_ID":"03",
"Receipt_No":"000015",
"Card_No":"XXXXXXXXXXXXXXXX ",
"Trans_Amount":"000000000100",
"Trans_Date":"210803",
"Trans_Time":"125206",
"Approval_No":"TT4201 ",
"ECR_Response_Code":"0000",
"EDC_Terminal_ID":"64604484",
"Card_type":"04",
"_edcresp_raw":"\u00023003000015XXXXXXXXXXXXXXXX 000000000100210803125206TT4201 000000000000000064604484000000000000000000000000000000000000000000000400000000\u0003\u0004",
}
```
```plantuml
@startuml
|mPOS/POS|
start
:信用卡取消授權;
:發送卡機Message;
split
:等待超過1min;
:交易失敗 / 交易結果未知;
end
split again
|DOCK Service|
repeat
:發送卡機電文;
|台新 EDC|
:輸入卡機密碼;
:確認取消交易;
|DOCK Service|
:等待/接收卡機回復電文;
repeat while (卡機回復結果) is (電文格式錯誤, 重試最多三次)
-> 電文格式OK 或 已等待超過1Min;
:發送卡機交易結果Message;
|mPOS/POS|
:接收Dock卡機回復Message;
if (交易結果) then (ECR_Response_Code == "0000")
:交易結果;
else (else)
:交易失敗;
endif
stop
@enduml
```