using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Text; using System.Data; using System.Runtime.InteropServices; using Newtonsoft.Json.Linq; using Cosmos.BaseFrame; using Cosmos.UserFrame; using Cosmos.ServiceProvider; using Cosmos.Common; using Cosmos.CommonManager; namespace Cosmos.OLEDevice { /// /// T-PAY BLE Dongle (paygle) /// class DeviceTPaygle : ITPaygleUs { #region ## XPayLib.dll Function /// /// 체크인 된 고객리스트를 수신 /// /// /// [DllImport("XPayLib.dll")] private static extern int GetPOSConnectList(byte[] connectList); /// /// 선택고객의 BLE OTB 발급요청(구버전 호환성문제로 유지) /// /// /// [DllImport("XPayLib.dll")] private static extern int ReqPOSProvide(byte[] XPT); /// /// 선택고객의 BLE OTB 발급요청/수신(폰의 OS별로 지원 가능) /// /// /// /// [DllImport("XPayLib.dll")] private static extern int ReqPOSProvide2(byte[] XPT, byte[] param); /// /// BLE OTB 수신 /// /// /// [DllImport("XPayLib.dll")] private static extern int GetOTB(byte[] KeyRlt); /// /// 수신된 비밀번호를 40Byte 해시코드로 변환 /// /// HashString 반환버퍼 /// 변환할 비밀번호 [DllImport("XPayLib.dll")] private static extern void PWHashing(byte[] Rlt, byte[] param); /// /// Paygle상태를 체크하고 업데이트가 필요한 경우 업데이트 /// /// [DllImport("PaygleCheck.dll")] private static extern int PaygleCheckProc(); //#20170906 T페이 고도화 작업 phj, start /// 수신된 OTB를 분류 검증 (결제방식, 사전인증 체크 기능) /// 입력된 OTB의 유효성과, 선인증여부를 확인합니다. /// /// 카드번호 [DllImport("XPayLib.dll")] private static extern int ClassifyOTB(byte[] ClassifyOTB); //#20170906 T페이 고도화 작업 phj, end #endregion private StateServer StateObject = (StateServer)StateServer.GetInstance(); // StateObject : StateServer Object (객체) private PosStatus posStatus = new PosStatus(); // 기본정보 참조 private DeviceStatus devStatus = new DeviceStatus(); // 장치정보 참조 /// /// 생성자 /// public DeviceTPaygle() { devStatus = (DeviceStatus)StateObject.DEVICE; posStatus = (PosStatus)StateObject.POS; } /// /// 체크인 고객리스트 수신 /// /// 고객리스트(JSON) /// 체크인된고객수 /// /// * Connect List (JSON Format) /// 1 DATETIME YYYYMMDDHHMMSS 결과수신시간/처리시간 /// 2 POSID string 요청POS 식별번호 /// 3 LIST JSONList 체크인 고객리스트 /// 3.1 XPT String 단말기 식별코드 (반복) /// 3.2 NAME String 단말기 등록이름 (반복) /// 3.3 NICKNAME String 단말기 등록 닉네임 (반복) /// 3.4 MDN String 단말기 전화번호 (반복) /// 3.5 DEVICE_TYPE String “001” : 안드로이드, “002” : 아이폰(iOS 적용 버전) /// /// * Sample /// { /// "DATETIME":"20160329144522", /// "POSID":"WHONEED010", /// "LIST":[ /// {"XPT":"********lVGOW48naN0mRPg==", "NAME":"**호", "NICK_NAME":"별명", "MDN":"01089**23**","DEVICE_TYPE":"001"} /// …(반복) /// ] /// } /// public int GetConnectList(out string phoneList) { phoneList = string.Empty; try { byte[] buffer = new byte[1024 * 2]; int ret = GetPOSConnectList(buffer); if (ret < 0) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll GetPOSConnectList Function Error (ErrorCode=" + ret.ToString() + ")"); } phoneList = Encoding.Default.GetString(buffer).Replace("\0", ""); return ret; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "Exception." + ex.Message); return -9; } } /// /// /// /// /// public int GetConnectList(out Column.TPAY_CONNECT_INFO phoneList) { phoneList = null; try { byte[] buffer = new byte[1024 * 2]; int ret = GetPOSConnectList(buffer); string result = Encoding.Default.GetString(buffer).Replace("\0", ""); if (ret < 0) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll GetPOSConnectList Function Error (ErrorCode=" + ret.ToString() + ")"); return ret; } phoneList = new Column.TPAY_CONNECT_INFO(); JObject json = JObject.Parse(result); phoneList.DATATIME = json["DATETIME"].ToString(); phoneList.POSID = json["POSID"].ToString(); JArray jArray = JArray.Parse(json["LIST"].ToString()); for (var i = 0; i < ret; i++) { JObject js = JObject.Parse(jArray[i].ToString()); Column.TPAY_PHONE phone = new Column.TPAY_PHONE(); phone.XPT = js["XPT"].ToString(); phone.NAME = js["NAME"].ToString(); phone.NICK_NAME = js["NICK_NAME"].ToString(); phone.MDN = js["MDN"].ToString(); phone.DEVICE_TYPE = js["DEVICE_TYPE"].ToString(); phoneList.LIST.Add(phone); } return ret; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "Exception." + ex.Message); phoneList = null; return -9; } } /// /// 선택된 XPT 단말기(스마트폰)에 BLE BOT 발급 요청 /// /// 결제키 발급대상 단말기 식별코드 /// 요청POS식별번호 /// 장비구분(001:안드로이드, 002:iOS) /// public bool ReqPosProvide(string xpt, string posID, string deviceType, out string errMsg) { errMsg = string.Empty; try { //byte[] param1 = Encoding.Default.GetBytes(xpt); //byte[] param2 = Encoding.Default.GetBytes(posID); //int ret = ReqPOSProvide(param1); string temp = JObject.FromObject(new { XPT = xpt, DEVICE_TYPE = deviceType }).ToString(); //string temp = "{" + string.Format("\"XPT\":\"{0}\",\"DEVICE_TYPE\":\"{1}\"", xpt, deviceType) + "}"; byte[] param1 = Encoding.Default.GetBytes(xpt); byte[] param2 = Encoding.Default.GetBytes(temp); int ret = ReqPOSProvide2(param1, param2); if (ret < 0) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll ReqPOSProvide2 Function Error (ErrorCode=" + ret.ToString() + ")"); } errMsg = ret == 0 ? string.Empty : "Error Code =" + ret.ToString(); return ret == 0 ? true : false; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "Exception." + ex.Message); errMsg = ex.Message; return false; } } /// /// BLE OTB 수신 /// /// 성공:OTB, 실패:오류메시지 /// /// 0:성공, -10001:Timeout, -10002:DeviceError public bool GetOTB(out string result) { result = string.Empty; try { byte[] buffer = new byte[1024]; int ret = GetOTB(buffer); switch(ret) { case 0: result = Encoding.Default.GetString(buffer).Replace("\0", "").Trim(); break; case -10001: result = "Timeout"; break; case -10002: result = "Device Error"; break; } if (ret != 0) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll GetOTB Function Error (ErrorCode=" + ret.ToString() + ", " + result + ")"); } return ret == 0 ? true : false; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "Exception." + ex.Message); result = ex.Message; return false; } } /// /// 수신된 비밀번호를 40Byte 해시코드로 변환 /// /// /// public string GetHashPassword(string password) { try { byte[] buffer = new byte[40]; byte[] pws = new byte[4]; pws = Encoding.Default.GetBytes(password); PWHashing(buffer, pws); return Encoding.Default.GetString(buffer).Replace("\0", ""); } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "Exception." + ex.Message); return string.Empty; } } /// /// /// /// public bool CheckPaygle() { try { int ret = PaygleCheckProc(); return ret == 0 ? true : false; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "Exception." + ex.Message); return false; } } //#20170906 T페이 고도화 작업 phj, start #region ## ClassifyOTBCheck 입력된 OTB의 유효성과, 선인증여부를 확인 public int ClassifyOTBCheck(string pOTB) { int ret = 0; try { byte[] GetOTB = Encoding.Default.GetBytes(pOTB); //입력된 OTB의 유효성과, 선인증여부를 확인 //10 : 구버전의 OTB로 제약 없음 //20 : 할인/결제 가능, 핀패드 입력 필요 //21 : 할인/결제 가능, 핀패드 입력 불필요 //30 : 결제만 가능, 핀패드 입력 필요 //31 : 결제만 가능, 핀패드 입력 불필요 ret = ClassifyOTB(GetOTB); UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll ClassifyOTB Function Result : " + ret.ToString() + ", (" + pOTB + ")"); return ret; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll ClassifyOTB Function Exception : " + ex.Message + ", Result : " + ret.ToString() + ", (" + pOTB + ")"); return ret; } } #endregion //#20170906 T페이 고도화 작업 phj, end //#20170906 T페이 고도화 작업 phj, start #region ## ClassifyOTBCheckMsg 메세지 public string ClassifyOTBCheckMsg(string pOTB) { string result = string.Empty; try { switch (pOTB) { case "0": result = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0729);//"유효하지 않은 OTB 입니다" break; case "10": result = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0730);//"구버전의 OTB 입니다" break; case "20": result = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0731);//"통합결제만 가능 합니다(결제비밀번호 필수)"; break; case "21": result = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0732);//"통합결제만 가능 합니다(결제비밀번호 불필요)"; break; case "30": result = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0733);//"일반결제만 가능 합니다(결제비밀번호 필수)"; break; case "31": result = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0734);//"일반결제만 가능 합니다(결제비밀번호 불필요)"; break; default: result = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0735);//"해당응답코드없음"; break; } UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll ClassifyOTB Function Msg : " + result + ", (" + pOTB + ")"); return result; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "XPayLib.dll ClassifyOTB Function Msg Exception : " + ex.Message + ", Result : " + result + ", (" + pOTB + ")"); return result; } } #endregion //#20170906 T페이 고도화 작업 phj, end } }