Ejemplo n.º 1
0
        /// <summary>
        /// 請求授權(自動加值/代行)
        /// </summary>
        /// <param name="requestToBank">請求授權物件</param>
        /// <returns>請求授權電文</returns>
        private string ConvertALOL(AutoloadRqt_2Bank requestToBank)
        {
            try
            {
                Console.WriteLine("開始轉換要求授權物件");
                //Message Header
                string fromTo = "8888" + requestToBank.BANK_CODE.PadLeft(4, '0');//8888表示愛金卡機構代號
                //initial BitMap List
                string[] srcList = new string[129];
                for (int i = 0; i < srcList.Length; i++)
                {
                    srcList[i] = "";
                }
                srcList[2]  = requestToBank.ICC_NO;          //"0417149984000007"//"0000000000000000";
                srcList[3]  = requestToBank.PROCESSING_CODE; //"990174"//"990174";
                srcList[4]  = requestToBank.AMOUNT;          //"000000000500"//"000000000055";
                srcList[7]  = requestToBank.TRANS_DATETIME;  //"0115135959"//"0128180006";
                srcList[11] = requestToBank.STAN;            //"005009"//"666666";
                srcList[32] = requestToBank.STORE_NO;        //"st00896159"// "st00000001";
                srcList[37] = requestToBank.RRN;             //"501513005009"//"502818666666";
                srcList[41] = requestToBank.POS_NO;          //"00000001"//"00000001";
                srcList[42] = requestToBank.MERCHANT_NO;     //"000000022555003"//"000000022555003";

                //init Field 61
                string[] srcListDf61 = new string[65];
                for (int i = 0; i < srcListDf61.Length; i++)
                {
                    srcListDf61[i] = "";
                }
                srcListDf61[3]  = requestToBank.ICC_info.STORE_NO;    // 8碼
                srcListDf61[4]  = requestToBank.ICC_info.REG_ID;      // 3碼
                srcListDf61[8]  = requestToBank.ICC_info.TX_DATETIME; //14碼
                srcListDf61[10] = requestToBank.ICC_info.ICC_NO;      //16碼
                srcListDf61[11] = requestToBank.ICC_info.AMT;         // 8碼,"00000000"//"00000000";
                srcListDf61[35] = requestToBank.ICC_info.NECM_ID;     //20碼
                MsgContext msgContextDf61 = df61MsgWorker.Build(null, null, srcListDf61);

                srcList[61] = msgContextDf61.SrcMessage;            //16碼"808000000000000000000000" //"008000000000000000000000";
                //"0120" + "0115135959" + "005002" + "00896159" + "501513005002" + "  ";
                //"0100" + "0128183005" + "555555" + "00000001" + "502818666666" + "  ";

                MsgContext msgResult = mainMsgWorker.Build(fromTo, requestToBank.MESSAGE_TYPE, srcList);//"88880000","0420"
                Console.WriteLine("轉換後的銀行訊息(Length:" + msgResult.SrcMessage.Length + "): " + msgResult.SrcMessage);
                return(msgResult.SrcMessage);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 要求物件轉換要求電文(授權/代行授權/沖正授權)
        /// </summary>
        /// <param name="messageType">要求格式(0100/0120/0121|0420/0421)</param>
        /// <param name="requestToBank">要求(授權/代行授權/沖正授權)物件</param>
        /// <returns>Response to Bank電文</returns>
        public string GetRequestMsg(string messageType, AutoloadRqt_2Bank requestToBank)
        {
            try
            {
                switch (messageType)
                {
                case "0100":
                case "0120":
                case "0121":
                    return(ConvertALOL(requestToBank));

                case "0420":
                case "0421":
                    return(ConvertRALOL(requestToBank));

                default:
                    throw new Exception("[GetRequestMsg] Message Type not defined:" + messageType);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Ejemplo n.º 3
0
        public void RunBatch()
        {
            byte[] receiveBytes = null;
            SocketClient.Domain.SocketClient bankAgent = null;
            AutoloadRqt_2Bank requestToBank            = null;
            AutoloadRqt_2Bank responseFormBank         = null;
            //建立DB模組
            AL_DBModule obDB = new AL_DBModule();
            //交易log模組
            LogModual logM = new LogModual();

            try
            {
                //初始化DicBankAgents集合
                this.InitBankAgentSetting();

                //開啟連線
                obDB.OpenConnection();
                //--------------------------------------------------------------------------------------------
                //從字典取出每個要傳批次的電文類型
                foreach (BankAgent item in this.DicBankAgents.Keys)
                {
                    log.Debug("開始檢查" + item.BankCode + "銀行的狀態與MQ存放的" + item.MessageType + "資料");

                    #region 1.當銀行狀態是連線的且MQ有傳資料(Ex:0120類型)回來(放在工作Queue)
                    while (this.DicBanks[item.BankCode].STATUS == "0" && this.DicBankAgents[item].synTopicSubscriber.Process())
                    {
                        if (this.waitForWork.Count == 0)
                        {
                            log.Error("待辦工作Queue[waitForWork]內無資料");
                            break;
                        }
                        DateTime dtrqt = DateTime.Now;
                        DateTime dtrsp = DateTime.Now;
                        string   requestToBankJsonStr = this.waitForWork.Dequeue();//取得要傳送的字串
                        try
                        {
                            using (bankAgent = new SocketClient.Domain.SocketClient(item.IP, item.Port, item.SendTimeout, item.ReceiveTimeout))
                            {
                                if (bankAgent.ConnectToServer())
                                {
                                    log.Debug("送到" + item.IP + ":" + item.Port + "的資料: " + requestToBankJsonStr);
                                    byte[] sendJsonBytes = Encoding.UTF8.GetBytes(requestToBankJsonStr);
                                    receiveBytes = bankAgent.SendAndReceive(sendJsonBytes);//送出資料並取得回應資料
                                    if (receiveBytes == null)
                                    {
                                        log.Debug("接收資料為null,開始將資料加入異常Queue");
                                        //要用Regex來比對嗎  Performance不知好不好//MESSAGE_TYPE:XXX0 --> XXX1
                                        if (Regex.IsMatch(requestToBankJsonStr, "^{\"MESSAGE_TYPE\":\"[0-9]{3}0"))
                                        {
                                            string repeatRequest = Regex.Replace(requestToBankJsonStr, "^{\"MESSAGE_TYPE\":\"[0-9]{3}0",
                                                                                 delegate(Match match)
                                            {
                                                string result = match.Value.Substring(0, match.Value.Length - 1) + "1";    //xxx0 --> xxx1
                                                return(result);
                                            });
                                            log.Debug("送出失敗: 修改MESSAGE_TYPE後的JSON =>" + repeatRequest);
                                            //轉型回物件改MESSAGE_TYPE屬性內的值
                                            //AutoloadRqt_2Bank tmp = JsonConvert.DeserializeObject<AutoloadRqt_2Bank>(requestToBankJsonStr);
                                            //tmp.MESSAGE_TYPE = tmp.MESSAGE_TYPE.Substring(0, 3) + "1";//
                                            //string sendFailRequest = JsonConvert.SerializeObject(tmp);
                                            this.failed.Enqueue(repeatRequest);
                                        }
                                        else
                                        {
                                            //MESSAGE_TYPE:XXX1//格式已是重送的SPEC
                                            this.failed.Enqueue(requestToBankJsonStr);//加入異常列表
                                        }
                                        continue;
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            log.Error("連線BankAgent異常:" + ex.StackTrace);
                            log.Error("連線異常,開始將資料加入異常Queue");
                            //只修改第一層message_type的data,第二層message_type的data不動(因為第二層為原始交易資訊)
                            string repeatRequest = Regex.Replace(requestToBankJsonStr, "^{\"MESSAGE_TYPE\":\"[0-9]{3}0",
                                                                 delegate(Match match)
                            {
                                string result = match.Value.Substring(0, match.Value.Length - 1) + "1";
                                return(result);
                            });
                            log.Debug("[Exception]: 修改MESSAGE_TYPE後的JSON =>" + repeatRequest);
                            this.failed.Enqueue(repeatRequest);//加入異常列表
                            continue;
                        }
                        finally
                        {
                            //寫送出的Tans Log
                            //轉型
                            requestToBank = JsonConvert.DeserializeObject <AutoloadRqt_2Bank>(requestToBankJsonStr);
                            dtrsp         = DateTime.Now;
                            //給銀行需要12碼,給DB紀錄只能8碼,故金額切掉多餘的碼(剩8碼)
                            requestToBank.AMOUNT = (requestToBank.AMOUNT.Length > 8) ? requestToBank.AMOUNT.Substring(requestToBank.AMOUNT.Length - 8, 8) : requestToBank.AMOUNT;
                            //記錄此次交易
                            log.Debug("[紀錄]給銀行的JSON:" + requestToBankJsonStr);
                            log.Debug("開始寫入Log傳給銀行的Request物件(類型:" + requestToBank.MESSAGE_TYPE + ")");
                            logM.SaveTransLog2Bank(requestToBank, obDB, dtrqt, dtrsp);
                        }
                        //回傳訊息不為空
                        if (receiveBytes != null)
                        {
                            try
                            {
                                //寫接收的Tans Log
                                //轉型
                                string responseFormBankJsonStr = Encoding.UTF8.GetString(receiveBytes);
                                responseFormBank = JsonConvert.DeserializeObject <AutoloadRqt_2Bank>(responseFormBankJsonStr);
                                //記錄此次交易
                                log.Debug("[紀錄]銀行回來的的JSON:" + responseFormBankJsonStr);
                                log.Debug("開始寫入Log銀行回傳的Response物件(類型:" + responseFormBank.MESSAGE_TYPE + ")");
                                //因為銀行回傳無Field 61,所以從給銀行的POCO取
                                responseFormBank.ICC_info = requestToBank.ICC_info;
                                //截掉銀行的代碼(DB只能3碼)-DB可以容許5碼_2015-04-28
                                //rspFromBank.BANK_CODE = rspFromBank.BANK_CODE.Substring((rspFromBank.BANK_CODE.Length - 3), 3);
                                //銀行回應的有12碼,給DB紀錄只能8碼,故金額切掉多餘的碼(剩8碼)
                                responseFormBank.AMOUNT = (responseFormBank.AMOUNT.Length > 8) ? responseFormBank.AMOUNT.Substring(responseFormBank.AMOUNT.Length - 8, 8) : responseFormBank.AMOUNT;
                                dtrsp = DateTime.Now;
                                logM.SaveTransLog2Bank(responseFormBank, obDB, dtrqt, dtrsp);
                            }
                            catch (Exception ex2)
                            {
                                logM.SaveErrorLog(obDB, this.GetType().Name + ex2.Message, "BatchAP");
                                log.Error("[BatchAP][RunBatch] Save Bank Trans Log Failed: " + ex2.StackTrace);
                            }
                        }
                        bankAgent = null;
                    }
                    #endregion

                    #region 2.將異常列表的資料塞回MQ
                    log.Debug("2.開始將異常列表的資料塞回MQ=>筆數:" + this.failed.Count);
                    this.DicBankAgents[item].topicPublisher.Start();
                    int count = 1;
                    while (this.failed.Count > 0)
                    {
                        //從異常Queue取出送到銀行端失敗的Json String
                        string backToMQJsonStr = this.failed.Dequeue();
                        log.Debug("開始發佈第 " + (count++) + " 筆發送失敗的POCO到MQ: " + backToMQJsonStr);
                        //發佈回MQ
                        this.DicBankAgents[item].topicPublisher.SendMessage <string>(backToMQJsonStr);
                    }
                    #endregion

                    #region 3.清空Queue
                    log.Debug("開始檢查並清空" + item.MessageType + "格式的暫存Queue");
                    if (this.waitForWork.Count > 0 || this.failed.Count > 0)
                    {
                        log.Debug("見鬼了...(類型:" + item.MessageType + ")Queue還有東西:\n waitForWork:" + this.waitForWork.Count + "  \nfailed:" + this.failed.Count);
                    }

                    this.waitForWork.Clear();
                    this.failed.Clear();
                    #endregion
                }
            }
            catch (Exception ex)
            {
                log.Error("[BatchAP][RunBatch] Error:" + ex.StackTrace);
            }
            finally
            {
                receiveBytes     = null;
                requestToBank    = null;
                responseFormBank = null;
                obDB.CloseConnection();
            }
        }