# ecpay 串接綠界SDK(java) for OSGI bundle
###### tags: `ECpay` `Java` `OSGI`
本次是記錄使用綠界信用卡刷卡一次付清、定期定額功能紀錄
## 付款方式: 信用卡
## 注意
手續費: 最低五元
一般及商務會員: 一次付清 2.75%
特約會員:
## java 實作
串接文件: https://www.ecpay.com.tw/Content/files/ecpay_011.pdf
後台登入:https://vendor-stage.ecpay.com.tw/
後台登入測試帳密:StageTest/test1234
測試卡號:4311-9522-2222-2222 安全碼:222
### java串接流程
使用綠界提供的java SDK,將必要的資料帶入後會回傳網頁的from表單,再透過網頁submit此表單後就會導入綠界付款流程,付款完畢後綠界會return api來接收付款結果資料
下載java SDK
https://github.com/ECPay/ECPayAIO_Java
範例文件
https://github.com/ECPay/ECPayAIO_Java/blob/master/Doc/Java_ecpay_PaymentSDK.pdf
### OSGI bundle方式
### 初始化
建立一個empty bundle project把ecpay資料夾丟到src/下,及匯入jars即可
### 選擇付款方式
```
AioCheckOutALL obj = new AioCheckOutALL(); //不指定付款方式,由綠界顯示
AioCheckOutCVS obj = new AioCheckOutCVS(); //CVS超商代碼繳費
AioCheckOutWebATM obj = new AioCheckOutWebATM(); //網路ATM
.....等等
```
### 實作
```
AllInOne all = new AllInOne();
AioCheckOutALL obj = new AioCheckOutALL();
//填入必要的資料
obj.setMerchantTradeNo("testCompany0004");
obj.setMerchantTradeDate("2017/01/01 08:05:23");
obj.setTotalAmount("50");
obj.setTradeDesc("test Description");
obj.setItemName("TestItem");
obj.setReturnURL("http://211.23.128.214:5000");
obj.setNeedExtraPaidInfo("N");
//回傳form表單的資料
String form = all.aioCheckOut(obj, null);
```
### 綠界回傳的資料是form_data格式,要自行轉成json
此為 obj.setNeedExtraPaidInfo("Y")時的 詳細資料(已經轉成json)
```
{
"ExecTimes": "12", //次數
"PeriodType": "M", //每個月
"TotalSuccessTimes": "1", //已成功執行一次
"red_de_amt": "",
"WebATMAccBank": "",
"RtnCode": "1", //付款成功
"red_ok_amt": "",
"eci": "",
"TenpayTradeNo": "",
"stast": "",
"PaymentNo": "",
"ATMAccBank": "",
"PayFrom": "",
"RtnMsg": "交易成功",
"AlipayID": "",
"ATMAccNo": "",
"WebATMBankName": "",
"PaymentType": "Credit_CreditCard",
"TradeDate": "2019/05/24 13:22:43",
"AlipayTradeNo": "",
"amount": "100", //每次金額
"card6no": "431195", //信用卡前六碼
"SimulatePaid": "0", //模擬付款
"PaymentDate": "2019/05/24 13:24:08", //付款時間
"card4no": "2222", //信用卡末四碼
"MerchantID": "2000132",
"CheckMacValue": "2EC9140FF4E37CA8892A510DF2C9A0816E16AE65D37B364049BC402CF55F29C2",
"MerchantTradeNo": "TO20190524132138676",
"PeriodAmount": "100",
"PaymentTypeChargeFee": "1", //通路費
"red_dan": "",
"auth_code": "777777",
"CustomField1": "",
"CustomField2": "",
"CustomField3": "",
"CustomField4": "",
"red_yet": "",
"stage": "",
"StoreID": "",
"staed": "",
"process_date": "2019/05/24 13:24:08", //處理時間
"WebATMAccNo": "",
"Frequency": "1",
"TradeAmt": "100",
"TradeNo": "1905241322433852", // 綠界的交易編號
"gwsr": "10863083",
"TotalSuccessAmount": "100" //目前已成功授權的金額合計
}
```
### CheckMacValue
每筆綠界回傳的資料都會帶上CheckMacValue,必須檢查是否一致後,才存入資料庫
```
// 判斷檢查碼
JSONObject obj = new JSONObject(json_type);
AllInOne all = new AllInOne();
Hashtable<String, String> dict = new Hashtable<String, String>();
Iterator<String> iterator = obj.keys();
while (iterator.hasNext()) {
String key = (String) iterator.next();
String value = obj.getString(key);
dict.put(key, value);
}
if (all.compareCheckMacValue(dict)) {
//存入資料庫
}else{
//錯誤
}
```
### 紀錄
> 如果用AioCheckOutALL,可以在配置文件設定ignorePayment條件,會過略掉這些付款方式
```
protected static String[] ignorePayment = {"WebATM", "ATM", "CVS", "BARCODE", "GooglePay"};
```