using Common.Models.Donga; using Common.Models.RequestResponse; using Common.Models.Status; using Common.Models.TxnModel; using Common.TPService; using Common.Utility; using log4net; using System; using System.IO; using System.Net; namespace Donga.DongaAPIService { public class DongaAPI : ITPApiServices { private readonly ILog _log = LogManager.GetLogger(typeof(DongaAPI)); protected readonly string _baseUrl; protected readonly string _userName; protected readonly string _password; public DongaAPI() { _baseUrl = GetStatic.ReadWebConfig("donga_base_url", ""); _userName = GetStatic.ReadWebConfig("donga_user_name", ""); _password = GetStatic.ReadWebConfig("donga_password", ""); } public TPResponse GetTPResponse(T model, string MethodName) where T : class { switch (MethodName) { case "send": return SendTransaction(model as SendTransaction); case "status": return GetStatusDonga(model as GetStatus); default: return new TPResponse() { ResponseCode = "1", Msg = "Method Name Not Found !" }; } } private TPResponse SendTransaction(SendTransaction sendTransaction) { _log.DebugFormat("SendTransaction Method Is Calling On DongaAPI ,Model :", sendTransaction); TPResponse _response = new TPResponse(); var _requestData = GetRequestData(sendTransaction); _log.Debug("Donga Request Data :" + _requestData); _response = GetAPIKey(sendTransaction); _log.Debug("Donga API Key Response: " + GetStatic.ConvertToJson(_response)); if (_response.ResponseCode == "0" && _response.Extra.Trim().Length.Equals(32)) { return SendDongaTransaction(_requestData, _response.Extra); } else { return new TPResponse() { ResponseCode = "1", Msg = "Error while generating token: "+_response.Extra }; } } private TPResponse SendDongaTransaction(string _requestData, string _apiKey) { TPResponse _response = new TPResponse(); try { HttpWebRequest _httpRequest = (HttpWebRequest)WebRequest.Create(_baseUrl + "api/transaction/detaildata/post/" + _userName + "/" + _password + "/" + _apiKey); _httpRequest.ContentType = "application/json"; _httpRequest.Method = "POST"; using (var _streamWriter = new StreamWriter(_httpRequest.GetRequestStream())) { _streamWriter.Write(_requestData); _streamWriter.Flush(); _streamWriter.Close(); } var _httpResponse = (HttpWebResponse)_httpRequest.GetResponse(); using (var _streamReader = new StreamReader(_httpResponse.GetResponseStream())) { _response.Extra = _streamReader.ReadToEnd().ToString(); } _httpResponse.Close(); _response = MapResult(_response.Extra); _log.DebugFormat("SendDongaTransaction Response At DongaAPI : Response ", _response); } catch (Exception ex) { _response.ResponseCode = "999"; _response.Msg = ex.Message; } return _response; } private TPResponse GetStatusDonga(GetStatus getStatus) { _log.DebugFormat("GetStatusDonga Method Is Colling On DongaAPI , Model :", getStatus); TPResponse _response = new TPResponse(); DongaStatusSyncResponse _syncStatusResponse = new DongaStatusSyncResponse(); try { HttpWebRequest _httpRequest = (HttpWebRequest)WebRequest.Create(_baseUrl + "api/responsetran/" + _userName + "/" + _password + "/" + getStatus.ControlNo); _httpRequest.ContentType = "application/json"; _httpRequest.Method = "GET"; var _httpResponse = (HttpWebResponse)_httpRequest.GetResponse(); using (var _streamReader = new StreamReader(_httpResponse.GetResponseStream())) { string a = _streamReader.ReadToEnd().Replace("[", "").Replace("]", "").ToString(); _syncStatusResponse = GetStatic.ConvertToObject(a); } _response.ResponseCode = "0"; _response.Msg = "Success"; _response.Id = _syncStatusResponse.TransactionID; _response.Extra = _syncStatusResponse.PartnerID; if (_syncStatusResponse.Status != null) _response.Extra2 = _syncStatusResponse.Status.ToLower().Trim(); _httpResponse.Close(); _log.DebugFormat("GetStatusDonga Response At DongaAPI , Response :", _response); } catch (Exception ex) { _response.ResponseCode = "999"; _response.Msg = ex.Message.ToString(); } return _response; } #region other methods private TPResponse GetAPIKey(SendTransaction sendTransaction) { TPResponse _response = new TPResponse(); var _contentData = new { SumTransaction = 1, SumAUD = (sendTransaction.Transaction.PCurr.ToLower().Equals("aud")) ? Convert.ToDecimal(sendTransaction.Transaction.PAmt) : 0, SumCAD = (sendTransaction.Transaction.PCurr.ToLower().Equals("cad")) ? Convert.ToDecimal(sendTransaction.Transaction.PAmt) : 0, SumEUR = (sendTransaction.Transaction.PCurr.ToLower().Equals("eur")) ? Convert.ToDecimal(sendTransaction.Transaction.PAmt) : 0, SumGBP = (sendTransaction.Transaction.PCurr.ToLower().Equals("gbp")) ? Convert.ToDecimal(sendTransaction.Transaction.PAmt) : 0, SumJPY = (sendTransaction.Transaction.PCurr.ToLower().Equals("jpy")) ? Convert.ToDecimal(sendTransaction.Transaction.PAmt) : 0, SumUSD = (sendTransaction.Transaction.PCurr.ToLower().Equals("usd")) ? Convert.ToDecimal(sendTransaction.Transaction.PAmt) : 0, SumVND = (sendTransaction.Transaction.PCurr.ToLower().Equals("vnd")) ? Convert.ToDecimal(sendTransaction.Transaction.PAmt) : 0 }; string _jsonData = GetStatic.ConvertToJson(_contentData); _log.Debug(_jsonData + "; URL: " + _baseUrl + "api/transaction/masterdata/post/" + _userName + "/" + _password + "/" + sendTransaction.SessionId); try { HttpWebRequest _httpRequest = (HttpWebRequest)WebRequest.Create(_baseUrl + "api/transaction/masterdata/post/" + _userName + "/" + _password + "/" + sendTransaction.SessionId); _httpRequest.ContentType = "application/json"; _httpRequest.Method = "POST"; using (var _streamWriter = new StreamWriter(_httpRequest.GetRequestStream())) { _streamWriter.Write(_jsonData); _streamWriter.Flush(); _streamWriter.Close(); } var _httpResponse = (HttpWebResponse)_httpRequest.GetResponse(); using (var _streamReader = new StreamReader(_httpResponse.GetResponseStream())) { _response.ResponseCode = "0"; _response.Extra = _streamReader.ReadToEnd().ToString(); } _httpResponse.Close(); } catch (Exception e) { _response.ResponseCode = "999"; _response.Msg = e.Message.ToString(); } if (!string.IsNullOrEmpty(_response.Msg) && _response.Msg.Trim().Length.Equals(32)) { _log.ErrorFormat("Error Occured On SendTransaction At DongaAPI Error :", _response); _response.SetResponse("1", "Invalid Api Key OR Api Key Generation Error!", null); } return _response; } private string GetRequestData(SendTransaction _requestData) { return "[{\"TransactionID\":\"" + _requestData.Transaction.JMEControlNo + "\",\"Sender\":\"" + _requestData.Sender.SFullName + "\",\"Receiver\":\"" + _requestData.Receiver.RFullName + "\"," + "\"Address\":\"" + _requestData.Receiver.RAdd1 + "\",\"CityCode\":\"" + _requestData.Receiver.RStateId + "\",\"DistrictCode\":\"" + _requestData.Receiver.RCityCode + "\"," + "\"Amount\":" + _requestData.Transaction.PAmt + ",\"RCurrency\":\"" + _requestData.Transaction.PCurr + "\",\"SCurrency\":\"" + _requestData.Transaction.PCurr + "\"," + "\"PaymentMode\":\"" + GetPayoutMode(_requestData.Transaction.PaymentType) + "\",\"Phone\":\"" + _requestData.Receiver.RMobile + "\",\"BankAccount\":\"" + _requestData.Receiver.RAccountNo + "\"," + "\"BankCode\":\"" + _requestData.Agent.PBankId + "\",\"BranchState\":\"" + _requestData.Agent.PBranchCity + "\",\"Note\":\"" + _requestData.Transaction.PayoutMsg + "\"}]"; } private TPResponse MapResult(string result) { TPResponse _response = new TPResponse(); try { _response.ResponseCode = result.Substring(0, 1); _response.Msg = result.Replace(result.Substring(0, 1), "").Trim(); } catch (Exception ex) { _response.ResponseCode = "999"; _response.Msg = "Error Parsing the msg! Error :" + ex.Message; } _response.Data = result; return _response; } private string GetPayoutMode(string paymentType) { if (paymentType.ToLower().Equals("cash payment")) return "CP"; else if (paymentType.ToLower().Equals("home delivery")) return "HD"; else if (paymentType.ToLower().Equals("bank deposit")) return "TA"; return ""; } #endregion other methods } }