Перейти к основному содержимому

Интеграция с серверной частью

Подпись запроса

к сведению

Все POST запросы содержат HTTP заголовок X-Auth-Signature, необходимый для подтверждения подлинности хоста. Эта операция позволяет отказаться от IP whitelist при интеграции, так как последний лишает возможности провайдера оперативно масштабироваться (горизонтально), не предупреждая при этом партнера.

не пропустите

Тело запроса не должно содержать пробелы и переносы строк.

Подпись запроса сериализуется клиентом в виде Base64-закодированной строки и передается в специальном HTTP-заголовке X-Auth-Signature.

Алгоритм проверки подписи:

  1. Предварительно между клиентом и сервером определяется секретный ключ в виде UUID (его можно получить у интеграционного менеджера)
  2. Сервер получает запрос от клиента, вычитывая подпись из HTTP-заголовка X-Auth-Signature.
  3. Тело запроса и секретный ключ (п.1) являются входными параметрами для функции HMAC-MD5, которая на выходе генерирует последовательность байтов.
  4. Байтовая последовательность (п.3) сериализуется в виде Base64-закодированной строки.
  5. Сервер производит сравнение результирующей строки (п.4) со строкой, полученной от клиента (п.2). Если они совпадают, подпись считается валидной.

Пример автоматического формирования подписи для POSTMAN клиента

  1. Добавьте следующий cURL в Postman(чтобы получить адрес хоста, обратитесь к своему менеджеру по интеграции)
curl --location '$HOST/game/round' \
--header 'Content-Type: application/json' \
--header 'X-Auth-Signature: .... ' \
--header 'Accept: text/html' \
--data '{"cid":"brand-name","playerId":"user-id","productId":"nft-aviatrix","roundId":"123456789","lang":"en"}'
  1. Добавьте переменную {{signature}}, как значение для хедера X-Auth-Signature
  2. Добавьте переменную {{secret}} и присвойте ей значение секретного ключа вашей интеграции используемый для создания подписи
  3. Добавьте следующий скрипт в запрос
const signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacMD5(pm.request.body.toString(), pm.collectionVariables.get("secret")));
pm.collectionVariables.set("signature", signature);

Примеры формирования подписи на Bash

Пустой JSON объект

MESSAGE='{}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> RVBMsFzKbgu9Bs6tSp5jBg==

/playerInfo JSON объект

MESSAGE='{"cid":"somebrand","sessionToken":"some4session7token5","timestamp":1234567890}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> uCYq/GK8ZOYZB5GdNq87Yw==

/bet JSON объект

MESSAGE='{"betId":"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1","cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlBsYWNlQmV0Iiwia2V5IjoiIn0=","roundId":"1234567","market":"result","outcome":"crash","specifier":"","odds":10000,"amount":1000,"currency":"EUR","roundClosed":false,"timestamp":1234567890,"bonusId":""}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> feQeeyYFxzuRVLLpMQPkZA==

/win JSON объект

MESSAGE='{"betId":"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1","cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlNldHRsZUJldCIsImtleSI6IiJ9","roundId":"1234567","market":"result","outcome":"crash","specifier":"","odds":10000,"amount":1000,"currency":"EUR","roundClosed":false,"timestamp":1234567890,"operation":"SettleBet","bonusId":""}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> gtk4+Vn4RYBv8A3HxQK4Lw==

/transactions/promoWin JSON объект

MESSAGE='{"cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlByb21vV2luIiwia2V5IjoiIn0=","amount":1000,"currency":"EUR","promo":{"type":"bonus","bonusId":"some1bonus2id"}}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> KNJx/uTGu0dn0SikyFF3rQ==

/closeMatch JSON объект

MESSAGE='{"cid":"somebrand","playerId":"someplayerid123","productId":"nft-aviatrix","matchId":"1234567","txId":"eyJiaWQiOiIxMjM0NS0xMjM0NTYiLCJvcCI6IkNsb3NlTWF0Y2giLCJrZXkiOiIifQ=="}'
SECRET="4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

