Fix Protocol QuickFix C ++: RAWDATA (TAG 96) требует кодированной подписи BASE64. Работает, когда я внедряю его в PythonC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Fix Protocol QuickFix C ++: RAWDATA (TAG 96) требует кодированной подписи BASE64. Работает, когда я внедряю его в Python

Сообщение Anonymous »

Я пытаюсь реализовать библиотеку QuickFix на API Binance Fix. https://developers.binance.com/docs/bin ... et/fix-api. Я могу успешно получить ответ в системе входа, следуя инструкциям в приведенной выше документации, где инструкция по созданию подписи BASE64 записана в Python.

Код: Выделить всё

import base64

from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.hazmat.primitives.serialization import load_pem_private_key

def logon_raw_data(private_key: Ed25519PrivateKey,
sender_comp_id: str,
target_comp_id: str,
msg_seq_num: str,
sending_time: str):
"""
Computes the value of RawData (96) field in Logon message.
"""
payload = chr(1).join([
'A',
sender_comp_id,
target_comp_id,
msg_seq_num,
sending_time,
])
signature = private_key.sign(payload.encode('ASCII'))
return base64.b64encode(signature).decode('ASCII')

with open('private_key.pem', 'rb') as f:
private_key = load_pem_private_key(data=f.read(),
password=None)

raw_data = logon_raw_data(private_key,
sender_comp_id='5JQmUOsm',
target_comp_id='SPOT',
msg_seq_num='1',
sending_time='20240612-08:52:21.613')
< /code>
Я не знаю, как реализовать этот алгоритм в C ++ на данный момент, и вручную копировал строку RawData (сгенерированную с помощью сценария Python) и использовал SetField (), чтобы добавить ее в сообщение вход в систему, как показано ниже. Это приводит к тому, что «подпись для этого запроса не является действительным». Отправка сообщения FIX слишком долго после того, как сгенерированная метка времени дала бы следующую ошибку:  TimeStamp для этого запроса находится за пределами RecvWindow.void Application::toAdmin(FIX::Message &message, const FIX::SessionID &sessionID)
EXCEPT(FIX::DoNotSend) {
if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) {
std::string rawData = "CkY08Cf3xrN4MwAdl/Kblj2aHrGxT2sS1URZ/VM0mksR1tQd6hHQ5bda0oNSIeD/JI9cwPBJ4y2R2ZcVgy7oDQ==";
message.setField(FIX::RawDataLength(88));
message.setField(FIX::RawData(rawData));
message.setField(FIX::Username("myapikey"));
message.setField(FIX::StringField(25035, "1"));
}
}
Журналы ошибок:
Сообщение отправлено: (8 = исправление.4.4 | 9 = 248 | 35 = A | 34 = 1 | 49 = SenderCompid | 52 = 20250102-15: 38: 55,546 | 56 = Spot | 95 = 88 | 96 = CKY08CF3XRN4MWADL/KBLJ2AHRGX T2SS1URZ/VM0MKSR1TQD6HHQ5BDA0ONSID/JI9CWPBJ4Y2R2ZCVGY7ODQ == | 98 = 0 | 108 = 30 | 141 = Y | 553 = APIKEY | 25035 = 1 | 10 = 149 |)
Ответ: (8 = FIX.4.4 | 9 = 0000131 | 35 = 3 | 49 = Spot | 56 = Ryantest | 34 = 1 | 52 = 20250102-15: 38: 55,774913 | 45 = 1 | 372 = A | 373 = 8 | 25016 = -1022 | 58 =.>

Подробнее здесь: https://stackoverflow.com/questions/793 ... ignature-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»