/// <summary> /// 比對並轉換Request和Response物件,請求和回應是同一組則out電文字串,不同out null /// </summary> /// <param name="request">RequestPOCO</param> /// <param name="response">ResponsePOCO</param> /// <param name="requestString">RequestString</param> /// <param name="responseString"></param> /// <returns>成功out出response字串/失敗out null</returns> private bool ParseResponseString(TOL_Soc_Req request, TOL_Soc_Req response, string requestString, out string responseString) { //if (request.COM_TYPE == response.COM_TYPE && // request.POS_SEQNO == response.POS_SEQNO && // request.STORE_NO == response.STORE_NO) if (!String.IsNullOrEmpty(response.SW)) { //依文件規格 iCash2@iBon_Format_20150826(內部使用).xlsx //Request部份資料混合Response資料(只改通訊種別,中心端回應碼) responseString = Response_Com_Type + //0~3 //Com_Type : 0642 requestString.Substring(4, 40) + //4~43 response.SW; //44~49 return true; } else { responseString = null; return false; } }
/// <summary> /// Send Reuqest POCO to Center AP and receive response POCO /// </summary> /// <param name="request">自動加值請求物件</param> /// <returns>自動加值回應物件</returns> private TOL_Soc_Req SendAndReceiveFromAP(TOL_Soc_Req request, string serviceName) { TOL_Soc_Req response = null; string requestStr = null; byte[] requestBytes = null; string responseString = null; byte[] responseBytes = null; string serverUri = null; string errMsg = null; NameValueCollection headers = null; //string fixedRequestStr = null; //string fixedresponseStr = null; //********************************* //取得連線後台的WebConfig設定資料 serverUri = ConfigGetter.GetValue(serviceName); log.Debug(m => { m.Invoke(serviceName + ":" + serverUri); }); if (serverUri == null) { log.Error("要連結的目的地設定資料不存在:" + serviceName); return null; } //********************************* try { //UTF8(JSON(POCO))=>byte array and send to AP requestStr = JsonConvert.SerializeObject(request); requestBytes = Encoding.UTF8.GetBytes(requestStr);//Center AP used UTF8 //fixedRequestStr = requestStr.Replace("{", "{{").Replace("}", "}}");//修正log4net的JSON轉換問題 //ref:http://chwilliamson.me.uk/article/CommonLoggingTraceListener-to-Log4Net-FormatException log.Debug(m => m("[鎖卡Txlog]開始送出Request : Uri({0}) data: {1}", serverUri, requestStr)); headers = new NameValueCollection(); headers.Add("Content-Type", "application/json");//因應後台WebAPI服務格式要求 // responseBytes = Client.GetResponse(serverUri, "POST", out errMsg, 10000, headers, requestBytes); if (responseBytes != null) { responseString = Encoding.UTF8.GetString(responseBytes); log.Debug(m => m("[鎖卡Txlog]Response JsonString: {0}", responseString)); response = JsonConvert.DeserializeObject<TOL_Soc_Req>(responseString); } else { log.Error(m => { m.Invoke("取得回應異常: {0}", errMsg); }); } } catch (Exception ex) { log.Error("[SendAndReceiveFromAP] Error:" + ex.Message + ex.StackTrace); } return response; }
/// <summary> /// 鎖卡Txlog請求電文字串轉自動加值Txlog請求物件(要傳給後端AP用的) /// </summary> /// <param name="request">自動加值Txlog請求電文字串(ASCII)</param> /// <returns>自動加值Txlog請求物件</returns> private TOL_Soc_Req ParseRequestString(string request) { TOL_Soc_Req toAPObject = null; //文件格式參考: iCash2@iBon_Format_20150826(內部使用).xlsx if (request.Length != TxlogLength) { log.Debug("[鎖卡Txlog]Request字串長度不符:" + request.Length); return null; } else if (!request.Substring(0, 4).Equals(Request_Com_Type)) { log.Debug("[鎖卡Txlog]Request通訊種別不符:" + request.Substring(0, 4)); return null; } try { toAPObject = new TOL_Soc_Req { COM_TYPE = request.Substring(0, 4), //0~3 //0631:通訊種別 CHANNEL_TYPE = request.Substring(4, 3), //4~6 //SET:通路別 STORE_NO = request.Substring(7, 8), //7~14 //01234567:店號 POS_REGNO = request.Substring(15, 3), //15~17 //011:POS機編號 POS_SEQNO = request.Substring(18, 8), //18~25 //12345678:Pos交易序號 CASHIER_NO = request.Substring(26, 4), //26~29 //0000:收銀員編號 DATE_TIME = request.Substring(30, 14), //30~43 //20150824165959:交易日期(yyyyMMddHHmmss) SW = request.Substring(44, 6), //44~49 //000000:中心端回應碼 TERMINAL_ID = request.Substring(50, 16), //50~55 //Terminal ID TxLog = request.Substring(66, 331) //66~396 //Txlog(包含Txlog的header + body:43 + 288 bytes) }; } catch (Exception ex) { log.Error("[鎖卡Txlog]轉換Request物件失敗:" + ex.Message + "\n " + ex.StackTrace); } return toAPObject; }