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

  1. using Cebuana.Model;
  2. using Common.Models.RequestResponse;
  3. using Common.Models.Status;
  4. using Common.Models.TxnAmendModel;
  5. using Common.Models.TxnModel;
  6. using Common.TPService;
  7. using Common.Utility;
  8. using log4net;
  9. using Newtonsoft.Json;
  10. using System;
  11. using System.IO;
  12. using System.Net;
  13. using System.Text;
  14. using System.Xml;
  15. using System.Xml.Serialization;
  16. namespace Cebuana.ApiService
  17. {
  18. public class CebuanaApi : ITPApiServices
  19. {
  20. private readonly ILog _log = LogManager.GetLogger(typeof(CebuanaApi));
  21. protected string baseCPU_Url { get; set; }
  22. protected string baseRTA_Url { get; set; }
  23. protected string partnerCode { get; set; }
  24. protected string password { get; set; }
  25. protected string userid { get; set; }
  26. protected string baseCPU_Update_Url { get; set; }
  27. private const string PUSH_RTA_TXN = "/ProcessRTATransaction";
  28. private const string PUSH_CPU_TXN = "/ws/PushRemittanceTransactionViaRest";
  29. private const string CANCEL_CPU_TXN = "/UpdateRemittanceTransaction";
  30. private const string AMEND_CPU_TXN = "/UpdateRemittanceTransaction";
  31. private const string CPU_TRANSFER_STATUS = "/ws/LookUpRemittanceTransactionViaRest";
  32. private const string RTA_TRANSFER_STATUS = "/InquireRTATransaction";
  33. private const string RTA_GET_BANK_LIST = "/GetListOfBanks";
  34. public CebuanaApi()
  35. {
  36. baseCPU_Url = GetStatic.ReadWebConfig("Cebuana_base_cpu_url", "");
  37. baseRTA_Url = GetStatic.ReadWebConfig("Cebuana_base_rta_url", "");
  38. partnerCode = GetStatic.ReadWebConfig("Cebuana_partner_Code", "");
  39. password = GetStatic.ReadWebConfig("Cebuana_Password", "");
  40. userid = GetStatic.ReadWebConfig("Cebuana_userid", "");
  41. baseCPU_Update_Url = GetStatic.ReadWebConfig("Cebuana_base_cpu_update", "");
  42. }
  43. public TPResponse GetTPResponse<T>(T model, string MethodName) where T : class
  44. {
  45. switch (MethodName)
  46. {
  47. case "send":
  48. return SendTransaction(model as SendTransaction);
  49. case "status":
  50. return GetStatus(model as GetStatus);
  51. case "bankList":
  52. return GetBankList(model as TxnAgent);
  53. case "cancelSend":
  54. return CancelTransaction(model as CancelTxn);
  55. case "amendment":
  56. return AmendTransaction(model as AmendTransaction);
  57. default:
  58. throw new NotImplementedException();
  59. }
  60. }
  61. private TPResponse SendTransaction(SendTransaction model)
  62. {
  63. TPResponse _response = new TPResponse() { ResponseCode = "1" };
  64. try
  65. {
  66. string sendTxnURL = "";
  67. string requestXml = "";
  68. string apiType = "";
  69. if (model.Transaction.PaymentType.ToLower().Contains("cash"))
  70. {
  71. sendTxnURL = $"{baseCPU_Url}{PUSH_CPU_TXN}";
  72. apiType = "CPU";
  73. requestXml = MapSendTransactionDataCPU(model, apiType);
  74. }
  75. else
  76. {
  77. sendTxnURL = $"{baseRTA_Url}{PUSH_RTA_TXN}";
  78. apiType = "RTA";
  79. TransactionRequestRTA requestTxn = MapTransactionRequestRTA(model);
  80. requestXml = JsonConvert.SerializeObject(requestTxn, Newtonsoft.Json.Formatting.None);
  81. }
  82. _log.Info($"{sendTxnURL}|REQUEST : {requestXml}");
  83. HttpWebRequest httpWebRequest = WebRequest.Create(@sendTxnURL) as HttpWebRequest;
  84. byte[] data = Encoding.UTF8.GetBytes(requestXml);
  85. MemoryStream stm = new MemoryStream(data);
  86. httpWebRequest.Method = "POST";
  87. httpWebRequest.ContentType = apiType.Equals("CPU") ? "text/plain" : "text/json";
  88. httpWebRequest.ContentLength = data.Length;
  89. Stream httpstream = httpWebRequest.GetRequestStream();
  90. httpstream.Write(data, 0, data.Length);
  91. httpstream.Close();
  92. HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
  93. StreamReader reader = new StreamReader(resp.GetResponseStream());
  94. String result = reader.ReadToEnd();
  95. _log.Info($"{sendTxnURL}|RESPONSE : {result}");
  96. if (apiType.Equals("CPU"))
  97. {
  98. var objResult = ParseXml<PushRemittanceResult>(result);
  99. if (objResult.Code.Equals("00"))
  100. {
  101. _response.ResponseCode = "0";
  102. }
  103. else
  104. {
  105. _response.Id = objResult.TransactionID;
  106. _response.Msg = objResult.Message;
  107. _response.Extra = objResult.Code;
  108. }
  109. }
  110. else
  111. {
  112. var objResult = JsonConvert.DeserializeObject<TransactionResult>(result.ToString());
  113. if (objResult.Code.Equals("00"))
  114. {
  115. _response.ResponseCode = "0";
  116. }
  117. else
  118. {
  119. _response.Id = objResult.ReferenceNumber;
  120. _response.Msg = objResult.Message;
  121. _response.Extra = objResult.Code;
  122. }
  123. }
  124. }
  125. catch (Exception ex)
  126. {
  127. _response.ResponseCode = "999";
  128. _response.Msg = ex.ToString();
  129. }
  130. return _response;
  131. }
  132. private string MapSendTransactionDataCPU(SendTransaction model, string type)
  133. {
  134. PushRemittanceRequest pushRemittance = new PushRemittanceRequest()
  135. {
  136. Amount = model.Transaction.PAmt.ToString(),
  137. BeneficiaryFirstName = model.Receiver.RFirstName,
  138. BeneficiaryLastName = $"{(!string.IsNullOrEmpty(model.Receiver.RMiddleName) ? $"{ model.Receiver.RMiddleName}{" "} " : "")}{model.Receiver.RLastName}",
  139. ControlNumber = model.Transaction.JMEControlNo,
  140. PartnerCode = partnerCode,
  141. PayoutCountry = model.Receiver.RCountry.ToString(),
  142. PayoutCurrency = model.Transaction.PCurr,
  143. SenderFirstName = $"{(!string.IsNullOrEmpty(model.Sender.SMiddleName) ? $"{ model.Sender.SMiddleName}{" "} " : "")}{model.Sender.SFirstName}",
  144. SenderLastName = model.Sender.SLastName1,
  145. SendingCountry = model.Sender.SCountryName,
  146. SendingCurrency = model.Transaction.CollCurr,
  147. Password = password,
  148. UserID = userid
  149. };
  150. return XmlSerialize<PushRemittanceRequest>(pushRemittance);
  151. }
  152. private string MapStatusRequestData(GetStatus model, string type)
  153. {
  154. LookUpRemittanceRequest lookUpRemittanceRequest = new LookUpRemittanceRequest()
  155. {
  156. ControlNumber = model.ControlNo,
  157. PartnerCode = partnerCode,
  158. Password = password,
  159. UserID = userid
  160. };
  161. return XmlSerialize<LookUpRemittanceRequest>(lookUpRemittanceRequest);
  162. }
  163. private TPResponse GetBankList(TxnAgent model)
  164. {
  165. // BankList bankResponse = new BankList();
  166. TPResponse bankResponse = new TPResponse();
  167. try
  168. {
  169. string url = "";
  170. string requestXml = "";
  171. url = $"{baseRTA_Url}{RTA_GET_BANK_LIST}";
  172. requestXml = MapBankList(model);
  173. _log.Info($"{RTA_GET_BANK_LIST}|REQUEST : {requestXml}");
  174. HttpWebRequest httpWebRequest = WebRequest.Create(@url) as HttpWebRequest;
  175. byte[] data = Encoding.UTF8.GetBytes(requestXml);
  176. MemoryStream stm = new MemoryStream(data);
  177. httpWebRequest.Method = "POST";
  178. httpWebRequest.ContentType = "application/xml";
  179. httpWebRequest.ContentLength = data.Length;
  180. Stream httpstream = httpWebRequest.GetRequestStream();
  181. httpstream.Write(data, 0, data.Length);
  182. httpstream.Close();
  183. HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
  184. StreamReader reader = new StreamReader(resp.GetResponseStream());
  185. String result = reader.ReadToEnd();
  186. var objResult = ParseXml<GetListOfBanksResult>(result);
  187. if (objResult.BankCollection != null)
  188. {
  189. bankResponse.Data = objResult;
  190. }
  191. }
  192. catch (Exception ex)
  193. {
  194. bankResponse.ResponseCode = "999";
  195. bankResponse.Msg = ex.Message;
  196. }
  197. return bankResponse;
  198. }
  199. private string MapBankList(TxnAgent model)
  200. {
  201. 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"">");
  202. PartnerCredentials partner = new PartnerCredentials()
  203. {
  204. PartnerCode = partnerCode,
  205. UserID = userid,
  206. Password = password
  207. };
  208. stringBuilder.Append(XmlSerialize<PartnerCredentials>(partner));
  209. return stringBuilder.Append("</TransactionRequest>").ToString();
  210. }
  211. private TPResponse GetStatus(GetStatus model)
  212. {
  213. TPResponse _response = new TPResponse();
  214. try
  215. {
  216. string url = "";
  217. string requestXml = "";
  218. string apiType = "";
  219. if (model.PaymentMethod.ToLower().Contains("cash payment"))
  220. {
  221. url = $"{baseCPU_Url}{CPU_TRANSFER_STATUS}";
  222. apiType = "CPU";
  223. requestXml = MapStatusRequestData(model, apiType);
  224. }
  225. else
  226. {
  227. url = $"{baseRTA_Url}{RTA_TRANSFER_STATUS}";
  228. apiType = "RTA";
  229. RTAGetStatus requestStatus = MapRTAStatus(model);
  230. requestXml = JsonConvert.SerializeObject(requestStatus, Newtonsoft.Json.Formatting.None);
  231. }
  232. _log.Info($"{url} | REQUEST : {requestXml}");
  233. HttpWebRequest httpWebRequest = WebRequest.Create(@url) as HttpWebRequest;
  234. byte[] data = Encoding.UTF8.GetBytes(requestXml);
  235. MemoryStream stm = new MemoryStream(data);
  236. httpWebRequest.Method = "POST";
  237. httpWebRequest.ContentType = apiType.Equals("CPU") ? "text/plain" : "text/json";
  238. httpWebRequest.ContentLength = data.Length;
  239. Stream httpstream = httpWebRequest.GetRequestStream();
  240. httpstream.Write(data, 0, data.Length);
  241. httpstream.Close();
  242. HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
  243. StreamReader reader = new StreamReader(resp.GetResponseStream());
  244. String result = reader.ReadToEnd();
  245. _log.Info($"{url} | RESPONSE : {result}");
  246. string paidStatus = "UNPAID";
  247. if (apiType.Equals("CPU"))
  248. {
  249. var objResult = ParseXml<LookUpRemittanceResult>(result);
  250. _response.Data = objResult;
  251. _response.Extra2 = objResult.Code;
  252. if (objResult.Code.Equals("02")) //Paid
  253. {
  254. paidStatus = "PAID";
  255. _response.Extra3 = objResult.PayoutDate;
  256. }
  257. if (objResult.Code.Equals("03")) //cancelld
  258. paidStatus = "CANCELLED";
  259. _response.ResponseCode = paidStatus == "PAID" ? "0" : "1";
  260. _response.Extra = paidStatus;
  261. _response.Msg = objResult.Message;
  262. }
  263. else
  264. {
  265. var objResult = JsonConvert.DeserializeObject<TransactionResult>(result.ToString());
  266. _response.Data = objResult;
  267. _response.Extra2 = objResult.Code;
  268. if (objResult.Code.Equals("04")) //Paid
  269. paidStatus = "PAID";
  270. _response.ResponseCode = paidStatus == "PAID" ? "0" : "1";
  271. _response.Extra = paidStatus;
  272. _response.Msg = objResult.Message;
  273. }
  274. }
  275. catch (Exception ex)
  276. {
  277. _response.ResponseCode = "999";
  278. _response.Msg = ex.ToString();
  279. }
  280. return _response;
  281. }
  282. private static string XmlSerialize<T>(T entity) where T : class
  283. {
  284. // removes version
  285. XmlWriterSettings settings = new XmlWriterSettings();
  286. settings.OmitXmlDeclaration = true;
  287. XmlSerializer xsSubmit = new XmlSerializer(typeof(T));
  288. using (StringWriter sw = new StringWriter())
  289. using (XmlWriter writer = XmlWriter.Create(sw, settings))
  290. {
  291. // removes namespace
  292. var xmlns = new XmlSerializerNamespaces();
  293. xmlns.Add(string.Empty, string.Empty);
  294. xsSubmit.Serialize(writer, entity, xmlns);
  295. return sw.ToString(); // Your XML
  296. }
  297. }
  298. private static string ObjectToXML(object input)
  299. {
  300. try
  301. {
  302. StringWriter stringwriter = new StringWriter();
  303. XmlSerializer serializer = new XmlSerializer(input.GetType());
  304. serializer.Serialize(stringwriter, input);
  305. return stringwriter.ToString();
  306. }
  307. catch (Exception ex)
  308. {
  309. if (ex.InnerException != null)
  310. ex = ex.InnerException;
  311. return "Could not convert: " + ex.Message;
  312. }
  313. }
  314. private T ParseXml<T>(string value) where T : class
  315. {
  316. var xmlSerializer = new XmlSerializer(typeof(T));
  317. using (var textReader = new StringReader(value))
  318. {
  319. return (T)xmlSerializer.Deserialize(textReader);
  320. }
  321. }
  322. private TPResponse CancelTransaction(CancelTxn model)
  323. {
  324. TPResponse _response = new TPResponse() { ResponseCode = "1" };
  325. try
  326. {
  327. string cancelTxnURL = "";
  328. string requestXml = "";
  329. cancelTxnURL = $"{baseCPU_Update_Url}{CANCEL_CPU_TXN}";
  330. requestXml = MapCancelTransaction(model);
  331. _log.Info($"{cancelTxnURL}|REQUEST : {requestXml}");
  332. HttpWebRequest httpWebRequest = WebRequest.Create(@cancelTxnURL) as HttpWebRequest;
  333. byte[] data = Encoding.UTF8.GetBytes(requestXml);
  334. MemoryStream stm = new MemoryStream(data);
  335. httpWebRequest.Method = "POST";
  336. httpWebRequest.ContentType = "application/xml";
  337. httpWebRequest.ContentLength = data.Length;
  338. Stream httpstream = httpWebRequest.GetRequestStream();
  339. httpstream.Write(data, 0, data.Length);
  340. httpstream.Close();
  341. HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
  342. StreamReader reader = new StreamReader(resp.GetResponseStream());
  343. String result = reader.ReadToEnd();
  344. _log.Info($"{cancelTxnURL}|RESPONSE : {result}");
  345. var objResult = ParseXml<CancelTransaction.TransactionResult>(result);
  346. if (objResult.Code.Equals("00"))
  347. {
  348. _response.ResponseCode = "0";
  349. _response.Msg = "Transaction has been cancelled";
  350. }
  351. else
  352. {
  353. _response.Msg = objResult.Message;
  354. _response.Extra = objResult.Code.ToString();
  355. }
  356. }
  357. catch (Exception ex)
  358. {
  359. _response.ResponseCode = "999";
  360. _response.Msg = ex.ToString();
  361. }
  362. return _response;
  363. }
  364. private string MapCancelTransaction(CancelTxn model)
  365. {
  366. 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"" >");
  367. CancelTransaction cancelTransaction = new CancelTransaction()
  368. {
  369. PartnerCredentials = new PartnerCredentials()
  370. {
  371. PartnerCode = partnerCode,
  372. UserID = userid,
  373. Password = password
  374. },
  375. TranDetail = new CancelTransaction.TransactionDetails()
  376. {
  377. ControlNumber = model.PartnerPinNo,
  378. Reason = model.CancelReason
  379. }
  380. //, __type= "AmendRemittanceRequest:#CebuanaRemittanceDirectUpdater"
  381. };
  382. //return JsonConvert.SerializeObject(cancelTransaction, Newtonsoft.Json.Formatting.None);
  383. stringBuilder.Append(XmlSerialize<PartnerCredentials>(cancelTransaction.PartnerCredentials));
  384. stringBuilder.Append(XmlSerialize<CancelTransaction.TransactionDetails>(cancelTransaction.TranDetail));
  385. return stringBuilder.Append("</TransactionRequest>").ToString();
  386. }
  387. private TransactionRequestRTA MapTransactionRequestRTA(SendTransaction model)
  388. {
  389. var r = new TransactionRequestRTA
  390. {
  391. BeneficiaryDetails = new TransactionRequestRTA.BeneficiaryDetailsData()
  392. {
  393. BeneficiaryAddress1 = model.Receiver.RAdd1.Trim(),
  394. BeneficiaryAddress2 = !string.IsNullOrEmpty(model.Receiver.RLocationName) ? model.Receiver.RLocationName : model.Receiver.RCountry,
  395. BeneficiaryCity = model.Receiver.RCity.Trim(),
  396. BeneficiaryFirstName = model.Receiver.RFirstName.Trim(),
  397. BeneficiaryLastName = model.Receiver.RLastName.Trim(),
  398. BeneficiaryMiddleName = model.Receiver.RMiddleName.Trim(),
  399. BeneficiaryMobile = model.Receiver.RMobile,
  400. BeneficiaryProvince = model.Receiver.RStateId,
  401. BeneficiaryRelationshipWithSender = model.Receiver.RelWithSenderName.Trim(),
  402. BeneficiaryZipcode = model.Receiver.RCityCode
  403. },
  404. PartnerCredentials = new TransactionRequestRTA.PartnerCredentialsData()
  405. {
  406. PartnerCode = partnerCode,
  407. UserID = userid,
  408. Password = password
  409. },
  410. RemitterDetails = new TransactionRequestRTA.RemitterDetailsData()
  411. {
  412. RemitterAddress1 = model.Sender.SAddress.Trim(),
  413. RemitterAddress2 = model.Sender.SNativeCountry.Trim(),
  414. RemitterCity = model.Sender.SCityId,
  415. RemitterCountry = model.Sender.SCountryName.Trim(),
  416. RemitterFirstName = model.Sender.SFirstName.Trim(),
  417. RemitterLastName = model.Sender.SLastName1.Trim(),
  418. RemitterMiddleName = model.Sender.SMiddleName.Trim(),
  419. RemitterProvince = model.Sender.SState.Trim(),
  420. RemitterZipcode = model.Sender.SZipCode
  421. },
  422. TransactionDetails = new TransactionRequestRTA.TransactionDetailsData()
  423. {
  424. AccountNumber = model.Receiver.RAccountNo,
  425. Amount = String.Format("{0:0.00}", model.Transaction.PAmt),
  426. Currency = model.Transaction.PCurr,
  427. PurposeOfTransaction = model.Transaction.PurposeOfRemittanceName
  428. },
  429. BankCode = model.Agent.PBankId,
  430. ReferenceNumber = model.Transaction.JMEControlNo,
  431. __type = "RTATransactionRequest:#CebuanaPushRTAWCFServices"
  432. };
  433. return r;
  434. }
  435. private RTAGetStatus MapRTAStatus(GetStatus model)
  436. {
  437. var r = new RTAGetStatus
  438. {
  439. __type = "RTATransactionRequest:#CebuanaPushRTAWCFServices",
  440. PartnerCredentials = new PartnerCredentials()
  441. {
  442. PartnerCode = partnerCode,
  443. Password = password,
  444. UserID = userid
  445. },
  446. ReferenceNumber = model.ControlNo
  447. };
  448. return r;
  449. }
  450. private TPResponse AmendTransaction(AmendTransaction model)
  451. {
  452. TPResponse _response = new TPResponse() { ResponseCode = "1" };
  453. try
  454. {
  455. string amendTxnURL = "";
  456. string requestXml = "";
  457. amendTxnURL = $"{baseCPU_Update_Url}{AMEND_CPU_TXN}";
  458. requestXml = MapAmendTransaction(model);
  459. _log.Info($"{amendTxnURL}|REQUEST : {requestXml}");
  460. HttpWebRequest httpWebRequest = WebRequest.Create(@amendTxnURL) as HttpWebRequest;
  461. byte[] data = Encoding.UTF8.GetBytes(requestXml);
  462. MemoryStream stm = new MemoryStream(data);
  463. httpWebRequest.Method = "POST";
  464. httpWebRequest.ContentType = "application/xml";
  465. httpWebRequest.ContentLength = data.Length;
  466. Stream httpstream = httpWebRequest.GetRequestStream();
  467. httpstream.Write(data, 0, data.Length);
  468. httpstream.Close();
  469. HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
  470. StreamReader reader = new StreamReader(resp.GetResponseStream());
  471. String result = reader.ReadToEnd();
  472. _log.Info($"{amendTxnURL}|RESPONSE : {result}");
  473. var objResult = ParseXml<AmendTransactionPartner.TransactionResult>(result);
  474. if (objResult.Code.Equals("00"))
  475. {
  476. _response.ResponseCode = "0";
  477. }
  478. else
  479. {
  480. // _response.Id = objResult.TransactionID;
  481. _response.Msg = objResult.Message.Replace("'", "");
  482. _response.Extra = objResult.Code;
  483. }
  484. }
  485. catch (Exception ex)
  486. {
  487. _response.ResponseCode = "999";
  488. _response.Msg = ex.Message;
  489. _log.Error(ex.ToString());
  490. }
  491. return _response;
  492. }
  493. private string MapAmendTransaction(AmendTransaction model)
  494. {
  495. 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"" >");
  496. AmendTransactionPartner amend = new AmendTransactionPartner()
  497. {
  498. PartnerCredentials = new PartnerCredentials()
  499. {
  500. PartnerCode = partnerCode,
  501. UserID = userid,
  502. Password = password
  503. },
  504. TranDetail = new AmendTransactionPartner.TransactionDetails()
  505. {
  506. ControlNumber = model.TfPinno,
  507. Reason = model.Reason
  508. },
  509. BeneficiaryFirstName = $"{model.AmendReceiver.RFirstName.Trim()}{(!string.IsNullOrEmpty(model.AmendReceiver.RMiddleName) ? $"{" "}{ model.AmendReceiver.RMiddleName.Trim()}" : "")}",
  510. BeneficiaryLastName = model.AmendReceiver.RLastName
  511. };
  512. stringBuilder.Append(XmlSerialize<PartnerCredentials>(amend.PartnerCredentials));
  513. stringBuilder.Append(XmlSerialize<AmendTransactionPartner.TransactionDetails>(amend.TranDetail));
  514. stringBuilder.Append($"<BeneficiaryFirstName>{amend.BeneficiaryFirstName}</BeneficiaryFirstName>");
  515. stringBuilder.Append($"<BeneficiaryLastName>{amend.BeneficiaryLastName}</BeneficiaryLastName>");
  516. return stringBuilder.Append("</TransactionRequest>").ToString();
  517. }
  518. }
  519. }