Dinesh
1 week ago
7 changed files with 350 additions and 4 deletions
-
6Business/BusinessLogic/TPApiServices/Factory/ApiFactoryServices.cs
-
103TPServices/AliPayRemit/Model/AliPayModel.cs
-
226TPServices/AliPayRemit/Services/AliPayAPI.cs
-
4TPServices/App.config
-
6TPServices/TPServices.csproj
-
1TPServices/packages.config
-
8ThirdPartyAPIs/Web.config
@ -0,0 +1,103 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace TPApiServices.AliPay.Model |
|||
{ |
|||
public class AliPayModel |
|||
{ |
|||
} |
|||
public class AliPaySendRequest |
|||
{ |
|||
public string transferRequestId { get; set; } |
|||
public BeneficiaryReceiptMethod beneficiaryReceiptMethod { get; set; } |
|||
public string instructedAmountType { get; set; } |
|||
public string bizSceneType { get; set; } |
|||
public TrahsferToAmount trahsferToAmount { get; set; } |
|||
public additionalTransferDetails additionalTransferDetails { get; set; } |
|||
public string transferReference { get; set; } |
|||
} |
|||
|
|||
public class BeneficiaryReceiptMethod |
|||
{ |
|||
public WalletDetail walletDetail { get; set; } |
|||
public string paymentMethodType { get; set; } |
|||
} |
|||
public class WalletDetail |
|||
{ |
|||
public string walletName { get; set; } |
|||
public string customerId { get; set; } |
|||
public CustomerName customerName { get; set; } |
|||
} |
|||
public class CustomerName |
|||
{ |
|||
public string firstName { get; set; } |
|||
public string lastName { get; set; } |
|||
public string fullName { get; set; } |
|||
public string middleName { get; set; } |
|||
} |
|||
|
|||
public class TrahsferToAmount |
|||
{ |
|||
public string currency { get; set; } |
|||
public string value { get; set; } |
|||
} |
|||
|
|||
public class additionalTransferDetails |
|||
{ |
|||
public beneficiary beneficiary { get; set; } |
|||
public string transferPurpose { get; set; } |
|||
public string subTransferPurpose { get; set; } |
|||
public string transferFromRegion { get; set; } |
|||
public payer payer { get; set; } |
|||
public string transferToRegion { get; set; } |
|||
|
|||
} |
|||
public class beneficiary |
|||
{ |
|||
public string nationality { get; set; } |
|||
public CustomerName userName { get; set; } |
|||
} |
|||
|
|||
public class payer |
|||
{ |
|||
public userAddress userAddress { get; set; } |
|||
public string nationality { get; set; } |
|||
public string userPhoneNo { get; set; } |
|||
public certificate certificate { get; set; } |
|||
public CustomerName userName { get; set; } |
|||
public string userId { get; set; } |
|||
public string birthDate { get; set; } |
|||
} |
|||
|
|||
public class userAddress |
|||
{ |
|||
public string zipCode { get; set; } |
|||
public string city { get; set; } |
|||
public string address2 { get; set; } |
|||
public string address1 { get; set; } |
|||
public string region { get; set; } |
|||
} |
|||
|
|||
|
|||
public class certificate |
|||
{ |
|||
public string certificateNo { get; set; } |
|||
public string certificateType { get; set; } |
|||
} |
|||
|
|||
|
|||
|
|||
public class AliPayAuthResponsetModel |
|||
{ |
|||
public class result |
|||
{ |
|||
public string resultCode { get; set; } |
|||
public string resultMessage { get; set; } |
|||
public string resultStatus { get; set; } |
|||
} |
|||
public string transferId { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,226 @@ |
|||
using Common.Models.RequestResponse; |
|||
using Common.Models.Status; |
|||
using Common.Models.TxnModel; |
|||
using Common.TPService; |
|||
using Common.Utility; |
|||
using log4net; |
|||
using Newtonsoft.Json; |
|||
using Org.BouncyCastle.Crypto; |
|||
using Org.BouncyCastle.OpenSsl; |
|||
using Org.BouncyCastle.Security; |
|||
using RestSharp; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Security.Cryptography; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using TPApiServices.AliPay.Model; |
|||
|
|||
namespace TPApiServices.AliPayRemit.Services |
|||
{ |
|||
public class AliPayAPI : ITPApiServices |
|||
{ |
|||
private readonly ILog _log = LogManager.GetLogger(typeof(AliPayAPI)); |
|||
protected string baseUrl { get; set; } |
|||
protected string clientId { get; set; } |
|||
protected string private_key { get; set; } |
|||
protected string requestTime { get; set; } |
|||
|
|||
public AliPayAPI() |
|||
{ |
|||
baseUrl = GetStatic.ReadWebConfig("aliPay_base_url", ""); |
|||
clientId = GetStatic.ReadWebConfig("aliPay_clint_Id", ""); |
|||
private_key = GetStatic.ReadWebConfig("aliPay_private_key", ""); |
|||
} |
|||
|
|||
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); |
|||
default: |
|||
throw new NotImplementedException(); |
|||
} |
|||
} |
|||
|
|||
private TPResponse GetStatus(GetStatus getStatus) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
|
|||
private TPResponse SendTransaction(SendTransaction model) |
|||
{ |
|||
TPResponse txnResponse = new TPResponse(); |
|||
|
|||
// Map transaction details to AliPaySendRequest
|
|||
AliPaySendRequest aliPaySendRequest = MapSendTxnDetails(model); |
|||
|
|||
// Generate the signature
|
|||
string signature = GenerateSignature(aliPaySendRequest); |
|||
|
|||
// Create a new REST client and request
|
|||
var client = new RestClient(baseUrl); |
|||
var request = new RestRequest("/transfer", Method.POST); |
|||
|
|||
// Set headers
|
|||
request.AddHeader("Content-Type", "application/json"); |
|||
request.AddHeader("clientId", clientId); |
|||
request.AddHeader("requestTime", DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss+08:00")); // Adjust to match your request time format
|
|||
request.AddHeader("signature", $"algorithm=RSA256, keyVersion=0, signature={signature}"); |
|||
|
|||
// Set the request body
|
|||
string bodyContent = JsonConvert.SerializeObject(aliPaySendRequest, Formatting.Indented); |
|||
request.AddParameter("application/json", bodyContent, ParameterType.RequestBody); |
|||
|
|||
// Execute the request
|
|||
IRestResponse response = client.Execute(request); |
|||
|
|||
// Handle the response
|
|||
if (response.IsSuccessful) |
|||
{ |
|||
txnResponse = JsonConvert.DeserializeObject<TPResponse>(response.Content); |
|||
_log.Info($"Transaction successful: {response.Content}"); |
|||
} |
|||
else |
|||
{ |
|||
_log.Error($"Transaction failed: {response.ErrorMessage}"); |
|||
txnResponse.Msg = response.ErrorMessage; |
|||
} |
|||
|
|||
return txnResponse; |
|||
} |
|||
|
|||
public AliPaySendRequest MapSendTxnDetails(SendTransaction model) |
|||
{ |
|||
return new AliPaySendRequest |
|||
{ |
|||
transferRequestId = model.Transaction.JMEControlNo, |
|||
beneficiaryReceiptMethod = new BeneficiaryReceiptMethod |
|||
{ |
|||
walletDetail = new WalletDetail |
|||
{ |
|||
walletName = "ALIPAY_CN", |
|||
customerId = model.Receiver.REmail, |
|||
customerName = new CustomerName |
|||
{ |
|||
firstName = model.Receiver.RFirstName, |
|||
lastName = model.Receiver.RLastName, |
|||
fullName = model.Receiver.RFullName, |
|||
middleName = model.Receiver.RMiddleName |
|||
} |
|||
}, |
|||
paymentMethodType = model.Transaction.PaymentType |
|||
}, |
|||
instructedAmountType = "TRANSFER_TO", |
|||
bizSceneType = "TRANSFER", |
|||
trahsferToAmount = new TrahsferToAmount |
|||
{ |
|||
currency = model.Transaction.PCurr, |
|||
value = Convert.ToString(model.Transaction.PAmt) |
|||
}, |
|||
additionalTransferDetails = new additionalTransferDetails |
|||
{ |
|||
beneficiary = new beneficiary |
|||
{ |
|||
nationality = model.Receiver.RNativeCountry, |
|||
userName = new CustomerName |
|||
{ |
|||
firstName = model.Receiver.RFirstName, |
|||
lastName = model.Receiver.RLastName, |
|||
fullName = model.Receiver.RFullName, |
|||
middleName = model.Receiver.RMiddleName |
|||
} |
|||
}, |
|||
transferPurpose = model.Transaction.PurposeOfRemittanceName, |
|||
subTransferPurpose = "", |
|||
transferFromRegion = "GB", |
|||
payer = new payer |
|||
{ |
|||
userAddress = new userAddress |
|||
{ |
|||
zipCode = model.Sender.SZipCode, |
|||
city = model.Sender.SCity, |
|||
address1 = model.Sender.SAddress, |
|||
address2 = model.Sender.SCityId, |
|||
region = "GB" |
|||
}, |
|||
nationality = model.Sender.SNativeCountry, |
|||
userPhoneNo = model.Sender.SMobile, |
|||
certificate = new certificate |
|||
{ |
|||
certificateNo = model.Sender.SIdNo, |
|||
certificateType = model.Sender.SIdType |
|||
}, |
|||
userName = new CustomerName |
|||
{ |
|||
firstName = model.Sender.SFirstName, |
|||
lastName = model.Sender.SMiddleName, |
|||
fullName = model.Sender.SFullName, |
|||
middleName = model.Sender.SMiddleName |
|||
}, |
|||
userId = model.Sender.SEmail, |
|||
birthDate = model.Sender.SBirthDate |
|||
}, |
|||
transferToRegion = "CN" |
|||
}, |
|||
transferReference = "" |
|||
}; |
|||
} |
|||
|
|||
private string GenerateSignature(AliPaySendRequest aliPaySendRequest) |
|||
{ |
|||
string textToEncrypt = aliPaySendRequest.additionalTransferDetails.payer.userName.firstName |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.userName.middleName |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.userName.lastName |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.userName.fullName |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.nationality |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.userAddress.city |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.userAddress.address1 |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.certificate.certificateType |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.certificate.certificateNo |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.userPhoneNo |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.userId |
|||
+ aliPaySendRequest.additionalTransferDetails.payer.birthDate |
|||
+ aliPaySendRequest.beneficiaryReceiptMethod.walletDetail.walletName |
|||
+ aliPaySendRequest.beneficiaryReceiptMethod.walletDetail.customerId |
|||
+ aliPaySendRequest.beneficiaryReceiptMethod.walletDetail.customerName.firstName |
|||
+ aliPaySendRequest.beneficiaryReceiptMethod.walletDetail.customerName.middleName |
|||
+ aliPaySendRequest.beneficiaryReceiptMethod.walletDetail.customerName.lastName |
|||
+ aliPaySendRequest.additionalTransferDetails.beneficiary.nationality |
|||
+ aliPaySendRequest.additionalTransferDetails.beneficiary.userName.firstName |
|||
+ aliPaySendRequest.additionalTransferDetails.beneficiary.userName.middleName |
|||
+ aliPaySendRequest.additionalTransferDetails.beneficiary.userName.lastName |
|||
+ aliPaySendRequest.trahsferToAmount.currency |
|||
+ aliPaySendRequest.trahsferToAmount.value |
|||
+ aliPaySendRequest.additionalTransferDetails.transferPurpose |
|||
+ aliPaySendRequest.additionalTransferDetails.transferFromRegion |
|||
+ aliPaySendRequest.additionalTransferDetails.transferToRegion |
|||
+ aliPaySendRequest.transferReference; |
|||
|
|||
// Convert the text to encrypt into bytes
|
|||
byte[] dataBytes = Encoding.UTF8.GetBytes(textToEncrypt); |
|||
|
|||
// Load private key and sign the data
|
|||
byte[] signatureBytes; |
|||
using (TextReader reader = new StringReader(private_key)) |
|||
{ |
|||
PemReader pemReader = new PemReader(reader); |
|||
AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject(); |
|||
ISigner signer = SignerUtilities.GetSigner("SHA256withRSA"); |
|||
signer.Init(true, keyPair.Private); |
|||
signer.BlockUpdate(dataBytes, 0, dataBytes.Length); |
|||
signatureBytes = signer.GenerateSignature(); |
|||
} |
|||
|
|||
// Convert the signature to Base64
|
|||
string signature = Convert.ToBase64String(signatureBytes); |
|||
|
|||
return signature; |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue