Dinesh
3 months ago
4 changed files with 444 additions and 1 deletions
-
7Business/BusinessLogic/TPApiServices/Factory/ApiFactoryServices.cs
-
110TPServices/GuavaPay/Model/GuavaPayModel.cs
-
322TPServices/GuavaPay/Services/GuavaPayAPI.cs
-
6ThirdPartyAPIs/Web.config
@ -0,0 +1,110 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace TPApiServices.GuavaPay.Model |
||||
|
{ |
||||
|
public class GuavaPayModel |
||||
|
{ |
||||
|
public string ClintId { get; set; } |
||||
|
public string SecretKey { get; set; } |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public class AuthResponseModel |
||||
|
{ |
||||
|
public string Token { get; set; } |
||||
|
public string Message { get; set; } |
||||
|
public string Code { get; set; } |
||||
|
public DateTime ExpiryTime { get; set; } |
||||
|
} |
||||
|
public class GuavaSendTransaction |
||||
|
{ |
||||
|
public string Country { get; set; } |
||||
|
public string AgentName { get; set; } |
||||
|
public string Amount { get; set; } |
||||
|
public string Currency { get; set; } |
||||
|
public string AgentTransactionId { get; set; } |
||||
|
public string CallBackUrl { get; set; } |
||||
|
public Sender Sender { get; set; } |
||||
|
public Receiver Receiver { get; set; } |
||||
|
} |
||||
|
public class Sender |
||||
|
{ |
||||
|
public string FirstName { get; set; } |
||||
|
public string LastName { get; set; } |
||||
|
public string Phone { get; set; } |
||||
|
public string Address { get; set; } |
||||
|
public string BirthDate { get; set; } |
||||
|
public DocumentInfo Document { get; set; } |
||||
|
|
||||
|
} |
||||
|
public class DocumentInfo |
||||
|
{ |
||||
|
public string DocumentType { get; set; } |
||||
|
public string DocumentNumber { get; set; } |
||||
|
public string RDocumentNumber { get; set; } |
||||
|
public string DocumentIssueCountry { get; set; } |
||||
|
public string DocumentIssueDate { get; set; } |
||||
|
public string DocumentEndDate { get; set; } |
||||
|
} |
||||
|
|
||||
|
public class Receiver |
||||
|
{ |
||||
|
public string FirstName { get; set; } |
||||
|
public string LastName { get; set; } |
||||
|
public string Phone { get; set; } |
||||
|
public DocumentInfo Document { get; set; } |
||||
|
public AccountInfo AcountInfo { get; set; } |
||||
|
|
||||
|
} |
||||
|
public class AccountInfo |
||||
|
{ |
||||
|
public string AccountNumber { get; set; } |
||||
|
public string BankName { get; set; } |
||||
|
} |
||||
|
|
||||
|
public class SendTransactionResponse |
||||
|
{ |
||||
|
public string Status { get; set; } |
||||
|
public string StatusDescription { get; set; } |
||||
|
public string RRN { get; set; } |
||||
|
public string Fee { get; set; } |
||||
|
public string Rate { get; set; } |
||||
|
public string Code { get; set; } |
||||
|
public string Msg { get; set; } |
||||
|
public string Message { get; set; } |
||||
|
} |
||||
|
public class GetExchangeRate |
||||
|
{ |
||||
|
public string SourceCurrency { get; set; } |
||||
|
public string TragetCourrency { get; set; } |
||||
|
public string Rate { get; set; } |
||||
|
public string RemitanceType { get; set; } |
||||
|
public string agent { get; set; } |
||||
|
} |
||||
|
public class StatusResponseModel |
||||
|
{ |
||||
|
public string statusDescription; |
||||
|
|
||||
|
public string referenceCode { get; set; } |
||||
|
public string Data { get; set; } |
||||
|
public string Msg { get; set; } |
||||
|
public string Code { get; set; } |
||||
|
public string Message { get; set; } |
||||
|
public string Status { get; set; } |
||||
|
//public Detail Detail { get; set; }
|
||||
|
|
||||
|
} |
||||
|
public class StatusRequestModel |
||||
|
{ |
||||
|
public string ProcessIdentifier { get; set; } |
||||
|
public string Token { get; set; } |
||||
|
public string Note { get; set; } |
||||
|
// public Body Body { get; set; }
|
||||
|
// public string Signature { get; set; }
|
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,322 @@ |
|||||
|
using Common.Models; |
||||
|
using Common.Models.Bank_Account; |
||||
|
using Common.Models.RequestResponse; |
||||
|
using Common.Models.Status; |
||||
|
using Common.Models.TxnModel; |
||||
|
using Common.TPService; |
||||
|
using Common.Utility; |
||||
|
using log4net; |
||||
|
using Newtonsoft.Json; |
||||
|
using RestSharp; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using TPApiServices.GuavaPay.Model; |
||||
|
|
||||
|
namespace TPApiServices.GuavaPay.Services |
||||
|
{ |
||||
|
public class GuavaPayAPI : ITPApiServices |
||||
|
{ |
||||
|
private readonly ILog _log = LogManager.GetLogger(typeof(GuavaPayAPI)); |
||||
|
protected string baseUrl { get; set; } |
||||
|
protected string clientId { get; set; } |
||||
|
protected string authKey { get; set; } |
||||
|
protected string agentCode { get; set; } |
||||
|
|
||||
|
public GuavaPayAPI() |
||||
|
{ |
||||
|
baseUrl = GetStatic.ReadWebConfig("guavaPay_base_url", ""); |
||||
|
clientId = GetStatic.ReadWebConfig("guavaPay_clint_Id", ""); |
||||
|
authKey = GetStatic.ReadWebConfig("guavaPay_secret_key", ""); |
||||
|
//agentCode = GetStatic.ReadWebConfig("guavaPay_agent_code", "");
|
||||
|
} |
||||
|
|
||||
|
public TPResponse GetTPResponse<T>(T model, string MethodName) where T : class |
||||
|
{ |
||||
|
switch (MethodName) |
||||
|
{ |
||||
|
//case "exRate":
|
||||
|
// return GetExRate(model as SendExRateRequestModel);
|
||||
|
case "send": |
||||
|
return SendTransaction(model as SendTransaction); |
||||
|
|
||||
|
//case "verify":
|
||||
|
// return AccountVerifySendMN(model as AccountValidate);
|
||||
|
|
||||
|
case "status": |
||||
|
return GetStatus(model as GetStatus); |
||||
|
|
||||
|
//case "staticData":
|
||||
|
// return GetStaticData(model as StaticData);
|
||||
|
|
||||
|
default: |
||||
|
throw new NotImplementedException(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private AuthResponseModel GetToken(string user) |
||||
|
{ |
||||
|
AuthResponseModel tokenResponse = new AuthResponseModel(); |
||||
|
try |
||||
|
{ |
||||
|
var requestBody = new GuavaPayModel |
||||
|
{ |
||||
|
ClintId = agentCode, |
||||
|
SecretKey = authKey, |
||||
|
//UserName = userName
|
||||
|
}; |
||||
|
var client = new RestClient(baseUrl); |
||||
|
var request = new RestRequest("/v2/auth", Method.POST); |
||||
|
|
||||
|
request.AddHeader("Content-Type", "application/json"); |
||||
|
//request.AddHeader("UserName", userName);
|
||||
|
request.AddHeader("ClintId", clientId); |
||||
|
request.AddHeader("SecretKey", authKey); |
||||
|
|
||||
|
request.RequestFormat = DataFormat.Json; |
||||
|
request.AddJsonBody(requestBody); |
||||
|
|
||||
|
_log.Info($"GUAVAPAYAPI|GETTOKEN|REQUEST URL: {client.BaseUrl}{request.Resource}"); |
||||
|
_log.Info($"GUAVAPAYAPI|GETTOKEN|REQUEST HEADERS: {JsonConvert.SerializeObject(request.Parameters.Where(p => p.Type == ParameterType.HttpHeader).Select(p => new { p.Name, p.Value }))}"); |
||||
|
_log.Info($"GUAVAPAYAPI|GETTOKEN|REQUEST BODY: {JsonConvert.SerializeObject(requestBody)}"); |
||||
|
|
||||
|
|
||||
|
var response = client.Execute<AuthResponseModel>(request); |
||||
|
|
||||
|
tokenResponse = response.Data; |
||||
|
//tokenResponse = response.ProcessIdentifier;
|
||||
|
|
||||
|
|
||||
|
|
||||
|
if (tokenResponse != null && tokenResponse.Code == "0") |
||||
|
{ |
||||
|
|
||||
|
tokenResponse.ExpiryTime = DateTime.UtcNow.AddMinutes(90); |
||||
|
_log.Info($"GUAVAPAYAPI|GETTOKEN|RESPONSE : {JsonConvert.SerializeObject(tokenResponse)}"); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
_log.Error($"GUAVAPAYAPI|GETTOKEN|ERROR RESPONSE : {JsonConvert.SerializeObject(tokenResponse)}"); |
||||
|
} |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
tokenResponse = new AuthResponseModel |
||||
|
{ |
||||
|
Code = "999", |
||||
|
//Detail = new Detail { Note = ex.ToString() }
|
||||
|
}; |
||||
|
_log.Error($"GUAVAPAYAPI|GETTOKEN|EXCEPTION OCCURRED : {JsonConvert.SerializeObject(tokenResponse)}"); |
||||
|
} |
||||
|
|
||||
|
return tokenResponse; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
private TPResponse GetStatus(GetStatus model) |
||||
|
{ |
||||
|
TPResponse statusResponse = new TPResponse(); |
||||
|
statusResponse.ResponseCode = "1"; |
||||
|
statusResponse.Msg = "Error fetching transaction status!"; |
||||
|
try |
||||
|
{ |
||||
|
var tokenResponse = GetToken(model.RequestBy); |
||||
|
|
||||
|
if (tokenResponse.Code != "0") |
||||
|
{ |
||||
|
statusResponse.ResponseCode = "1"; |
||||
|
statusResponse.Msg = tokenResponse.Message; |
||||
|
|
||||
|
_log.Error($"GUAVAPAYAPI|GETSTATUSSENDMN.GETTOKEN()|RESPONSE : {JsonConvert.SerializeObject(statusResponse)}"); |
||||
|
return statusResponse; |
||||
|
} |
||||
|
|
||||
|
var requestBody = new StatusResponseModel { referenceCode = model.PartnerPinNo }; |
||||
|
|
||||
|
|
||||
|
_log.Info($"GUAVAPAYAPI|GETSTATUSSENDMN|REQUEST BODY : {JsonConvert.SerializeObject(requestBody)}"); |
||||
|
|
||||
|
var client = new RestClient(baseUrl); |
||||
|
var request = new RestRequest($"/v2/transactions/{model.PartnerPinNo}/status", Method.POST); |
||||
|
|
||||
|
request.AddHeader("Content-Type", "application/json"); |
||||
|
request.AddHeader("Authorization", "Bearer " + tokenResponse.Token); |
||||
|
request.AddHeader("ClintId", clientId); |
||||
|
request.AddHeader("SecretKey", authKey); |
||||
|
|
||||
|
request.RequestFormat = DataFormat.Json; |
||||
|
request.AddJsonBody(requestBody); |
||||
|
|
||||
|
var getStatusResponse = client.Execute<StatusResponseModel>(request).Data; |
||||
|
|
||||
|
_log.Info($"GUAVAPAYAPI|GETSTATUSSENDMN|RESPONSE : {JsonConvert.SerializeObject(getStatusResponse)}"); |
||||
|
|
||||
|
statusResponse.ResponseCode = getStatusResponse.Code; |
||||
|
statusResponse.Msg = getStatusResponse.Message; |
||||
|
|
||||
|
if (getStatusResponse.Code == "0") |
||||
|
{ |
||||
|
statusResponse.Id = getStatusResponse.referenceCode; |
||||
|
statusResponse.Extra = getStatusResponse.Status; |
||||
|
statusResponse.Extra2 = getStatusResponse.statusDescription; |
||||
|
|
||||
|
//statusResponse.Extra3 = string.IsNullOrEmpty(getStatusResponse.Detail.PaidDate) ? "" : getStatusResponse.Detail.PaidDate;
|
||||
|
} |
||||
|
statusResponse.Data = getStatusResponse; |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
statusResponse.ResponseCode = "999"; |
||||
|
statusResponse.Msg = ex.ToString(); |
||||
|
|
||||
|
_log.Error($"GUAVAPAYAPI|GETSTATUSSENDMN|EXCEPTION OCCURED|RESPONSE : {JsonConvert.SerializeObject(statusResponse)}"); |
||||
|
} |
||||
|
return statusResponse; |
||||
|
} |
||||
|
|
||||
|
//private TPResponse AccountVerifySendMN(AccountValidate accountValidate)
|
||||
|
//{
|
||||
|
// throw new NotImplementedException();
|
||||
|
//}
|
||||
|
|
||||
|
private TPResponse SendTransaction(SendTransaction model) |
||||
|
{ |
||||
|
TPResponse txnResponse = new TPResponse(); |
||||
|
txnResponse.ResponseCode = "1"; |
||||
|
txnResponse.Msg = "Error sending transaction to partner!"; |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
|
||||
|
|
||||
|
|
||||
|
var tokenResponse = GetToken(model.RequestBy); |
||||
|
|
||||
|
if (tokenResponse == null || tokenResponse.Code != "0") |
||||
|
{ |
||||
|
txnResponse.ResponseCode = "1"; |
||||
|
|
||||
|
|
||||
|
_log.Error($"GUAVAPAYAPI|SENDTRANSACTION.GETTOKEN()|RESPONSE : {JsonConvert.SerializeObject(txnResponse)}"); |
||||
|
return txnResponse; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
var requestBody = MapSendTxnDetails(model); |
||||
|
if (requestBody == null) |
||||
|
{ |
||||
|
txnResponse.ResponseCode = "1"; |
||||
|
txnResponse.Msg = "Request body mapping failed"; |
||||
|
|
||||
|
_log.Error($"GUAVAPAYAPI|SENDTRANSACTION.MAPSENDTXNDETAILS()|RESPONSE : {JsonConvert.SerializeObject(txnResponse)}"); |
||||
|
return txnResponse; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
_log.Info($"GUAVAPAYAPI|SENDTRANSACTION|REQUEST BODY : {JsonConvert.SerializeObject(requestBody)}"); |
||||
|
|
||||
|
var client = new RestClient(baseUrl); |
||||
|
var request = new RestRequest("/v2/payments/account", Method.POST); |
||||
|
|
||||
|
request.AddHeader("Content-Type", "application/json"); |
||||
|
request.AddHeader("Authorization", "Bearer " + tokenResponse.Token); |
||||
|
request.AddHeader("ClintId", clientId); |
||||
|
request.AddHeader("SecretKey", authKey); |
||||
|
|
||||
|
request.RequestFormat = DataFormat.Json; |
||||
|
request.AddJsonBody(requestBody); |
||||
|
|
||||
|
var TxnResponse = client.Execute<SendTransactionResponse>(request); |
||||
|
|
||||
|
if (TxnResponse == null || TxnResponse.Data == null) |
||||
|
{ |
||||
|
txnResponse.ResponseCode = "1"; |
||||
|
txnResponse.Msg = "Transaction response is null"; |
||||
|
|
||||
|
_log.Error($"GUAVAPAYAPI|SENDTRANSACTION.EXECUTE()|RESPONSE : {JsonConvert.SerializeObject(txnResponse)}"); |
||||
|
return txnResponse; |
||||
|
} |
||||
|
|
||||
|
var sendTxnResponse = TxnResponse.Data; |
||||
|
_log.Info($"GUAVAPAYAPI|SENDTRANSACTION|RESPONSE : {TxnResponse.Content}"); |
||||
|
|
||||
|
if (sendTxnResponse.Code == "0") |
||||
|
{ |
||||
|
txnResponse.ResponseCode = "0";//success
|
||||
|
txnResponse.Id = sendTxnResponse.RRN; |
||||
|
txnResponse.Extra = sendTxnResponse.Status; |
||||
|
txnResponse.Extra2 = sendTxnResponse.StatusDescription; |
||||
|
txnResponse.Extra3 = sendTxnResponse.Fee; |
||||
|
txnResponse.Extra4 = sendTxnResponse.Rate; |
||||
|
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
txnResponse.ResponseCode = "1";//failed
|
||||
|
txnResponse.Extra = sendTxnResponse.Code; |
||||
|
} |
||||
|
|
||||
|
txnResponse.Msg = sendTxnResponse.Msg ?? sendTxnResponse.Message ; |
||||
|
txnResponse.Data = sendTxnResponse; |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
txnResponse.ResponseCode = "999"; |
||||
|
txnResponse.Msg = ex.ToString(); |
||||
|
|
||||
|
_log.Error($"GUAVAPAYAPI|SENDTRANSACTION|EXCEPTION OCCURED|RESPONSE : {JsonConvert.SerializeObject(txnResponse)}"); |
||||
|
} |
||||
|
|
||||
|
return txnResponse; |
||||
|
} |
||||
|
|
||||
|
public GuavaSendTransaction MapSendTxnDetails(SendTransaction model) |
||||
|
{ |
||||
|
return new GuavaSendTransaction |
||||
|
{ |
||||
|
Sender = new Sender |
||||
|
{ |
||||
|
FirstName = model.Sender.SFirstName, |
||||
|
LastName = model.Sender.SLastName1, |
||||
|
Address = model.Sender.SCityId, |
||||
|
BirthDate = model.Sender.SBirthDate, |
||||
|
Phone = model.Sender.SMobile, |
||||
|
Document = new DocumentInfo |
||||
|
{ |
||||
|
DocumentType = model.Sender.SIdType, |
||||
|
DocumentNumber = model.Sender.SIdNo, |
||||
|
DocumentIssueCountry = model.Sender.SNativeCountry, |
||||
|
DocumentIssueDate = model.Sender.SIdIssueDate, |
||||
|
DocumentEndDate = model.Sender.SIdExpiryDate, |
||||
|
} |
||||
|
}, |
||||
|
Receiver = new Receiver |
||||
|
{ |
||||
|
FirstName = model.Receiver.RFirstName, |
||||
|
LastName = model.Receiver.RLastName, |
||||
|
Phone = model.Receiver.RMobile, |
||||
|
Document = new DocumentInfo |
||||
|
{ |
||||
|
RDocumentNumber = model.Receiver.RIdNo |
||||
|
}, |
||||
|
AcountInfo = new AccountInfo |
||||
|
{ |
||||
|
AccountNumber = model.Receiver.UnitaryBankAccountNo, |
||||
|
BankName = model.Agent.PBankName |
||||
|
} |
||||
|
}, |
||||
|
Country = model.Receiver.RCountry, |
||||
|
AgentName = model.Agent.PBankName, |
||||
|
Amount = Convert.ToString(model.Transaction.PAmt), |
||||
|
AgentTransactionId = model.Transaction.JMEControlNo, |
||||
|
CallBackUrl = "" |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue