You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

591 lines
25 KiB

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>(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<PushRemittanceResult>(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<TransactionResult>(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<PushRemittanceRequest>(pushRemittance);
}
private string MapStatusRequestData(GetStatus model, string type)
{
LookUpRemittanceRequest lookUpRemittanceRequest = new LookUpRemittanceRequest()
{
ControlNumber = model.ControlNo,
PartnerCode = partnerCode,
Password = password,
UserID = userid
};
return XmlSerialize<LookUpRemittanceRequest>(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<GetListOfBanksResult>(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($@"<TransactionRequest xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/CebuanaPushRTAWCFServices"" i:type=""RTATransactionRequest"">");
PartnerCredentials partner = new PartnerCredentials()
{
PartnerCode = partnerCode,
UserID = userid,
Password = password
};
stringBuilder.Append(XmlSerialize<PartnerCredentials>(partner));
return stringBuilder.Append("</TransactionRequest>").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<LookUpRemittanceResult>(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<TransactionResult>(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>(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<T>(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<CancelTransaction.TransactionResult>(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($@"<TransactionRequest xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/CebuanaRemittanceDirectUpdater"" i:type=""CancelRemittanceRequest"" >");
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<PartnerCredentials>(cancelTransaction.PartnerCredentials));
stringBuilder.Append(XmlSerialize<CancelTransaction.TransactionDetails>(cancelTransaction.TranDetail));
return stringBuilder.Append("</TransactionRequest>").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<AmendTransactionPartner.TransactionResult>(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($@"<TransactionRequest xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/CebuanaRemittanceDirectUpdater"" i:type=""AmendRemittanceRequest"" >");
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<PartnerCredentials>(amend.PartnerCredentials));
stringBuilder.Append(XmlSerialize<AmendTransactionPartner.TransactionDetails>(amend.TranDetail));
stringBuilder.Append($"<BeneficiaryFirstName>{amend.BeneficiaryFirstName}</BeneficiaryFirstName>");
stringBuilder.Append($"<BeneficiaryLastName>{amend.BeneficiaryLastName}</BeneficiaryLastName>");
return stringBuilder.Append("</TransactionRequest>").ToString();
}
}
}