Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 51 additions & 40 deletions V5_demo/api_demo/Encryption_HMAC.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
#define WIN32_LEAN_AND_MEAN

#define CPPHTTPLIB_OPENSSL_SUPPORT

#include <chrono>
#include <iomanip>
#include <iostream>
#include <map>
#include <vector>
#include <sstream>
#include <chrono>
#include <iomanip> // for setfill and setw
#include <openssl/hmac.h>
#include <nlohmann/json.hpp>

#include <httplib.h>
#include <nlohmann/json.hpp>
#include <openssl/hmac.h>

class Encryption {
private:
Expand All @@ -21,6 +21,7 @@ class Encryption {
public:
void PlaceOrder();
void GetOpenOrder();

private:
static std::string GeneratePostSignature(const nlohmann::json& parameters);
static std::string GenerateGetSignature(const nlohmann::json& parameters);
Expand All @@ -30,46 +31,56 @@ class Encryption {

const std::string Encryption::ApiKey = "xxxxxxxxxxxxxxxx";
const std::string Encryption::ApiSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const std::string Encryption::Timestamp = std::to_string(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
const std::string Encryption::Timestamp = std::to_string(
std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()
).count()
);
const std::string Encryption::RecvWindow = "5000";

std::string Encryption::GeneratePostSignature(const nlohmann::json& parameters) {
std::string paramJson = parameters.dump();
std::string rawData = Timestamp + ApiKey + RecvWindow + paramJson;
const std::string paramJson = parameters.dump();
const std::string rawData = Timestamp + ApiKey + RecvWindow + paramJson;
return ComputeSignature(rawData);
}

std::string Encryption::GenerateGetSignature(const nlohmann::json& parameters) {
std::string queryString = GenerateQueryString(parameters);
std::string rawData = Timestamp + ApiKey + RecvWindow + queryString;
const std::string queryString = GenerateQueryString(parameters);
const std::string rawData = Timestamp + ApiKey + RecvWindow + queryString;
return ComputeSignature(rawData);
}

std::string Encryption::ComputeSignature(const std::string& data) {
unsigned char* digest = HMAC(EVP_sha256(), ApiSecret.c_str(), static_cast<int>(ApiSecret.length()),
(unsigned char*)data.c_str(), static_cast<int>(data.size()), NULL, NULL);
unsigned char* digest = HMAC(
EVP_sha256(),
ApiSecret.c_str(),
static_cast<int>(ApiSecret.length()),
reinterpret_cast<const unsigned char*>(data.c_str()),
static_cast<int>(data.size()),
nullptr,
nullptr
);

std::ostringstream result;
for (size_t i = 0; i < 32; i++) {
result << std::hex << std::setw(2) << std::setfill('0') << (int)digest[i];
result << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(digest[i]);
}

return result.str();
}

std::string Encryption::GenerateQueryString(const nlohmann::json& parameters) {
std::ostringstream oss;
std::ostringstream query;
for (const auto& item : parameters.items()) {
std::string key = item.key();
std::string value = item.value().get<std::string>();
oss << key << "=" << value << "&";
query << item.key() << "=" << item.value().get<std::string>() << "&";
}
std::string result = oss.str();
return result.substr(0, result.length() - 1); // Remove trailing '&'

const std::string result = query.str();
return result.substr(0, result.length() - 1);
}

void Encryption::PlaceOrder() {
nlohmann::json parameters = {
const nlohmann::json parameters = {
{"category", "linear"},
{"symbol", "BTCUSDT"},
{"side", "Buy"},
Expand All @@ -80,51 +91,51 @@ void Encryption::PlaceOrder() {
{"timeInForce", "GTC"}
};

std::string signature = Encryption::GeneratePostSignature(parameters);
std::string jsonPayload = parameters.dump();
const std::string signature = GeneratePostSignature(parameters);
const std::string jsonPayload = parameters.dump();

httplib::SSLClient client("api-testnet.bybit.com", 443); // 443 is the default port for HTTPS
httplib::Headers headers = {
httplib::SSLClient client("api-testnet.bybit.com", 443);
const httplib::Headers headers = {
{"X-BAPI-API-KEY", ApiKey},
{"X-BAPI-SIGN", signature},
{"X-BAPI-SIGN-TYPE", "2"},
{"X-BAPI-TIMESTAMP", Timestamp},
{"X-BAPI-RECV-WINDOW", RecvWindow}
};

auto res = client.Post("/v5/order/create", headers, jsonPayload, "application/json");
if (res) {
std::cout << res->body << std::endl;
const auto response = client.Post("/v5/order/create", headers, jsonPayload, "application/json");
if (response) {
std::cout << response->body << std::endl;
}
}

void Encryption::GetOpenOrder() {
std::map<std::string, std::string> parameters = {
const std::map<std::string, std::string> parameters = {
{"category", "linear"},
{"symbol", "BTCUSDT"}
};

std::string signature = Encryption::GenerateGetSignature(parameters);
std::string queryString = Encryption::GenerateQueryString(parameters);
const std::string signature = GenerateGetSignature(parameters);
const std::string queryString = GenerateQueryString(parameters);

httplib::SSLClient client("api-testnet.bybit.com", 443); // 443 is the default port for HTTPS
httplib::Headers headers = {
httplib::SSLClient client("api-testnet.bybit.com", 443);
const httplib::Headers headers = {
{"X-BAPI-API-KEY", ApiKey},
{"X-BAPI-SIGN", signature},
{"X-BAPI-SIGN-TYPE", "2"},
{"X-BAPI-TIMESTAMP", Timestamp},
{"X-BAPI-RECV-WINDOW", RecvWindow}
};

auto res = client.Get(("/v5/order/realtime?" + queryString).c_str(), headers);
if (res) {
std::cout << res->body << std::endl;
const auto response = client.Get(("/v5/order/realtime?" + queryString).c_str(), headers);
if (response) {
std::cout << response->body << std::endl;
}
}

int main() {
Encryption encryptionTest;
encryptionTest.PlaceOrder();
encryptionTest.GetOpenOrder();
Encryption encryption;
encryption.PlaceOrder();
encryption.GetOpenOrder();
return 0;
}
}
27 changes: 13 additions & 14 deletions V5_demo/api_demo/Encryption_HMAC.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
Expand All @@ -14,9 +13,9 @@ public class Encryption

public static void Main()
{
var encryptionTest = new Encryption();
encryptionTest.PlaceOrder();
encryptionTest.GetOpenOrder();
var encryption = new Encryption();
encryption.PlaceOrder();
encryption.GetOpenOrder();
}

public void PlaceOrder()
Expand All @@ -33,11 +32,11 @@ public void PlaceOrder()
{"timeInForce", "GTC"}
};

string signature = GeneratePostSignature(parameters);
string jsonPayload = JsonConvert.SerializeObject(parameters);
var signature = GeneratePostSignature(parameters);
var jsonPayload = JsonConvert.SerializeObject(parameters);

using var client = new HttpClient();
HttpRequestMessage request = new(HttpMethod.Post, "https://api-testnet.bybit.com/v5/order/create")
var request = new HttpRequestMessage(HttpMethod.Post, "https://api-testnet.bybit.com/v5/order/create")
{
Content = new StringContent(jsonPayload, Encoding.UTF8, "application/json")
};
Expand All @@ -60,8 +59,8 @@ public void GetOpenOrder()
{"symbol", "BTCUSDT"}
};

string signature = GenerateGetSignature(parameters);
string queryString = GenerateQueryString(parameters);
var signature = GenerateGetSignature(parameters);
var queryString = GenerateQueryString(parameters);

using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, $"https://api-testnet.bybit.com/v5/order/realtime?{queryString}");
Expand All @@ -77,8 +76,8 @@ public void GetOpenOrder()

private static string GeneratePostSignature(IDictionary<string, object> parameters)
{
string paramJson = JsonConvert.SerializeObject(parameters);
string rawData = Timestamp + ApiKey + RecvWindow + paramJson;
var paramJson = JsonConvert.SerializeObject(parameters);
var rawData = Timestamp + ApiKey + RecvWindow + paramJson;

using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(ApiSecret));
var signature = hmac.ComputeHash(Encoding.UTF8.GetBytes(rawData));
Expand All @@ -87,16 +86,16 @@ private static string GeneratePostSignature(IDictionary<string, object> paramete

private static string GenerateGetSignature(Dictionary<string, object> parameters)
{
string queryString = GenerateQueryString(parameters);
string rawData = Timestamp + ApiKey + RecvWindow + queryString;
var queryString = GenerateQueryString(parameters);
var rawData = Timestamp + ApiKey + RecvWindow + queryString;

return ComputeSignature(rawData);
}

private static string ComputeSignature(string data)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(ApiSecret));
byte[] signature = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
var signature = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
return BitConverter.ToString(signature).Replace("-", "").ToLower();
}

Expand Down
Loading