using Cebuana.Model; using Common.Models.RequestResponse; using Common.Models.Status; using Common.Models.TxnAmendModel; using Common.Models.TxnModel; using Common.TPService; using Common.Utility; using log4net; using Newtonsoft.Json; using System; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Cebuana.ApiService { public class CebuanaApi : ITPApiServices { private readonly ILog _log = LogManager.GetLogger(typeof(CebuanaApi)); protected string baseCPU_Url { get; set; } protected string baseRTA_Url { get; set; } protected string partnerCode { get; set; } protected string password { get; set; } protected string userid { get; set; } protected string baseCPU_Update_Url { get; set; } private const string PUSH_RTA_TXN = "/ProcessRTATransaction"; private const string PUSH_CPU_TXN = "/ws/PushRemittanceTransactionViaRest"; private const string CANCEL_CPU_TXN = "/UpdateRemittanceTransaction"; private const string AMEND_CPU_TXN = "/UpdateRemittanceTransaction"; private const string CPU_TRANSFER_STATUS = "/ws/LookUpRemittanceTransactionViaRest"; private const string RTA_TRANSFER_STATUS = "/InquireRTATransaction"; private const string RTA_GET_BANK_LIST = "/GetListOfBanks"; public CebuanaApi() { baseCPU_Url = GetStatic.ReadWebConfig("Cebuana_base_cpu_url", ""); baseRTA_Url = GetStatic.ReadWebConfig("Cebuana_base_rta_url", ""); partnerCode = GetStatic.ReadWebConfig("Cebuana_partner_Code", ""); password = GetStatic.ReadWebConfig("Cebuana_Password", ""); userid = GetStatic.ReadWebConfig("Cebuana_userid", ""); baseCPU_Update_Url = GetStatic.ReadWebConfig("Cebuana_base_cpu_update", ""); } public TPResponse GetTPResponse(T model, string MethodName) where T : class { switch (MethodName) { case "send": return SendTransaction(model as SendTransaction); case "status": return GetStatus(model as GetStatus); case "bankList": return GetBankList(model as TxnAgent); case "cancelSend": return CancelTransaction(model as CancelTxn); case "amendment": return AmendTransaction(model as AmendTransaction); default: throw new NotImplementedException(); } } private TPResponse SendTransaction(SendTransaction model) { TPResponse _response = new TPResponse() { ResponseCode = "1" }; try { string sendTxnURL = ""; string requestXml = ""; string apiType = ""; if (model.Transaction.PaymentType.ToLower().Contains("cash")) { sendTxnURL = $"{baseCPU_Url}{PUSH_CPU_TXN}"; apiType = "CPU"; requestXml = MapSendTransactionDataCPU(model, apiType); } else { sendTxnURL = $"{baseRTA_Url}{PUSH_RTA_TXN}"; apiType = "RTA"; TransactionRequestRTA requestTxn = MapTransactionRequestRTA(model); requestXml = JsonConvert.SerializeObject(requestTxn, Newtonsoft.Json.Formatting.None); } _log.Info($"{sendTxnURL}|REQUEST : {requestXml}"); HttpWebRequest httpWebRequest = WebRequest.Create(@sendTxnURL) as HttpWebRequest; byte[] data = Encoding.UTF8.GetBytes(requestXml); MemoryStream stm = new MemoryStream(data); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = apiType.Equals("CPU") ? "text/plain" : "text/json"; httpWebRequest.ContentLength = data.Length; Stream httpstream = httpWebRequest.GetRequestStream(); httpstream.Write(data, 0, data.Length); httpstream.Close(); HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse(); StreamReader reader = new StreamReader(resp.GetResponseStream()); String result = reader.ReadToEnd(); _log.Info($"{sendTxnURL}|RESPONSE : {result}"); if (apiType.Equals("CPU")) { var objResult = ParseXml(result); if (objResult.Code.Equals("00")) { _response.ResponseCode = "0"; } else { _response.Id = objResult.TransactionID; _response.Msg = objResult.Message; _response.Extra = objResult.Code; } } else { var objResult = JsonConvert.DeserializeObject(result.ToString()); if (objResult.Code.Equals("00")) { _response.ResponseCode = "0"; } else { _response.Id = objResult.ReferenceNumber; _response.Msg = objResult.Message; _response.Extra = objResult.Code; } } } catch (Exception ex) { _response.ResponseCode = "999"; _response.Msg = ex.ToString(); } return _response; } private string MapSendTransactionDataCPU(SendTransaction model, string type) { PushRemittanceRequest pushRemittance = new PushRemittanceRequest() { Amount = model.Transaction.PAmt.ToString(), BeneficiaryFirstName = model.Receiver.RFirstName, BeneficiaryLastName = $"{(!string.IsNullOrEmpty(model.Receiver.RMiddleName) ? $"{ model.Receiver.RMiddleName}{" "} " : "")}{model.Receiver.RLastName}", ControlNumber = model.Transaction.JMEControlNo, PartnerCode = partnerCode, PayoutCountry = model.Receiver.RCountry.ToString(), PayoutCurrency = model.Transaction.PCurr, SenderFirstName = $"{(!string.IsNullOrEmpty(model.Sender.SMiddleName) ? $"{ model.Sender.SMiddleName}{" "} " : "")}{model.Sender.SFirstName}", SenderLastName = model.Sender.SLastName1, SendingCountry = model.Sender.SCountryName, SendingCurrency = model.Transaction.CollCurr, Password = password, UserID = userid }; return XmlSerialize(pushRemittance); } private string MapStatusRequestData(GetStatus model, string type) { LookUpRemittanceRequest lookUpRemittanceRequest = new LookUpRemittanceRequest() { ControlNumber = model.ControlNo, PartnerCode = partnerCode, Password = password, UserID = userid }; return XmlSerialize(lookUpRemittanceRequest); } private TPResponse GetBankList(TxnAgent model) { // BankList bankResponse = new BankList(); TPResponse bankResponse = new TPResponse(); try { string url = ""; string requestXml = ""; url = $"{baseRTA_Url}{RTA_GET_BANK_LIST}"; requestXml = MapBankList(model); _log.Info($"{RTA_GET_BANK_LIST}|REQUEST : {requestXml}"); HttpWebRequest httpWebRequest = WebRequest.Create(@url) as HttpWebRequest; byte[] data = Encoding.UTF8.GetBytes(requestXml); MemoryStream stm = new MemoryStream(data); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/xml"; httpWebRequest.ContentLength = data.Length; Stream httpstream = httpWebRequest.GetRequestStream(); httpstream.Write(data, 0, data.Length); httpstream.Close(); HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse(); StreamReader reader = new StreamReader(resp.GetResponseStream()); String result = reader.ReadToEnd(); var objResult = ParseXml(result); if (objResult.BankCollection != null) { bankResponse.Data = objResult; } } catch (Exception ex) { bankResponse.ResponseCode = "999"; bankResponse.Msg = ex.Message; } return bankResponse; } private string MapBankList(TxnAgent model) { StringBuilder stringBuilder = new StringBuilder($@""); PartnerCredentials partner = new PartnerCredentials() { PartnerCode = partnerCode, UserID = userid, Password = password }; stringBuilder.Append(XmlSerialize(partner)); return stringBuilder.Append("").ToString(); } private TPResponse GetStatus(GetStatus model) { TPResponse _response = new TPResponse(); try { string url = ""; string requestXml = ""; string apiType = ""; if (model.PaymentMethod.ToLower().Contains("cash payment")) { url = $"{baseCPU_Url}{CPU_TRANSFER_STATUS}"; apiType = "CPU"; requestXml = MapStatusRequestData(model, apiType); } else { url = $"{baseRTA_Url}{RTA_TRANSFER_STATUS}"; apiType = "RTA"; RTAGetStatus requestStatus = MapRTAStatus(model); requestXml = JsonConvert.SerializeObject(requestStatus, Newtonsoft.Json.Formatting.None); } _log.Info($"{url} | REQUEST : {requestXml}"); HttpWebRequest httpWebRequest = WebRequest.Create(@url) as HttpWebRequest; byte[] data = Encoding.UTF8.GetBytes(requestXml); MemoryStream stm = new MemoryStream(data); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = apiType.Equals("CPU") ? "text/plain" : "text/json"; httpWebRequest.ContentLength = data.Length; Stream httpstream = httpWebRequest.GetRequestStream(); httpstream.Write(data, 0, data.Length); httpstream.Close(); HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse(); StreamReader reader = new StreamReader(resp.GetResponseStream()); String result = reader.ReadToEnd(); _log.Info($"{url} | RESPONSE : {result}"); string paidStatus = "UNPAID"; if (apiType.Equals("CPU")) { var objResult = ParseXml(result); _response.Data = objResult; _response.Extra2 = objResult.Code; if (objResult.Code.Equals("02")) //Paid { paidStatus = "PAID"; _response.Extra3 = objResult.PayoutDate; } if (objResult.Code.Equals("03")) //cancelld paidStatus = "CANCELLED"; _response.ResponseCode = paidStatus == "PAID" ? "0" : "1"; _response.Extra = paidStatus; _response.Msg = objResult.Message; } else { var objResult = JsonConvert.DeserializeObject(result.ToString()); _response.Data = objResult; _response.Extra2 = objResult.Code; if (objResult.Code.Equals("04")) //Paid paidStatus = "PAID"; _response.ResponseCode = paidStatus == "PAID" ? "0" : "1"; _response.Extra = paidStatus; _response.Msg = objResult.Message; } } catch (Exception ex) { _response.ResponseCode = "999"; _response.Msg = ex.ToString(); } return _response; } private static string XmlSerialize(T entity) where T : class { // removes version XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; XmlSerializer xsSubmit = new XmlSerializer(typeof(T)); using (StringWriter sw = new StringWriter()) using (XmlWriter writer = XmlWriter.Create(sw, settings)) { // removes namespace var xmlns = new XmlSerializerNamespaces(); xmlns.Add(string.Empty, string.Empty); xsSubmit.Serialize(writer, entity, xmlns); return sw.ToString(); // Your XML } } private static string ObjectToXML(object input) { try { StringWriter stringwriter = new StringWriter(); XmlSerializer serializer = new XmlSerializer(input.GetType()); serializer.Serialize(stringwriter, input); return stringwriter.ToString(); } catch (Exception ex) { if (ex.InnerException != null) ex = ex.InnerException; return "Could not convert: " + ex.Message; } } private T ParseXml(string value) where T : class { var xmlSerializer = new XmlSerializer(typeof(T)); using (var textReader = new StringReader(value)) { return (T)xmlSerializer.Deserialize(textReader); } } private TPResponse CancelTransaction(CancelTxn model) { TPResponse _response = new TPResponse() { ResponseCode = "1" }; try { string cancelTxnURL = ""; string requestXml = ""; cancelTxnURL = $"{baseCPU_Update_Url}{CANCEL_CPU_TXN}"; requestXml = MapCancelTransaction(model); _log.Info($"{cancelTxnURL}|REQUEST : {requestXml}"); HttpWebRequest httpWebRequest = WebRequest.Create(@cancelTxnURL) as HttpWebRequest; byte[] data = Encoding.UTF8.GetBytes(requestXml); MemoryStream stm = new MemoryStream(data); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/xml"; httpWebRequest.ContentLength = data.Length; Stream httpstream = httpWebRequest.GetRequestStream(); httpstream.Write(data, 0, data.Length); httpstream.Close(); HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse(); StreamReader reader = new StreamReader(resp.GetResponseStream()); String result = reader.ReadToEnd(); _log.Info($"{cancelTxnURL}|RESPONSE : {result}"); var objResult = ParseXml(result); if (objResult.Code.Equals("00")) { _response.ResponseCode = "0"; _response.Msg = "Transaction has been cancelled"; } else { _response.Msg = objResult.Message; _response.Extra = objResult.Code.ToString(); } } catch (Exception ex) { _response.ResponseCode = "999"; _response.Msg = ex.ToString(); } return _response; } private string MapCancelTransaction(CancelTxn model) { StringBuilder stringBuilder = new StringBuilder($@""); CancelTransaction cancelTransaction = new CancelTransaction() { PartnerCredentials = new PartnerCredentials() { PartnerCode = partnerCode, UserID = userid, Password = password }, TranDetail = new CancelTransaction.TransactionDetails() { ControlNumber = model.PartnerPinNo, Reason = model.CancelReason } //, __type= "AmendRemittanceRequest:#CebuanaRemittanceDirectUpdater" }; //return JsonConvert.SerializeObject(cancelTransaction, Newtonsoft.Json.Formatting.None); stringBuilder.Append(XmlSerialize(cancelTransaction.PartnerCredentials)); stringBuilder.Append(XmlSerialize(cancelTransaction.TranDetail)); return stringBuilder.Append("").ToString(); } private TransactionRequestRTA MapTransactionRequestRTA(SendTransaction model) { var r = new TransactionRequestRTA { BeneficiaryDetails = new TransactionRequestRTA.BeneficiaryDetailsData() { BeneficiaryAddress1 = model.Receiver.RAdd1.Trim(), BeneficiaryAddress2 = !string.IsNullOrEmpty(model.Receiver.RLocationName) ? model.Receiver.RLocationName : model.Receiver.RCountry, BeneficiaryCity = model.Receiver.RCity.Trim(), BeneficiaryFirstName = model.Receiver.RFirstName.Trim(), BeneficiaryLastName = model.Receiver.RLastName.Trim(), BeneficiaryMiddleName = model.Receiver.RMiddleName.Trim(), BeneficiaryMobile = model.Receiver.RMobile, BeneficiaryProvince = model.Receiver.RStateId, BeneficiaryRelationshipWithSender = model.Receiver.RelWithSenderName.Trim(), BeneficiaryZipcode = model.Receiver.RCityCode }, PartnerCredentials = new TransactionRequestRTA.PartnerCredentialsData() { PartnerCode = partnerCode, UserID = userid, Password = password }, RemitterDetails = new TransactionRequestRTA.RemitterDetailsData() { RemitterAddress1 = model.Sender.SAddress.Trim(), RemitterAddress2 = model.Sender.SNativeCountry.Trim(), RemitterCity = model.Sender.SCityId, RemitterCountry = model.Sender.SCountryName.Trim(), RemitterFirstName = model.Sender.SFirstName.Trim(), RemitterLastName = model.Sender.SLastName1.Trim(), RemitterMiddleName = model.Sender.SMiddleName.Trim(), RemitterProvince = model.Sender.SState.Trim(), RemitterZipcode = model.Sender.SZipCode }, TransactionDetails = new TransactionRequestRTA.TransactionDetailsData() { AccountNumber = model.Receiver.RAccountNo, Amount = String.Format("{0:0.00}", model.Transaction.PAmt), Currency = model.Transaction.PCurr, PurposeOfTransaction = model.Transaction.PurposeOfRemittanceName }, BankCode = model.Agent.PBankId, ReferenceNumber = model.Transaction.JMEControlNo, __type = "RTATransactionRequest:#CebuanaPushRTAWCFServices" }; return r; } private RTAGetStatus MapRTAStatus(GetStatus model) { var r = new RTAGetStatus { __type = "RTATransactionRequest:#CebuanaPushRTAWCFServices", PartnerCredentials = new PartnerCredentials() { PartnerCode = partnerCode, Password = password, UserID = userid }, ReferenceNumber = model.ControlNo }; return r; } private TPResponse AmendTransaction(AmendTransaction model) { TPResponse _response = new TPResponse() { ResponseCode = "1" }; try { string amendTxnURL = ""; string requestXml = ""; amendTxnURL = $"{baseCPU_Update_Url}{AMEND_CPU_TXN}"; requestXml = MapAmendTransaction(model); _log.Info($"{amendTxnURL}|REQUEST : {requestXml}"); HttpWebRequest httpWebRequest = WebRequest.Create(@amendTxnURL) as HttpWebRequest; byte[] data = Encoding.UTF8.GetBytes(requestXml); MemoryStream stm = new MemoryStream(data); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/xml"; httpWebRequest.ContentLength = data.Length; Stream httpstream = httpWebRequest.GetRequestStream(); httpstream.Write(data, 0, data.Length); httpstream.Close(); HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse(); StreamReader reader = new StreamReader(resp.GetResponseStream()); String result = reader.ReadToEnd(); _log.Info($"{amendTxnURL}|RESPONSE : {result}"); var objResult = ParseXml(result); if (objResult.Code.Equals("00")) { _response.ResponseCode = "0"; } else { // _response.Id = objResult.TransactionID; _response.Msg = objResult.Message.Replace("'", ""); _response.Extra = objResult.Code; } } catch (Exception ex) { _response.ResponseCode = "999"; _response.Msg = ex.Message; _log.Error(ex.ToString()); } return _response; } private string MapAmendTransaction(AmendTransaction model) { StringBuilder stringBuilder = new StringBuilder($@""); AmendTransactionPartner amend = new AmendTransactionPartner() { PartnerCredentials = new PartnerCredentials() { PartnerCode = partnerCode, UserID = userid, Password = password }, TranDetail = new AmendTransactionPartner.TransactionDetails() { ControlNumber = model.TfPinno, Reason = model.Reason }, BeneficiaryFirstName = $"{model.AmendReceiver.RFirstName.Trim()}{(!string.IsNullOrEmpty(model.AmendReceiver.RMiddleName) ? $"{" "}{ model.AmendReceiver.RMiddleName.Trim()}" : "")}", BeneficiaryLastName = model.AmendReceiver.RLastName }; stringBuilder.Append(XmlSerialize(amend.PartnerCredentials)); stringBuilder.Append(XmlSerialize(amend.TranDetail)); stringBuilder.Append($"{amend.BeneficiaryFirstName}"); stringBuilder.Append($"{amend.BeneficiaryLastName}"); return stringBuilder.Append("").ToString(); } } }