Browse Source

#34481 Alipay

#feature/Redmine-34481-AliPay
Dinesh 1 week ago
parent
commit
7007f73cd0
  1. 6
      Business/BusinessLogic/TPApiServices/Factory/ApiFactoryServices.cs
  2. 103
      TPServices/AliPayRemit/Model/AliPayModel.cs
  3. 226
      TPServices/AliPayRemit/Services/AliPayAPI.cs
  4. 4
      TPServices/App.config
  5. 6
      TPServices/TPServices.csproj
  6. 1
      TPServices/packages.config
  7. 8
      ThirdPartyAPIs/Web.config

6
Business/BusinessLogic/TPApiServices/Factory/ApiFactoryServices.cs

@ -2,6 +2,7 @@
using Common.Utility;
using GMENepal.GMENepalAPIService;
using log4net;
using TPApiServices.AliPayRemit.Services;
using TPApiServices.GuavaPayRemit.Services;
using TPApiServices.SendMNRemit.Services;
using TPService.GCC.Services;
@ -38,6 +39,11 @@ namespace Business.BusinessLogic.TPApiServices.Factory
log.Debug("Choose Provider as guavaPay");
apiFactory = _container.Resolve<GuavaPayAPI>();
}
else if (providerNo == GetStatic.ReadWebConfig("aliPay", ""))
{
log.Debug("Choose Provider as aliPay");
apiFactory = _container.Resolve<AliPayAPI>();
}
return apiFactory;
}
}

103
TPServices/AliPayRemit/Model/AliPayModel.cs

@ -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; }
}
}

226
TPServices/AliPayRemit/Services/AliPayAPI.cs

@ -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;
}
}
}

4
TPServices/App.config

@ -14,9 +14,7 @@
</bindings>
<client>
<endpoint address="https://api.gccremit.com/SendAPI.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpsBinding_ISendAPI" contract="GCCReference.ISendAPI" name="BasicHttpsBinding_ISendAPI" />
<endpoint address="http://211.25.249.199:9001/imeServiceV2.asmx"
binding="basicHttpBinding" bindingConfiguration="imeServiceV2Soap"
contract="IMENepalSendAPI.imeServiceV2Soap" name="imeServiceV2Soap" />
<endpoint address="http://211.25.249.199:9001/imeServiceV2.asmx" binding="basicHttpBinding" bindingConfiguration="imeServiceV2Soap" contract="IMENepalSendAPI.imeServiceV2Soap" name="imeServiceV2Soap" />
</client>
</system.serviceModel>
<runtime>

6
TPServices/TPServices.csproj

@ -37,6 +37,9 @@
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="BouncyCastle.Crypto, Version=1.8.10.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
<HintPath>..\packages\Portable.BouncyCastle.1.8.10\lib\net40\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath>
</Reference>
@ -59,6 +62,8 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AliPayRemit\Model\AliPayModel.cs" />
<Compile Include="AliPayRemit\Services\AliPayAPI.cs" />
<Compile Include="Connected Services\GCCReference\Reference.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
@ -294,5 +299,6 @@
<LastGenOutput>Reference.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

1
TPServices/packages.config

@ -2,5 +2,6 @@
<packages>
<package id="log4net" version="2.0.8" targetFramework="net472" />
<package id="Newtonsoft.Json" version="12.0.1" targetFramework="net472" />
<package id="Portable.BouncyCastle" version="1.8.10" targetFramework="net461" />
<package id="RestSharp" version="106.11.7" targetFramework="net461" />
</packages>

8
ThirdPartyAPIs/Web.config