echo -n $MESSAGE | openssl dgst -md5 -hmac $SECRET -binary | base64
> e114TJ6qfSaSHYTS1CR9AA==

Примеры формирования подписи на Python

Пустой JSON объект

message = '{}'
secret = '4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1'

signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()

print(encoded_signature)
> RVBMsFzKbgu9Bs6tSp5jBg==

/playerInfo JSON объект

message='{"cid":"somebrand","sessionToken":"some4session7token5","timestamp":1234567890}'
secret = '4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1'

signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()

print(encoded_signature)
> uCYq/GK8ZOYZB5GdNq87Yw==

/bet JSON объект

message='{"betId":"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1","cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlBsYWNlQmV0Iiwia2V5IjoiIn0=","roundId":"1234567","market":"result","outcome":"crash","specifier":"","odds":10000,"amount":1000,"currency":"EUR","roundClosed":false,"timestamp":1234567890,"bonusId":""}'
secret = '4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1'

signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()

print(encoded_signature)
> feQeeyYFxzuRVLLpMQPkZA==

/win JSON объект

message='{"betId":"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1","cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlNldHRsZUJldCIsImtleSI6IiJ9","roundId":"1234567","market":"result","outcome":"crash","specifier":"","odds":10000,"amount":1000,"currency":"EUR","roundClosed":false,"timestamp":1234567890,"operation":"SettleBet","bonusId":""}'
secret = '4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1'

signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()

print(encoded_signature)
> gtk4+Vn4RYBv8A3HxQK4Lw==

/transactions/promoWin JSON объект

message = '{"cid":"somebrand","sessionToken":"some4session7token5","playerId":"someplayerid123","productId":"nft-aviatrix","txId":"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlByb21vV2luIiwia2V5IjoiIn0=","amount":1000,"currency":"EUR","promo":{"type":"bonus","bonusId":"some1bonus2id"}}'
secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()

print(encoded_signature)
> KNJx/uTGu0dn0SikyFF3rQ==

/closeMatch JSON объект

message = '{"cid":"somebrand","playerId":"someplayerid123","productId":"nft-aviatrix","matchId":"1234567","txId":"eyJiaWQiOiIxMjM0NS0xMjM0NTYiLCJvcCI6IkNsb3NlTWF0Y2giLCJrZXkiOiIifQ=="}'
secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

signature = hmac.new(secret.encode(), msg=message.encode(), digestmod=hashlib.md5)
encoded_signature = base64.b64encode(signature.digest()).decode()

print(encoded_signature)
> e114TJ6qfSaSHYTS1CR9AA==

Примеры формирования подписи на Java

Пустой JSON объект

String message = "{}";
String secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

Mac sha256_HMAC = Mac.getInstance("HmacMD5");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacMD5");
sha256_HMAC.init(secret_key);

String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
> RVBMsFzKbgu9Bs6tSp5jBg==

/playerInfo JSON объект

String message = "{\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"timestamp\":1234567890}";
String secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

Mac sha256_HMAC = Mac.getInstance("HmacMD5");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacMD5");
sha256_HMAC.init(secret_key);

String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
> uCYq/GK8ZOYZB5GdNq87Yw==

/bet JSON объект

String message = "{\"betId\":\"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1\",\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlBsYWNlQmV0Iiwia2V5IjoiIn0=\",\"roundId\":\"1234567\",\"market\":\"result\",\"outcome\":\"crash\",\"specifier\":\"\",\"odds\":10000,\"amount\":1000,\"currency\":\"EUR\",\"roundClosed\":false,\"timestamp\":1234567890,\"bonusId\":\"\"}";
String secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

Mac sha256_HMAC = Mac.getInstance("HmacMD5");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacMD5");
sha256_HMAC.init(secret_key);

String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
> feQeeyYFxzuRVLLpMQPkZA==

/win JSON объект

