using System; using System.Collections.Generic; using System.Linq; using System.Text; using Cosmos.UserFrame; using Cosmos.Common; using System.Runtime.InteropServices; /*-----------------------------------------------------------------------------------------------*/ // 설 명 : CAT 단말기 제어 // 작 성 자 : // 변경 이력 : /*-----------------------------------------------------------------------------------------------*/ namespace Cosmos.OLEDevice { /// /// CAT 단말기 제어 CLASS /// public class DeviceCatTerminal : ICatTerminalUs { /// /// 단말기와 승인/취소 통신을 처리하는 함수 /// /// /// /// /// /// [DllImport("SPCNSecuCAT.dll")] public static extern int SPCNSecuCAT_Payment(int comport, int baud, byte[] input_msg, byte[] output_msg); /// /// 단말기에 저장된 미전송 내역을 받아오는 함수 /// /// /// /// /// [DllImport("SPCNSecuCAT.dll")] public static extern int SPCNSecuCAT_GetRemain(int comport, int baud, byte[] output_msg); /// /// 중국 - 샨더 단말기와 승인/취소 통신을 처리하는 함수 /// /// /// /// [DllImport("LibSand.dll")] public static extern void card_trans(int comport, byte[] input_msg, byte[] output_msg); /// /// 중국 - 은련 단말기와 승인/취소 통신을 처리하는 함수 /// /// /// /// [DllImport("posinf.dll")] public static extern int bankall(byte[] request, byte[] response); /// /// StateServer Object (StateServer 객체) /// public StateServer StateObject = (StateServer)StateServer.GetInstance(); /// /// Device 상태 정보 객체 /// public DeviceStatus m_cdevStatus = null; /// /// Pos 상태 정보 객체 /// public PosStatus m_cPosStatus = null; /// /// 생성자 /// public DeviceCatTerminal() { try { m_cPosStatus = (PosStatus)StateObject.POS; m_cdevStatus = (DeviceStatus)StateObject.DEVICE; } 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 (함수명)) ex.Message); } } #region 연결확인 /// /// 연결확인(가동시 체크) /// public bool SPCNSecuCatStatus() { bool bRet = false; string sSendData = string.Empty; string sRecvData = string.Empty; try { if (m_cPosStatus.Base.OlePosCATModel == PosConst.CAT_MODEL_DIV._KOR_SPCN) { sSendData = CmUtil.RPadH("Z0A0 000000000000000000000000000", 360); if (SPCNSecuCatApprove(sSendData, ref sRecvData) > 0) bRet = true; } else if (m_cPosStatus.Base.OlePosCATModel == PosConst.CAT_MODEL_DIV._CHN_SAND || m_cPosStatus.Base.OlePosCATModel == PosConst.CAT_MODEL_DIV._CHN_UNION) { // 중국산은 상태 체크 없어 패스 //if (SPCNSecuCatApprove(sSendData, ref sRecvData) >= 0) bRet = true; } } 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 (함수명)) ex.Message); } return bRet; } #endregion #region 연결 상태 확인 및 CAT 단말기 정보 확인 /// /// 연결 상태 및 CAT 단말기 정보 확인 /// public int SPCNSecuCatInfo(string sSendData, ref string sRecvData) { int nReturn = -99; try { nReturn = SPCNSecuCatApprove(sSendData, ref sRecvData); } 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 (함수명)) ex.Message); } return nReturn; } #endregion #region 승인/취소 요청 /// /// 승인/취소 요청 /// /// /// /// public int SPCNSecuCatApprove(string sSendData, ref string sRecvData) { int nReturn = -99; try { byte[] bytInputMsg = null; byte[] bytOutput = new byte[4096]; sRecvData = string.Empty; Array.Clear(bytOutput, 0, bytOutput.Length); bytInputMsg = Encoding.Default.GetBytes(sSendData); switch (m_cPosStatus.Base.OlePosCATModel) { case PosConst.CAT_MODEL_DIV._KOR_SPCN: { nReturn = SPCNSecuCAT_Payment(CmUtil.IntParse(m_cPosStatus.Base.OlePosCATSerialPortNumber.Replace("COM", "")), (int)m_cPosStatus.Base.OlePosCATSerialBaudRate, bytInputMsg, bytOutput); // 승인조회 if (nReturn < 0) //승인실퍠 { //실패경우 sRecvData = ErrCodeToMsg(nReturn); } else { sRecvData = ByteToString(bytOutput); } break; } case PosConst.CAT_MODEL_DIV._CHN_SAND: { // 중국 샨더 단말기 card_trans(CmUtil.IntParse(m_cPosStatus.Base.OlePosCATSerialPortNumber.Replace("COM", "")), bytInputMsg, bytOutput); // 승인조회 sRecvData = ByteToString(bytOutput); if (sRecvData.Length > 0) nReturn = 0; break; } case PosConst.CAT_MODEL_DIV._CHN_UNION: { // 중국 은련 단말기 bankall(bytInputMsg, bytOutput); // 승인조회 sRecvData = ByteToString(bytOutput); if (sRecvData.Length > 0) nReturn = 0; break; } } } 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 (함수명)) ex.Message); } return nReturn; } #endregion #region 승인/취소 요청 /// /// 단말기에 저장된 미전송 내역을 받아오는 함수 /// /// /// public int SPCNSecuCatRemain(ref string sRecvData) { int nReturn = -99; try { byte[] bytOutput = new byte[4096]; sRecvData = string.Empty; Array.Clear(bytOutput, 0, bytOutput.Length); nReturn = SPCNSecuCAT_GetRemain(CmUtil.IntParse(m_cPosStatus.Base.OlePosCATSerialPortNumber.Replace("COM", "")), (int)m_cPosStatus.Base.OlePosCATSerialBaudRate, bytOutput); if (nReturn < 0) //승인실퍠 { //실패경우 sRecvData = ErrCodeToMsg(nReturn); } else { sRecvData = ByteToString(bytOutput); } } 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 (함수명)) ex.Message); } return nReturn; } #endregion /// /// Byte배열을 string으로 변환 (Byte배열의 null(0x00)값 제거) /// /// /// private string ByteToString(byte[] data) { int inx = Array.FindIndex(data, 0, (x) => x == 0x0); if (inx >= 0) { return Encoding.Default.GetString(data, 0, inx); } else { return Encoding.Default.GetString(data); } } /// /// 응답코드 /// /// /// private string ErrCodeToMsg(int nErrCode) { string sMsg = string.Empty; try { switch (nErrCode) { case -101: sMsg = "시리얼포트번호오류"; break; case -102: sMsg = "통신속도오류"; break; case -103: sMsg = "전문길이오류"; break; case -210: sMsg = "할부개월오류"; break; case -211: sMsg = "금액봉사료세금오류"; break; case -212: sMsg = "원거래일자오류"; break; case -213: sMsg = "포인트거래구분오류"; break; case -301: sMsg = "거래중카드제거"; break; case -302: sMsg = "단말기 사용자 강제종료"; break; case -303: sMsg = "기타단말기오류"; break; case -304: sMsg = "카드삽입되어있음"; break; case -305: sMsg = "사용자강제취소"; break; case -401: sMsg = "시리얼포트오픈오류"; break; case -402: sMsg = "시리얼쓰기오류"; break; case -403: sMsg = "시리얼읽기오류"; break; case -404: sMsg = "시리얼닫기오류"; break; case -405: sMsg = "시리얼타임아웃"; break; case -411: sMsg = "미전송내역없음"; break; default: sMsg = "정의되어 있지 않은 메세지" + "[" + nErrCode + "]"; break; } } catch { } return sMsg; } } }