Быстрое исправление протокола C++: RawData (тег 96) требует подписи в кодировке Base64. Работает, когда я реализую это нC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Быстрое исправление протокола C++: RawData (тег 96) требует подписи в кодировке Base64. Работает, когда я реализую это н

Сообщение 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')
На данный момент я не знаю, как реализовать этот алгоритм на C++, поэтому вручную скопировал строку необработанных данных (сгенерированную с помощью скрипта Python) и использовал setField(), чтобы добавить ее в систему входа в систему. сообщение, как показано ниже. В результате появляется сообщение об отклонении входа в систему «Подпись для этого запроса недействительна».
Хотя для создания подписи требуется ввод временной метки, эта ошибка не связана с задержкой во времени копирования подписи. , компиляция и запуск программы на C++. Отправка сообщения FIX через слишком долгое время после создания созданной метки времени приведет к следующей ошибке: Отметка времени для этого запроса находится за пределами RecvWindow.
Это проблема, специфичная для c++, или это исправит реализация алгоритма хеширования в c++?

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

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=FIX.4.4|9=248|35=A|34=1|49=sendercompid|52=20250102-15:38:55.546|56=SPOT|95=88|96=CkY08Cf3xrN4MwAdl/Kblj2aHrGx T2sS1URZ/VM0mksR1tQd6hHQ5bda0oNSIED/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=Подпись для этого запроса отсутствует допустимо.|10=238|

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

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

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

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

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

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