# 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"}; ```