public void Handle(ClientRequestHandler handler) { try { AL2POS_Domain request = null; bool doMac = true; AL2POS_Domain response = null; byte[] responseArr = null; log.Debug(m => m("[State_AutoLoadQuery] {0} Request(ASCII):{1}", handler.ClientSocket.RemoteEndPoint.ToString(), ClientRequestHandler.asciiOctets2String(handler.Request))); //1.驗證Mac if (this.CheckMac(CheckMacContainer.ALQReqMsgUtility,handler.Request)) { //2.parse request request = this.ParseRequest(CheckMacContainer.ALQReqMsgUtility,handler.Request); //3.send to Back-End request and get response response = this.GetResponse(request); if (response == null) { //back-End Error response = new AL2POS_Domain() { AL2POS_SN = "99999999", AL2POS_RC = "990001" }; } } else { //MAC驗證失敗 doMac = false; response = new AL2POS_Domain() { AL2POS_SN = "99999999", AL2POS_RC = "990007" }; } //4. parse response byte array(create mac) responseArr = this.ParseResponse(CheckMacContainer.ALQRespMsgUtility,response, handler.Request, doMac); log.Info(m => m("Response(length:{0}):{1}", responseArr.Length, BitConverter.ToString(responseArr).Replace("-", ""))); int sendLength = handler.ClientSocket.Send(responseArr); if (sendLength != responseArr.Length) { log.Error(m => m("Response[length:{0}] not equal Actual Send Response[Length:{1}]", responseArr.Length, sendLength)); } } catch (SocketException sckEx) { log.Error(m => m("[State_AutoLoadQuery][Handle] Socket Error: {0} \r\n{1}", sckEx.Message, sckEx.StackTrace)); } catch (Exception ex) { log.Error(m => m("[State_AutoLoadQuery][Handle] Error: {0} \r\n{1}", ex.Message, ex.StackTrace)); } finally { handler.ServiceState = new State_Exit(); } }
/// <summary> /// 傳入卡號,去後台AP檢查有效性(port:6103) /// 000000:Pass/990001:後台錯誤/990003:黑名單/990012:非有效卡或非聯名卡或非正常卡 /// </summary> /// <param name="icc_No"></param> /// <param name="ip"></param> /// <param name="port"></param> /// <returns>Return Code(若傳輸異常回傳null)</returns> public string CheckCard(string icc_No,string ip,int port = 6103) { AL2POS_Domain queryObj = new AL2POS_Domain() { ICC_NO = icc_No, READER_ID = string.Empty, REG_ID = string.Empty, STORE_NO = string.Empty, AL_AMT = 0, }; string queryStr = JsonConvert.SerializeObject(queryObj); byte[] queryRequest = Encoding.UTF8.GetBytes(queryStr); byte[] queryResponse; using (SocketClient.Domain.SocketClient client = new SocketClient.Domain.SocketClient(ip,port)) { queryResponse = client.SendAndReceive(queryRequest); } if (queryResponse != null) { string responseStr = Encoding.UTF8.GetString(queryResponse); AL2POS_Domain response = JsonConvert.DeserializeObject<AL2POS_Domain>(responseStr); return response.AL2POS_RC; } else { return null; } }
public void Handle(ClientRequestHandler handler) { try { AL2POS_Domain request = null; bool doMac = true; AL2POS_Domain response = null; byte[] responseArr = null; log.Debug(m => m("[State_AutoLoadQuery] {0} Request(ASCII):{1}", handler.ClientSocket.RemoteEndPoint.ToString(), ClientRequestHandler.asciiOctets2String(handler.Request))); //1.驗證Mac if (this.CheckMac(CheckMacContainer.ALQReqMsgUtility, handler.Request)) { //2.parse request request = this.ParseRequest(CheckMacContainer.ALQReqMsgUtility, handler.Request); //3.send to Back-End request and get response response = this.GetResponse(request); if (response == null) { //back-End Error response = new AL2POS_Domain() { AL2POS_SN = "99999999", AL2POS_RC = "990001" }; } } else { //MAC驗證失敗 doMac = false; response = new AL2POS_Domain() { AL2POS_SN = "99999999", AL2POS_RC = "990007" }; } //4. parse response byte array(create mac) responseArr = this.ParseResponse(CheckMacContainer.ALQRespMsgUtility, response, handler.Request, doMac); log.Info(m => m("Response(length:{0}):{1}", responseArr.Length, BitConverter.ToString(responseArr).Replace("-", ""))); int sendLength = handler.ClientSocket.Send(responseArr); if (sendLength != responseArr.Length) { log.Error(m => m("Response[length:{0}] not equal Actual Send Response[Length:{1}]", responseArr.Length, sendLength)); } } catch (SocketException sckEx) { log.Error(m => m("[State_AutoLoadQuery][Handle] Socket Error: {0} \r\n{1}", sckEx.Message, sckEx.StackTrace)); } catch (Exception ex) { log.Error(m => m("[State_AutoLoadQuery][Handle] Error: {0} \r\n{1}", ex.Message, ex.StackTrace)); } finally { handler.ServiceState = new State_Exit(); } }
/// <summary> /// Response物件建立MAC並依據規格書轉轉換成byte[] /// </summary> /// <param name="msgUtility">Response Msg Parser</param> /// <param name="response">後端給的POCO</param> /// <param name="request">Origin Request byte array</param> /// <param name="doMAC">是否產生MAC:驗證失敗就不產了</param> /// <returns>response byte array</returns> protected virtual byte[] ParseResponse(IMsgUtility msgUtility, AL2POS_Domain response, byte[] request, bool doMAC = true) { log.Debug(m => m("7.轉換後台Response物件並建立MAC並轉成Response Byte[]")); byte[] rspResult = new byte[request.Length]; Buffer.BlockCopy(request, 0, rspResult, 0, request.Length);// // modify request to response msgUtility.SetStr("02", rspResult, "Communicate"); //return code msgUtility.SetStr(response.AL2POS_RC, rspResult, "ReturnCode"); //承認編號 msgUtility.SetStr(response.AL2POS_SN, rspResult, "CenterSeqNo"); //Answer msgUtility.SetBytes(this.cardFormatMemberId, rspResult, "CardFormatMemberId"); msgUtility.SetStr(this.cardNo, rspResult, "CardNo"); msgUtility.SetStr(this.cardExpireDate1, rspResult, "CardExpireDate1"); msgUtility.SetStr(this.cardExpireDate2, rspResult, "CardExpireDate2"); //交易時間 msgUtility.SetStr(this.transDateTime, rspResult, "TransDateTime"); //是否產生mac if (doMAC) { // fetch sha1 data this.SetMAC(msgUtility, rspResult, this.readerId, this.transDateTime);//CheckMacContainer.Mac2Manager.GetAuthMac(response.READER_ID, response.AL_TRANSTIME, sha1Result); } else { //若Mac驗證失敗,則使用來源mac簡易回傳 msgUtility.SetStr(this.mac, rspResult, "Mac"); } // padding data this.SetPadding(msgUtility, rspResult); return(rspResult); }
/// <summary> /// Request截取需要的資料轉成POCO /// </summary> /// <param name="msgBytes">Origin Request byte array</param> /// <param name="msgUtility">Request Msg Parser</param> /// <returns>POCO</returns> protected virtual AL2POS_Domain ParseRequest(IMsgUtility msgUtility, byte[] msgBytes) { log.Debug("3.開始轉換自動加值查詢Request物件"); AL2POS_Domain oLDomain = new AL2POS_Domain(); //ComType:0531 oLDomain.COM_TYPE = msgUtility.GetStr(msgBytes, "ReqType"); //端末Maker種別 oLDomain.POS_FLG = msgUtility.GetStr(msgBytes, "ReaderType"); //端末製造編號 oLDomain.READER_ID = this.readerId;//CheckMacContainer.AOLReqMsgUtility.GetStr(msgBytes, "ReaderId").Substring(0, 16); //客戶識別符號 ex:SET oLDomain.MERC_FLG = msgUtility.GetStr(msgBytes, "MercFlg"); oLDomain.STORE_NO = msgUtility.GetStr(msgBytes, "StoreNo"); oLDomain.REG_ID = msgUtility.GetStr(msgBytes, "RegId"); // modify StoreNo and RegId if ("SET".Equals(oLDomain.MERC_FLG)) { oLDomain.STORE_NO = oLDomain.STORE_NO.Substring(2, 6); oLDomain.REG_ID = oLDomain.REG_ID.Substring(1, 2); } // oLDomain.AL_AMT = 0; // oLDomain.ICC_NO = msgUtility.GetStr(msgBytes, "CardNo"); oLDomain.AL_TRANSTIME = this.transDateTime;//CheckMacContainer.AOLReqMsgUtility.GetStr(msgBytes, "TransDateTime"); log.Debug("4.結束轉換自動加值查詢Request物件"); return(oLDomain); }
/// <summary> /// Response物件建立MAC並依據規格書轉換成byte[] /// </summary> /// <param name="msgUtility">Response Msg Parser</param> /// <param name="response">後端給的POCO</param> /// <param name="request">Origin Request byte array</param> /// <param name="doMAC">是否產生MAC:驗證失敗就使用來源的mac</param> /// <returns>response byte array</returns> protected virtual byte[] ParseResponse(IMsgUtility msgUtility, AL2POS_Domain response, byte[] request, bool doMAC = true) { log.Debug(m => m("7.轉換後台Response物件並建立MAC並轉成Response Byte[]")); byte[] rspResult = new byte[request.Length]; string rrn = (" ").PadLeft(12); Buffer.BlockCopy(request, 0, rspResult, 0, request.Length);// // modify request to response msgUtility.SetStr("02", rspResult, "Communicate"); msgUtility.SetStr(response.AL2POS_RC, rspResult, "ReturnCode"); msgUtility.SetStr(response.AL2POS_SN, rspResult, "CenterSeqNo"); msgUtility.SetStr(this.amount, rspResult, "Amount"); if (!String.IsNullOrEmpty(response.AL_RRN)) { rrn = response.AL_RRN; } msgUtility.SetStr(rrn, rspResult, "Rrn"); msgUtility.SetStr(this.transDateTime, rspResult, "TransDateTime"); //是否產生mac if (doMAC) { // fetch sha1 data this.SetMAC(msgUtility, rspResult, this.readerId, this.transDateTime);//CheckMacContainer.Mac2Manager.GetAuthMac(response.READER_ID, response.AL_TRANSTIME, sha1Result); } else { //若Mac驗證失敗,則使用來源mac簡易回傳 msgUtility.SetStr(this.mac, rspResult, "Mac"); } // padding data this.SetPadding(msgUtility, rspResult); return(rspResult); }
/// <summary> /// 送到後台的request物件並取回response物件 /// </summary> /// <param name="request">request poco</param> /// <returns>response poco</returns> protected virtual AL2POS_Domain GetResponse(AL2POS_Domain request) { AL2POS_Domain result = null; SocketClient.Domain.SocketClient socketClient = null; try { System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); NewJsonWorker <AL2POS_Domain> jsonWorker = new NewJsonWorker <AL2POS_Domain>(); byte[] dataByte = jsonWorker.Serialize2Bytes(request); log.Debug(m => m("5.[AutoLoadQuery][Send] to Back-End Data: {0}", Encoding.ASCII.GetString(dataByte))); string[] setting = ConfigLoader.GetSetting(ConType.AutoLoadQuery).Split(':'); string ip = setting[0]; int port = Convert.ToInt32(setting[1]); int sendTimeout = Convert.ToInt32(setting[2]); int receiveTimeout = Convert.ToInt32(setting[3]); timer.Start(); socketClient = new SocketClient.Domain.SocketClient(ip, port, sendTimeout, receiveTimeout); if (socketClient.ConnectToServer()) { byte[] resultBytes = null; resultBytes = socketClient.SendAndReceive(dataByte); timer.Stop(); log.Debug(m => m("6.[AutoLoadQuery][Receive]Back-End Response(TimeSpend:{1}ms): {0}", Encoding.ASCII.GetString(resultBytes), timer.ElapsedMilliseconds)); result = jsonWorker.Deserialize(resultBytes); } return(result); } catch (SocketException sckEx) { log.Error("[GetResponse]Send Back-End Socket Error: " + sckEx.Message + " \r\n" + sckEx.StackTrace); return(null); } catch (Exception ex) { log.Error("[GetResponse]Send Back-End Error: " + ex.Message + " \r\n" + ex.StackTrace); return(null); } finally { if (socketClient != null) { socketClient.CloseConnection(); } } }
/// <summary> /// Response物件建立MAC並依據規格書轉轉換成byte[] /// </summary> /// <param name="msgUtility">Response Msg Parser</param> /// <param name="response">後端給的POCO</param> /// <param name="request">Origin Request byte array</param> /// <param name="doMAC">是否產生MAC:驗證失敗就不產了</param> /// <returns>response byte array</returns> protected virtual byte[] ParseResponse(IMsgUtility msgUtility, AL2POS_Domain response, byte[] request, bool doMAC = true) { log.Debug(m => m("7.轉換後台Response物件並建立MAC並轉成Response Byte[]")); byte[] rspResult = new byte[request.Length]; Buffer.BlockCopy(request, 0, rspResult, 0, request.Length);// // modify request to response msgUtility.SetStr("02", rspResult, "Communicate"); //return code msgUtility.SetStr(response.AL2POS_RC, rspResult, "ReturnCode"); //承認編號 msgUtility.SetStr(response.AL2POS_SN, rspResult, "CenterSeqNo"); //Answer msgUtility.SetBytes(this.cardFormatMemberId, rspResult, "CardFormatMemberId"); msgUtility.SetStr(this.cardNo, rspResult, "CardNo"); msgUtility.SetStr(this.cardExpireDate1, rspResult, "CardExpireDate1"); msgUtility.SetStr(this.cardExpireDate2, rspResult, "CardExpireDate2"); //交易時間 msgUtility.SetStr(this.transDateTime, rspResult, "TransDateTime"); //是否產生mac if (doMAC) { // fetch sha1 data this.SetMAC(msgUtility, rspResult, this.readerId, this.transDateTime);//CheckMacContainer.Mac2Manager.GetAuthMac(response.READER_ID, response.AL_TRANSTIME, sha1Result); } else { //若Mac驗證失敗,則使用來源mac簡易回傳 msgUtility.SetStr(this.mac, rspResult, "Mac"); } // padding data this.SetPadding(msgUtility, rspResult); return rspResult; }
/// <summary> /// Request截取需要的資料轉成POCO /// </summary> /// <param name="msgBytes">Origin Request byte array</param> /// <param name="msgUtility">Request Msg Parser</param> /// <returns>POCO</returns> protected virtual AL2POS_Domain ParseRequest(IMsgUtility msgUtility,byte[] msgBytes) { log.Debug("3.開始轉換自動加值查詢Request物件"); AL2POS_Domain oLDomain = new AL2POS_Domain(); //ComType:0531 oLDomain.COM_TYPE = msgUtility.GetStr(msgBytes, "ReqType"); //端末Maker種別 oLDomain.POS_FLG = msgUtility.GetStr(msgBytes, "ReaderType"); //端末製造編號 oLDomain.READER_ID = this.readerId;//CheckMacContainer.AOLReqMsgUtility.GetStr(msgBytes, "ReaderId").Substring(0, 16); //客戶識別符號 ex:SET oLDomain.MERC_FLG = msgUtility.GetStr(msgBytes, "MercFlg"); oLDomain.STORE_NO = msgUtility.GetStr(msgBytes, "StoreNo"); oLDomain.REG_ID = msgUtility.GetStr(msgBytes, "RegId"); // modify StoreNo and RegId if ("SET".Equals(oLDomain.MERC_FLG)) { oLDomain.STORE_NO = oLDomain.STORE_NO.Substring(2, 6); oLDomain.REG_ID = oLDomain.REG_ID.Substring(1, 2); } // oLDomain.AL_AMT = 0; // oLDomain.ICC_NO = msgUtility.GetStr(msgBytes, "CardNo"); oLDomain.AL_TRANSTIME = this.transDateTime;//CheckMacContainer.AOLReqMsgUtility.GetStr(msgBytes, "TransDateTime"); log.Debug("4.結束轉換自動加值查詢Request物件"); return oLDomain; }
/// <summary> /// 送到後台的request物件並取回response物件 /// </summary> /// <param name="request">request poco</param> /// <returns>response poco</returns> protected virtual AL2POS_Domain GetResponse(AL2POS_Domain request) { AL2POS_Domain result = null; SocketClient.Domain.SocketClient socketClient = null; try { System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); NewJsonWorker<AL2POS_Domain> jsonWorker = new NewJsonWorker<AL2POS_Domain>(); byte[] dataByte = jsonWorker.Serialize2Bytes(request); log.Debug(m => m("5.[AutoLoadQuery][Send] to Back-End Data: {0}", Encoding.ASCII.GetString(dataByte))); string[] setting = ConfigLoader.GetSetting(ConType.AutoLoadQuery).Split(':'); string ip = setting[0]; int port = Convert.ToInt32(setting[1]); int sendTimeout = Convert.ToInt32(setting[2]); int receiveTimeout = Convert.ToInt32(setting[3]); timer.Start(); socketClient = new SocketClient.Domain.SocketClient(ip, port, sendTimeout, receiveTimeout); if (socketClient.ConnectToServer()) { byte[] resultBytes = null; resultBytes = socketClient.SendAndReceive(dataByte); timer.Stop(); log.Debug(m => m("6.[AutoLoadQuery][Receive]Back-End Response(TimeSpend:{1}ms): {0}", Encoding.ASCII.GetString(resultBytes), timer.ElapsedMilliseconds)); result = jsonWorker.Deserialize(resultBytes); } return result; } catch (SocketException sckEx) { log.Error("[GetResponse]Send Back-End Socket Error: " + sckEx.Message + " \r\n" + sckEx.StackTrace); return null; } catch (Exception ex) { log.Error("[GetResponse]Send Back-End Error: " + ex.Message + " \r\n" + ex.StackTrace); return null; } finally { if (socketClient != null) { socketClient.CloseConnection(); } } }