using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using RestEase; namespace ePaymentsApiConsoleApp { /// /// The example shows how to send request to ePayments api using signing by .pem certificate /// public class Program { // Init constants // KeyId private const string KeyId = "KeyId"; // .pem extension certificate file path private const string Pem = "PemCertificateFilePath.pem"; // ePayments api url private const string Api = "https://api.sandbox.epayments.com/"; /// /// Main method /// /// /// static async Task Main(string[] args) { await FetchTransactions(); await FetchUserAsync(); } /// /// Example request /// The method returns Transaction list using signing by a .pem certificate /// In case if body is not empty, api.Signature field should take the signature of body request by .pem certificate /// /// public static async Task FetchTransactions() { var transactionListRequest = new TransactionListRequest() { From = 1, Take = 10 }; var body = JsonConvert.SerializeObject(transactionListRequest); var api = RestClient.For(Api); api.Signature = SignBy(body, Pem); api.KeyId = KeyId; api.UserAgent = $".net {Environment.Version}"; var transactions = await api.FetchTransactions(transactionListRequest); } /// /// Example request /// The method returns user information using signing by a .pem certificate /// In case if body is empty, api.Signature field should take the signature of request url by .pem certificate /// /// public static async Task FetchUserAsync() { var api = RestClient.For(Api); api.Signature = SignBy($"{Api}v1/user", Pem); api.KeyId = KeyId; var user = await api.FetchUserAsync(); } /// /// Make a sign of the message by .pem certificate /// /// private static string SignBy(string message, string pem) { var pr = new PemReader(new StringReader(File.ReadAllText(pem))); var keyPair = (AsymmetricCipherKeyPair)pr.ReadObject(); var rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyPair.Private); using(var csp = new RSACryptoServiceProvider()) { csp.ImportParameters(rsaParams); var bytes = Encoding.UTF8.GetBytes(message); var inArray = csp.SignData(bytes, (object) CryptoConfig.MapNameToOID("SHA512")); return Convert.ToBase64String(inArray); } } } /// /// Api interface for RestClient /// public interface IApi { [Header("user-agent")] string UserAgent { get; set; } [Header("X-Signature")] string Signature { get; set; } [Header("X-Key-Id")] string KeyId { get; set; } [Get("v1/user")] Task FetchUserAsync(); [Post("v3/Transactions")] Task FetchTransactions([Body] TransactionListRequest request); } /// /// TrasactionResponse model /// public class TransactionResponse { public TransactionItem[] Transactions { get; set; } public class TransactionItem { public string OperationId { get; set; } // ... } } /// /// TransactionListRequest model /// public class TransactionListRequest { public int Take { get; set; } public int From { get; set; } // ... } }