Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
 /// <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;
     }
 }
Exemplo n.º 3
0
        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();
            }
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
        /// <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();
                }
            }
        }
Exemplo n.º 8
0
        /// <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;
        }
Exemplo n.º 9
0
        /// <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;
        }
Exemplo n.º 10
0
 /// <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();
         }
     }
 }