String message = "{\"betId\":\"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1\",\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlNldHRsZUJldCIsImtleSI6IiJ9\",\"roundId\":\"1234567\",\"market\":\"result\",\"outcome\":\"crash\",\"specifier\":\"\",\"odds\":10000,\"amount\":1000,\"currency\":\"EUR\",\"roundClosed\":false,\"timestamp\":1234567890,\"operation\":\"SettleBet\",\"bonusId\":\"\"}";
String secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

Mac sha256_HMAC = Mac.getInstance("HmacMD5");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacMD5");
sha256_HMAC.init(secret_key);

String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
> gtk4+Vn4RYBv8A3HxQK4Lw==

/transactions/promoWin JSON объект

String message = "{\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlByb21vV2luIiwia2V5IjoiIn0=\",\"amount\":1000,\"currency\":\"EUR\",\"promo\":{\"type\":\"bonus\",\"bonusId\":\"some1bonus2id\"}}";
String secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

Mac sha256_HMAC = Mac.getInstance("HmacMD5");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacMD5");
sha256_HMAC.init(secret_key);

String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
> KNJx/uTGu0dn0SikyFF3rQ==

/closeMatch JSON объект

String message = "{\"cid\":\"somebrand\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"matchId\":\"1234567\",\"txId\":\"eyJiaWQiOiIxMjM0NS0xMjM0NTYiLCJvcCI6IkNsb3NlTWF0Y2giLCJrZXkiOiIifQ==\"}";
String secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

Mac sha256_HMAC = Mac.getInstance("HmacMD5");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacMD5");
sha256_HMAC.init(secret_key);

String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
> e114TJ6qfSaSHYTS1CR9AA==

Примеры формирования подписи на PHP

Пустой JSON объект

$message = "{}";
$secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

$signature = hash_hmac('md5', $message, $secret, true);
$encodedSignature = base64_encode($signature);

echo $encodedSignature;
> RVBMsFzKbgu9Bs6tSp5jBg==

/playerInfo JSON объект

$message = "{\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"timestamp\":1234567890}";
$secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

$signature = hash_hmac('md5', $message, $secret, true);
$encodedSignature = base64_encode($signature);

echo $encodedSignature;
> uCYq/GK8ZOYZB5GdNq87Yw==

/bet JSON объект

$message = "{\"betId\":\"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1\",\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlBsYWNlQmV0Iiwia2V5IjoiIn0=\",\"roundId\":\"1234567\",\"market\":\"result\",\"outcome\":\"crash\",\"specifier\":\"\",\"odds\":10000,\"amount\":1000,\"currency\":\"EUR\",\"roundClosed\":false,\"timestamp\":1234567890,\"bonusId\":\"\"}";
$secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

$signature = hash_hmac('md5', $message, $secret, true);
$encodedSignature = base64_encode($signature);

echo $encodedSignature;
> feQeeyYFxzuRVLLpMQPkZA==

/win JSON объект

$message = "{\"betId\":\"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1\",\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlNldHRsZUJldCIsImtleSI6IiJ9\",\"roundId\":\"1234567\",\"market\":\"result\",\"outcome\":\"crash\",\"specifier\":\"\",\"odds\":10000,\"amount\":1000,\"currency\":\"EUR\",\"roundClosed\":false,\"timestamp\":1234567890,\"operation\":\"SettleBet\",\"bonusId\":\"\"}";
$secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

$signature = hash_hmac('md5', $message, $secret, true);
$encodedSignature = base64_encode($signature);

echo $encodedSignature;
> gtk4+Vn4RYBv8A3HxQK4Lw==

/transactions/promoWin JSON объект

$message = "{\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlByb21vV2luIiwia2V5IjoiIn0=\",\"amount\":1000,\"currency\":\"EUR\",\"promo\":{\"type\":\"bonus\",\"bonusId\":\"some1bonus2id\"}}";
$secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

$signature = hash_hmac('md5', $message, $secret, true);
$encodedSignature = base64_encode($signature);

echo $encodedSignature;
> KNJx/uTGu0dn0SikyFF3rQ==

