Dinesh
2 weeks 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