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; }
// ...
}
}