@ -64,6 +64,7 @@
<add key="gccremit" value="394449" />
<add key="sendMN" value="394488" /> <!--Uat-->
<add key="guavaPay" value="394490" />
<add key="aliPay" value="394492" />
<!--Live-->
<!--<add key="sendMN" value="394502" />-->
<!-- END API PartnerId-->
@ -84,7 +85,12 @@
<add key="guavaPay_base_url" value="https://test.remiton.pro/api" />
<add key="guavaPay_clint_Id" value="f3d564dadcb5a4fe9ed0c06da6e3bb5785405bbf" />
<add key="guavaPay_secret_key" value="7cf3288cc67d4a2b965a5d41a4005fc1123fa64081" />
<!--Ali Pay Remit API UAT-->
<add key="aliPay_base_url" value="https://open-sea.alipay.com/aps/api/sandbox/transfer" />
<add key="aliPay_clint_Id" value="SANDBOX_5Y3A5W2YEMT604244" />
<add key="aliPay_private_key" value="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDyLMnsV55WZdZd rXqrw5u3mfMrPbm4SbrK4xrHWCLBgw9gfv7wj26tw2GPDfSHQl/1qTP3m4NuKQFJ qJ0gg0YY2CZyabMN5BvkX6EZziwPahDlwsjok0tri8njH44wibgjrI6qAA0itfr+ 8/era2uPz6nUmoCDeRSH/60RajK0lEtakLXFHhSNAv7KDJEPaikhDyXuVxKRi6jw jIEhhjZjziCYvK2q/4snoMTQk/ctm2ZxlgEueUpm5UTibiDAcwzh7UgR7+7wLlvE B9q1dETUASWFECdKXP2aK6ujMn4U8s71DxCDZAhOfiAvDjH+QjpZSFRaSIpShPQZ rbc//rn3AgMBAAECggEBAK51rZFhHWPIQUGC89hBNjBx60e/U8d69eGq8WOiDoex TqaJVkceTPFIy0MvHnVCT7a9if5aPbhiOddCbM87QogrTqclliPvrFg8u+XHLN59 3mZmiC1jzvVO4sWHufsle03XxX6aQtw6lPKN9mG7JOWZCBNsqiAMXcoLWjYtdxG2 TEKT/Pkf4JQ4mO0GiJA/DBYe5CpeH1gsBOMC6iC1NaRDUgGFT0LqTNzqZrHYNjdg MBFBxphHtNPhybWFXHNP47zGFeqksvS/pNG40zldPehishLRzN3u0QO43tYQ8yyY AugP6bWQ/tLLD8ItOebk0EGePpchr4jRzuOhvEqlo+ECgYEA+izi/Pme4chGJMi6 P1v4gyiM+ui2SKDSUZl4Bld9skwdt8gtRRGVQjpia00YOZU8vJtcnMrwBOByWFag hcr3vMAFWABKSYTmu2J/3OL4BTp298NT3uP6M9IpGggYA57E8KK7HkA4VZ/Nawgo IPazLHL6Zi2mAjYyFmm4xxDg1WUCgYEA99A3tlaFdRKNinCMOKJ2l3nTgznYADHc V5WAz+D2ag6pPVg1nDgFc7ljYCY0A2/zCyvHZLmFr9PB6H5ykG+XV0PA1sDiG4gc 0yYBr4L4L4TjX7iPwZR/0Hg0WpBeS12WeqiMuDaptha5XprCFVhWTDjGkNDSePU1 3mq+Fg06OisCgYB284rGEAZsgmZfrRVpdNh3vHsz/hxV8imuZNM96LG6ahijPsnP kmmuwMX1EQYYsw3a++AQKSnwl6umtyHCG9ypYX/o9NJdnJR8unvjUgPtsHvKmJQz YaCgrSef2gNZDU/EvwtLeeuPQtlQL+OssMBGvTC0DrZlTNGJ+KDD/hF5RQKBgAgM 4pJw0xsPhDuYFmYMmQ+orH9Z1LOE6ySJPcsDAt5FJahRgkRV6Y9t2VWZSB1IeLvH K04RXM9ucKEt4mjgxyjVkaEoWPAOBumxFWLvPULF7WEBrOHcAh7ymLjMcdO+8ZGA gjnFxNOef10cZ+url/oX6hNwRTYauSpFi3FJ8rdLAoGAC5BKhBLzvD4kCyFOF7yG VVJAn61T5IV3TMb+hT5LeeOWkY9adOvktZeTTW3ir7v3wJgdjdnbJEeivoMYS7h5 GoXXbOLf+dvnGyYl+eQDZROqYdicQP8ZdJLuwR4YUK+A7LDkffRJ7dZcxBYlUZXm sOSne6bVc+pNZq44b8daSGQ=" />
<!--SendMN Remit API UAT -->
<add key="sendmn_base_url" value="http://dev-server-sendmn.eastus.cloudapp.azure.com/api" />
<add key="sendmn_user_name" value="IME Agent" />

Loading…
Cancel
Save