/closeMatch JSON объект

$message = "{\"cid\":\"somebrand\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"matchId\":\"1234567\",\"txId\":\"eyJiaWQiOiIxMjM0NS0xMjM0NTYiLCJvcCI6IkNsb3NlTWF0Y2giLCJrZXkiOiIifQ==\"}";
$secret = "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1";

$signature = hash_hmac('md5', $message, $secret, true);
$encodedSignature = base64_encode($signature);

echo $encodedSignature;
> e114TJ6qfSaSHYTS1CR9AA==

Примеры формирования подписи на Go

Пустой JSON объект

message := "{}"
secret := "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

h := hmac.New(md5.New, []byte(secret))
h.Write([]byte(message))

encodedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))

fmt.Println(encodedSignature)
> RVBMsFzKbgu9Bs6tSp5jBg==

/playerInfo JSON объект

message := "{\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"timestamp\":1234567890}"
secret := "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

h := hmac.New(md5.New, []byte(secret))
h.Write([]byte(message))

encodedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))

fmt.Println(encodedSignature)
> uCYq/GK8ZOYZB5GdNq87Yw==

/bet JSON объект

message := "{\"betId\":\"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1\",\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlBsYWNlQmV0Iiwia2V5IjoiIn0=\",\"roundId\":\"1234567\",\"market\":\"result\",\"outcome\":\"crash\",\"specifier\":\"\",\"odds\":10000,\"amount\":1000,\"currency\":\"EUR\",\"roundClosed\":false,\"timestamp\":1234567890,\"bonusId\":\"\"}"
secret := "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

h := hmac.New(md5.New, []byte(secret))
h.Write([]byte(message))

encodedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))

fmt.Println(encodedSignature)
> feQeeyYFxzuRVLLpMQPkZA==

/win JSON объект

message := "{\"betId\":\"1a2b3c4d-6f5e-4d3c-b2a1-f6e5d4c3b2a1\",\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlNldHRsZUJldCIsImtleSI6IiJ9\",\"roundId\":\"1234567\",\"market\":\"result\",\"outcome\":\"crash\",\"specifier\":\"\",\"odds\":10000,\"amount\":1000,\"currency\":\"EUR\",\"roundClosed\":false,\"timestamp\":1234567890,\"operation\":\"SettleBet\",\"bonusId\":\"\"}"
secret := "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

h := hmac.New(md5.New, []byte(secret))
h.Write([]byte(message))

encodedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))

fmt.Println(encodedSignature)
> gtk4+Vn4RYBv8A3HxQK4Lw==

/transactions/promoWin JSON объект

message := "{\"cid\":\"somebrand\",\"sessionToken\":\"some4session7token5\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"txId\":\"eyJiaWQiOiIxYTJiM2M0ZC02ZjVlLTRkM2MtYjJhMS1mNmU1ZDRjM2IyYTEiLCJvcCI6IlByb21vV2luIiwia2V5IjoiIn0=\",\"amount\":1000,\"currency\":\"EUR\",\"promo\":{\"type\":\"bonus\",\"bonusId\":\"some1bonus2id\"}}"
secret := "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

h := hmac.New(md5.New, []byte(secret))
h.Write([]byte(message))

encodedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))

fmt.Println(encodedSignature)
> KNJx/uTGu0dn0SikyFF3rQ==

/closeMatch JSON объект

message := "{\"cid\":\"somebrand\",\"playerId\":\"someplayerid123\",\"productId\":\"nft-aviatrix\",\"matchId\":\"1234567\",\"txId\":\"eyJiaWQiOiIxMjM0NS0xMjM0NTYiLCJvcCI6IkNsb3NlTWF0Y2giLCJrZXkiOiIifQ==\"}"
secret := "4d3c2b1a-6f5e-4d3c-b2a1-f6e5d4c3b2a1"

h := hmac.New(md5.New, []byte(secret))
h.Write([]byte(message))

encodedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))

fmt.Println(encodedSignature)
> e114TJ6qfSaSHYTS1CR9AA==