using Common.Models.Bank; using Common.Models.Bank_Account; using Common.Models.ExchangeRate; using Common.Models.Reports; using Common.Models.RequestResponse; using Common.Models.Status; using Common.Models.TxnModel; using Common.TPService; using Common.Utility; using GMENepal.GMEReference; using GMENepal.Model; using log4net; using Newtonsoft.Json; using System; using System.Linq; using System.Reflection; using System.Security.Cryptography; using System.Text; using Repository.DAO.ThirdParty; namespace GMENepal.GMENepalAPIService { public class GMENepalAPI : ITPApiServices { private readonly ILog _log = LogManager.GetLogger(typeof(GMENepalAPI)); private readonly FastMoneyWebService _fastMoneyWeb = new FastMoneyWebService(); string UserName = GetStatic.ReadWebConfig("gme_user_name", ""); string Password = GetStatic.ReadWebConfig("gme_password", ""); string PartnerId = GetStatic.ReadWebConfig("gme_partnerId", ""); string GMEKey = GetStatic.ReadWebConfig("gme_key", ""); public TPResponse GetTPResponse(T model, string MethodName) where T : class { switch (MethodName) { case "send": return SendTransaction(model as SendTransaction); case "bankList": return GetBankList(model as BankRequest); case "exRate": return GetExRate(model as ExchangeRate); case "status": return GetTxnStatus(model as GetStatus); case "cancelSend": return CancelTransaction(model as CancelTxn); case "amendmentRequest": return ReconcileReport(model as TxnAmendment); case "verify": return AccountValidation(model as AccountValidate); case "release": return ReleseTrasaction(model as TFReleaseTxnRequest); default: return new TPResponse() { ResponseCode = "1", Msg = "Method Name Not Found !" }; } } private TPResponse ReleseTrasaction(TFReleaseTxnRequest releaseRequest) { DbResult response = new DbResult(); TPResponse _response = new TPResponse(); try { _log.Info("ConfirmTransaction | REQUEST :" + JsonConvert.SerializeObject(releaseRequest)); var res = _fastMoneyWeb.ConfirmTransaction(PartnerId, UserName, Password, releaseRequest.TfPin, releaseRequest.TxnId); _log.Info("ConfirmTransaction | RESPONSE :" + JsonConvert.SerializeObject(res)); _response.Data = response; _response.Msg = res.Message; _response.ResponseCode = res.ErrorCode; } catch (Exception ex) { _response.ResponseCode = "1"; _response.Msg = "Unknown error!"; _log.ErrorFormat("ReleseTrasaction | Exception occured On AccountValidation Method At GMENepalApi ! Details :" + ex.Message); } return _response; } private TPResponse AccountValidation(AccountValidate accValidate) { DbResult response = new DbResult(); TPResponse _response = new TPResponse(); try { _log.Info("AccountValidation | REQUEST :" + JsonConvert.SerializeObject(accValidate).ToString()); if (accValidate.BankCode.ToLower() == "imepay" || accValidate.BankCode.ToLower() == "khalti") { WalletUserDetailResponse walletResponse = _fastMoneyWeb.GetWalletDetails(PartnerId, UserName, Password, accValidate.BankCode.ToUpper() , accValidate.AccountNumber, "", GetAccValidateSignature(accValidate)); response.ErrorCode = walletResponse.ResponseCode; response.Msg = walletResponse.ResponseMessage; response.Extra = walletResponse.FullName; response.Extra2 = JsonConvert.SerializeObject(walletResponse); } else { response = _fastMoneyWeb.AccountValidation(UserName, Password, accValidate.BankCode, accValidate.AccountNumber , accValidate.ReceiverName); } _log.Info("AccountValidation | RESPONSE :" + JsonConvert.SerializeObject(response).ToString()); _response.Data = response; _response.Msg = response.Msg.Replace("Please Contact Head Office.", "Please check and re-submit!"); _response.Extra = response.Extra; _response.ResponseCode = response.ErrorCode; } catch (Exception ex) { _response.ResponseCode = "1"; _response.Msg = "Unknown error!"; _log.ErrorFormat("Exception occured On AccountValidation Method At GMENepalApi ! Details :" + ex.Message); } return _response; } private string GetAccValidateSignature(AccountValidate accValidate) { string sign = GMEKey + PartnerId + UserName + Password + accValidate.AccountNumber; StringBuilder builder = new StringBuilder(); using (SHA256 sha256Hash = SHA256.Create()) { // ComputeHash - returns byte array byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(sign)); // Convert byte array to a string for (int i = 0; i < bytes.Length; i++) { builder.Append(bytes[i].ToString("x2")); } } return builder.ToString(); } private TPResponse GetBankList(BankRequest bankRequest) { if (bankRequest.IsBranch) return GetBankBranchList(bankRequest); GMEBankRequest bR = BankModelMap(bankRequest); TPResponse _response = new CustomModelValidaton().IsModelValid(bR); if (_response == null) { _response = new TPResponse(); BankList[] getResponse = _fastMoneyWeb.GetBankList(bR.PartnerId, bR.UserName, bR.Password, bR.SessionId, bR.PaymentMethod, bR.ReceivingCountry); _response.Data = getResponse; _response.ResponseCode = getResponse.First().ErrorCode; _response.Msg = getResponse.First().Message; if (!_response.ResponseCode.Equals("0")) { _response.ResponseCode = "1"; _log.ErrorFormat("Error Occured On GetBankList Method At GMENepalApi ! Details :" + getResponse); } } else { _log.Info("GetBankList | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(bR).ToString()); } return _response; } private TPResponse GetBankBranchList(BankRequest bRequest) { GMEBankBranchRequest bR = BankBranchModelMap(bRequest); TPResponse _response = new CustomModelValidaton().IsModelValid(bR); if (_response == null) { _response = new TPResponse(); BankBranchList getResponse = _fastMoneyWeb.GetBankBranchList(bR.PartnerId, bR.UserName, bR.Password, bR.BankCode, bR.SessionId); _response.Data = getResponse.BRANCHES; _response.ResponseCode = getResponse.ErrorCode; _response.Msg = getResponse.Message; if (!_response.ResponseCode.Equals("0")) { _response.ResponseCode = "1"; _log.ErrorFormat("Error Occured On GetBankBranchList Method At GMENepalApi ! Details :" + getResponse); } } else { _log.Info("GetBankBranchList | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(bR).ToString()); } return _response; } private TPResponse GetExRate(ExchangeRate exchangeRate) { GMEGetCalculationRequest gCR = GetExRateModelMap(exchangeRate); TPResponse _response = new CustomModelValidaton().IsModelValid(gCR); if (_response == null) { _response = new TPResponse(); _log.Info("GetExRate | REQUEST :" + JsonConvert.SerializeObject(exchangeRate).ToString()); GetCalculationResult model = _fastMoneyWeb.GetCalculation( gCR.PartnerId, gCR.UserName, gCR.Password, gCR.SessionId, gCR.ReceivingAgentId, gCR.RemitAmount, gCR.PaymentMethod, gCR.ReceivingCountry, gCR.CalculateBy ); _log.Info("GetExRate | RESPONSE :" + JsonConvert.SerializeObject(model).ToString()); _response.Data = model; _response.Msg = model.Message; _response.Extra = model.ExConfirmId; _response.ResponseCode = model.ErrorCode; if (!_response.ResponseCode.Equals("0")) { _response.ResponseCode = "1"; _log.ErrorFormat("Error Occured On GetExRate Method At GMENepalApi ! Details :" + model); } } else { _log.Info("GetExRate | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gCR).ToString()); } return _response; } private TPResponse SendTransaction(SendTransaction sendTransaction) { GMESendMoney gS = SendModelMap(sendTransaction); DbResult model = new DbResult(); SendMoneyResult sendMoneyRes = new SendMoneyResult(); TPResponse _response = new CustomModelValidaton().IsModelValid(gS); if (_response == null) { _response = new TPResponse(); var dt = gS.TransactionDate.Split('-'); string dateTxn = dt[1] + "-" + dt[2] + "-" + dt[0]; _log.Info("SendTransaction | REQUEST :" + JsonConvert.SerializeObject(gS).ToString()); if (gS.PaymentMethod.ToLower() == "c") { _response = new TPResponse(); var exRate = _fastMoneyWeb.GetCalculation( gS.PartnerId, gS.UserName, gS.Password, gS.SessionId, "", "1000", "C", gS.BeneCountry, "P" ); _log.Info("GetExRate | RESPONSE :" + JsonConvert.SerializeObject(model).ToString()); var exConfirmId = exRate.ExConfirmId; sendMoneyRes = _fastMoneyWeb.SendMoney(PartnerId, UserName, Password, gS.ControlNo, exConfirmId, gS.MembershipId, gS.CustomerName, gS.CustomerAddress, gS.CustomerContact, gS.CustomerCity, gS.CustomerCountry, gS.CustomerIdType, gS.CustomerIdNumber, gS.BeneName, gS.BeneAddress, gS.BeneContact, gS.BeneCity , gS.BeneCountry, gS.Profession, gS.IncomeSource, gS.Relationship, gS.PurposeOfRemittance, gS.SendingAmount, gS.ReceivingAmount, gS.PaymentMethod , gS.BankCode, gS.BankName, gS.BankBranchName, gS.BankAccountNumber, dateTxn, gS.CalculateBy, gS.FreeCharge); _log.Info("SendTransaction | RESPONSE :" + JsonConvert.SerializeObject(sendMoneyRes).ToString()); _response.ResponseCode = sendMoneyRes.ErrorCode; _response.Msg = sendMoneyRes.Message; _response.Extra = exRate.UsdVsNpr; _response.Extra2 = sendMoneyRes.PinNo; _response.Id = sendMoneyRes.TranId; _response.Data = sendMoneyRes; return _response; } else if (gS.PaymentMethod.ToLower() == "w" && (gS.BankCode.ToLower() == "imepay" || gS.BankCode.ToLower() == "khalti")) { model = _fastMoneyWeb.RealTimeWalletDeposit(PartnerId, UserName, Password, gS.BankCode, gS.CustomerName, gS.CustomerAddress , gS.CustomerContact, gS.CustomerCountry, gS.CustomerIdType, gS.CustomerIdNumber, gS.BeneName, gS.BeneAddress , gS.BankAccountNumber, gS.BeneCountry, gS.IncomeSource, gS.Relationship, gS.PurposeOfRemittance, Convert.ToString(gS.CollectionAmount) , gS.CollectionCurrency, gS.SendingAmount, gS.ReceivingAmount, gS.FreeCharge, gS.PayoutCommCurr, dateTxn, gS.ControlNo , gS.SenderCostRate, gS.ReceiverCostRate, Convert.ToString(gS.ExRate), gS.Signature); } else { AccountValidate accValidate = new AccountValidate { BankCode = gS.BankCode, AccountNumber = gS.BankAccountNumber, ReceiverName = gS.BeneName, ControlNo = gS.ControlNo, PaymentMode = gS.PaymentMethod }; var response = AccountValidation(accValidate); if (response.ResponseCode.Equals("0") || response.ResponseCode.Equals("100")) { var exRateBank = _fastMoneyWeb.GetCalculation(gS.PartnerId, gS.UserName, gS.Password, gS.SessionId, "", "1000", "B", gS.BeneCountry, "P"); model = _fastMoneyWeb.ProcessBankDeposit(gS.PartnerId, gS.UserName, gS.Password, gS.ControlNo, exRateBank.ExConfirmId , gS.MembershipId, gS.CustomerName, gS.CustomerAddress, gS.CustomerContact, gS.CustomerCity, gS.CustomerCountry , gS.CustomerIdType, gS.CustomerIdNumber, gS.BeneName, gS.BeneAddress, gS.BeneContact, gS.BeneCity, gS.BeneCountry, gS.Profession , gS.IncomeSource, gS.Relationship, gS.PurposeOfRemittance, gS.SendingAmount, gS.ReceivingAmount, gS.PaymentMethod, gS.BankCode , gS.BankName, gS.BankAccountNumber, dateTxn, gS.CalculateBy, gS.FreeCharge, gS.ControlNo, gS.PayoutCurrency, gS.ReceiverCostRate , gS.SenderCostRate, gS.Signature); _response.Extra = exRateBank.UsdVsNpr; } else { ThirdPartyRepo thirdPartyRepo = new ThirdPartyRepo(); thirdPartyRepo.SyncTxnAsComment(sendTransaction.ProviderId, sendTransaction.TranId.ToString(), gS.ControlNo, "", response.Msg); _response.ResponseCode = response.ResponseCode; _response.Msg = response.Msg; return _response; } } _log.Info("SendTransaction | RESPONSE :" + JsonConvert.SerializeObject(model).ToString()); _response.ResponseCode = model.ErrorCode; _response.Msg = model.Msg; _response.Extra2 = model.Extra2; _response.Id = model.Id; _response.Data = model; } else { _log.Info("SendTransaction | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gS).ToString()); } return _response; } private TPResponse GetTxnStatus(GetStatus getStatus) { if (getStatus.IsFromPartnerPinNo) return GetTxnByPartnerPin(getStatus); GMEGetStatus gS = StatusModelMap(getStatus); TPResponse _response = new CustomModelValidaton().IsModelValid(gS); if (_response == null) { _response = new TPResponse(); _log.Info("GetTxnStatus | REQUEST :" + JsonConvert.SerializeObject(gS).ToString()); var model = _fastMoneyWeb.GetStatus(gS.PartnerId, gS.UserName, gS.Password, gS.PinNo, gS.SessionId); _log.Info("GetTxnStatus | RESPONSE :" + JsonConvert.SerializeObject(model).ToString()); _response.ResponseCode = model.ErrorCode; _response.Msg = model.Message; _response.Extra2 = model.Status; _response.Data = model; _response.Extra = model.ExRate; if (!_response.ResponseCode.Equals("0")) { _response.ResponseCode = "1"; } } else { _log.Info("GetTxnStatus | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gS).ToString()); } return _response; } private TPResponse GetTxnByPartnerPin(GetStatus getStatus) { GMEGetStatusByPartnerPinNo gSP = StatusByPartmerIdModelMap(getStatus); TPResponse _response = new CustomModelValidaton().IsModelValid(gSP); if (_response == null) { _response = new TPResponse(); _log.Info("GetTxnByPartnerPin | REQUEST :" + JsonConvert.SerializeObject(gSP).ToString()); GetStatusByPartnerPinNoResult model = _fastMoneyWeb.GetStatusByPartnerPinNo(gSP.PartnerId, gSP.UserName, gSP.Password, gSP.PinNo, gSP.SessionId); _log.Info("GetTxnByPartnerPin | RESPONSE :" + JsonConvert.SerializeObject(model).ToString()); _response.Data = model; _response.ResponseCode = model.ErrorCode; _response.Msg = model.Message; if (!_response.ResponseCode.Equals("0")) { _response.ResponseCode = "1"; } } else { _log.Info("GetTxnByPartnerPin | MODEL VALIDATION FAILED :" + JsonConvert.SerializeObject(gSP).ToString()); } return _response; } private TPResponse CancelTransaction(CancelTxn cancelTxn) { GMECancelTransaction gCT = CancelTxnModelMap(cancelTxn); TPResponse _response = new CustomModelValidaton().IsModelValid(gCT); if (_response == null) { _response = new TPResponse(); CancelTransactionResult model = _fastMoneyWeb.CancelTransaction(gCT.PartnerId, gCT.UserName, gCT.Password, gCT.PinNo, gCT.SessionId, gCT.CancelRemarks); _response.Data = model; _response.ResponseCode = model.ErrorCode; _response.Msg = model.Message; if (!_response.ResponseCode.Equals("0")) { _response.ResponseCode = "1"; _log.ErrorFormat("Error Occured On CancelTransaction Method At GMENepalApi ! Details :" + model); } } else { _log.Error("Error Validating Model!"); } return _response; } private TPResponse ReconcileReport(TxnAmendment txnAmendment) { GMEReconcileReport rCR = ReconcileReportMap(txnAmendment); TPResponse _response = new CustomModelValidaton().IsModelValid(rCR); if (_response == null) { _response = new TPResponse(); ReconcileReportResult[] model = _fastMoneyWeb.ReconcileReport(rCR.PartnerId, rCR.UserName, rCR.Password, rCR.SessionId, rCR.ReportType, rCR.FromDate, rCR.ToDate); _response.Data = model; _response.ResponseCode = model.First().ErrorCode; _response.Msg = model.First().Message; if (!_response.ResponseCode.Equals("0")) { _response.ResponseCode = "1"; _log.ErrorFormat("Error Occured On ReconcileReport Method At GMENepalApi ! Details :" + model); } } else { _log.Error("Error Validating Model!"); } return _response; } #region dataMapping private GMEBankRequest BankModelMap(BankRequest bK) { return new GMEBankRequest() { PaymentMethod = bK.PaymentMethod, ReceivingCountry = bK.CountryCode }; } private GMEBankBranchRequest BankBranchModelMap(BankRequest bK) { return new GMEBankBranchRequest() { BankCode = bK.BankName }; } private GMEGetCalculationRequest GetExRateModelMap(ExchangeRate eR) { return new GMEGetCalculationRequest() { CalculateBy = eR.CalcBy, PaymentMethod = eR.PaymentType == "Wallet" ? "W" : eR.PaymentType, ReceivingAgentId = eR.PAgentName, ReceivingCountry = eR.PCountryName, RemitAmount = eR.CalcBy == "P" ? eR.CAmount.ToString() : eR.PAmount.ToString() }; } private GMESendMoney SendModelMap(SendTransaction sT) { return new GMESendMoney() { Signature = GetSignature(sT), ControlNo = sT.Transaction.JMEControlNo, PayoutCurrency = sT.Transaction.PCurr, SenderCostRate = "", ReceiverCostRate = Convert.ToString(sT.Transaction.SettlementDollarRate), ExConfirmId = null, MembershipId = null, CustomerName = sT.Sender.SFullName, CustomerAddress = sT.Sender.SAddress, CustomerContact = sT.Sender.SMobile, CustomerCity = sT.Sender.SCityId, CustomerCountry = sT.Sender.SCountryName, CustomerIdType = sT.Sender.SIdType, CustomerIdNumber = sT.Sender.SIdNo, BeneName = sT.Receiver.RFullName, BeneAddress = sT.Receiver.RAdd1, BeneContact = sT.Receiver.RMobile, BeneCity = sT.Receiver.RCity, BeneCountry = sT.Receiver.RCountry, Profession = sT.Sender.SOccuptionName, IncomeSource = sT.Sender.SourceOfFund, Relationship = sT.Receiver.RelWithSenderName, PurposeOfRemittance = sT.Transaction.PurposeOfRemittanceName, SendingAmount = sT.Transaction.TAmt.ToString(), ReceivingAmount = sT.Transaction.PAmt.ToString(), PaymentMethod = sT.Transaction.PaymentType, BankCode = sT.Agent.PBankId, BankName = sT.Agent.PBankName, BankBranchName = sT.Agent.PBankBranchName, BankAccountNumber = sT.Receiver.RAccountNo, TransactionDate = sT.Transaction.TxnDate, CollectionCurrency = sT.Transaction.CollCurr, CollectionAmount = sT.Transaction.CAmt, ExRate = sT.Transaction.ExRate, PayoutCommCurr = "NPR", CalculateBy = "P",/*sT.Transaction.CalBy*/ FreeCharge = Convert.ToString(sT.Transaction.ServiceCharge) /*sT.Transaction.IsManualSc*/ }; } private string GetSignature(SendTransaction sT) { string sign = ""; if (sT.Agent.PBankId.ToLower() == "imepay" || sT.Agent.PBankId.ToLower() == "khalti") sign = GMEKey + PartnerId + UserName + Password + sT.Receiver.RAccountNo + sT.Transaction.PAmt; else sign = GMEKey + UserName + Password + sT.Transaction.JMEControlNo + sT.Transaction.PAmt + sT.Receiver.RAccountNo + sT.Agent.PBankId; StringBuilder builder = new StringBuilder(); using (SHA256 sha256Hash = SHA256.Create()) { // ComputeHash - returns byte array byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(sign)); // Convert byte array to a string for (int i = 0; i < bytes.Length; i++) { builder.Append(bytes[i].ToString("x2")); } } return builder.ToString(); } private GMESendMoneyV2 SendV2ModelMap(SendTransaction sT) { GMESendMoney model = SendModelMap(sT); return new GMESendMoneyV2() { GMESendMoney = model, PCostRate = sT.Transaction.ExRate.ToString(), SCostRate = sT.Transaction.SettlementDollarRate.ToString() }; } private GMEGetStatus StatusModelMap(GetStatus gS) { return new GMEGetStatus() { PinNo = gS.ControlNo }; } private GMEGetStatusByPartnerPinNo StatusByPartmerIdModelMap(GetStatus gS) { return new GMEGetStatusByPartnerPinNo() { PinNo = gS.PartnerPinNo }; } private GMECancelTransaction CancelTxnModelMap(CancelTxn cT) { return new GMECancelTransaction() { PinNo = cT.PartnerPinNo }; } private GMEReconcileReport ReconcileReportMap(TxnAmendment rR) { return new GMEReconcileReport() { FromDate = rR.FromDate, ReportType = rR.ReportType, ToDate = rR.ToDate }; } private GMEGetAgentSOABalance SOABalanceModelMap(AgentSOAReport aR) { return new GMEGetAgentSOABalance() { AgentMapCode = aR.AgentMapCode }; } #endregion dataMapping } }