Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибок в подписи Amazon MWS при использовании Delphi XE7 и Indy

Delphi , Синтаксис , Шифрование

При работе с Amazon MWS (Marketplace Web Service) важным аспектом является создание корректной подписи для аутентификации запросов. В данной статье рассматривается проблема, связанная с генерацией подписи в среде Delphi XE7 с использованием компонентов Indy, и предлагается решение этой проблемы.

Проблема

Пользователь столкнулся с проблемой, при которой подпись, сгенерированная в Delphi XE7 с использованием Indy для HTTP POST и HMAC с алгоритмом SHA256, не совпадала с подписью, полученной в PHP. Это приводило к ошибке при попытке выполнения запроса к Amazon MWS.

Контекст проблемы

Пользователь использовал следующий код для генерации подписи:

function GenerateSignature(const AData, AKey: string): string;
var
   AHMAC: TIdBytes;
begin
   IdSSLOpenSSL.LoadOpenSSLLibrary;
   With TIdHMACSHA256.Create do
   try
      Key:= ToBytes(AKey, IndyTextEncoding_UTF16LE);
      AHMAC:= HashValue(ToBytes(AData, IndyTextEncoding_UTF16LE));
      Result:= TIdEncoderMIME.EncodeBytes(AHMAC);
   finally
      Free;
   end;
end;

Однако, несмотря на использование кода в UTF16LE, который соответствует типу данных UnicodeString в Delphi, подпись, полученная в Delphi, отличалась от подписи, полученной в PHP.

Подтвержденное решение

Пользователь отмечает, что после обновления до последней версии Indy 10 из SVN, проблема с подписью была устранена. В Delphi, при использовании UTF-8, пример данных (ключ и значение) произвел тот же результат, что и в PHP. Это означает, что функция GenerateSignature корректно работает, если использовать IndyTextEncoding_UTF8 вместо IndyTextEncoding_UTF16LE.

Обновленный код для генерации подписи выглядит так:

function GenerateSignature(const AData, AKey: string): string;
var
   AHMAC: TIdBytes;
begin
   IdSSLOpenSSL.LoadOpenSSLLibrary;
   if not TIdHashSHA256.IsAvailable then
      raise Exception.Create('SHA-256 hashing is not available!');
   with TIdHMACSHA256.Create do
   try
      Key := IndyTextEncoding_UTF8.GetBytes(AKey);
      AHMAC := HashValue(IndyTextEncoding_UTF8.GetBytes(AData));
   finally
      Free;
   end;
   Result := TIdEncoderMIME.EncodeBytes(AHMAC);
end;

Альтернативные замечания и исправления

В коде MwsRequest были выявлены следующие проблемы:

  1. Утечка TIdSSLIOHandlerSocketOpenSSL - объект не имеет владельца и не освобождается.
  2. Неверный тип содержимого запроса - вместо text/xml следует использовать application/x-www-form-urlencoded.
  3. Данные для отправки (AQuery) должны быть переданы через поток AStream, а не включены в строку запроса.
  4. Использование TIdHTTP.Post с выводом в TStream и последующее преобразование в строку без учета кодировки может привести к ошибкам.

Исправленный код MwsRequest может выглядеть следующим образом:

function TgboAmazon.MwsRequest(...): string;
var
   ...
begin
   ...
   // Исправления здесь...
end;

Важно отметить, что в ответ от Amazon ожидается XML, поэтому лучше возвращать ответ как TStream или TBytes, чтобы избежать неправильной интерпретации кодировки.

Заключение

Проблема с генерацией подписи для Amazon MWS в Delphi XE7 и Indy была вызвана некорректным использованием кодировки UTF-16LE. Переключение на UTF-8 в функции GenerateSignature и исправление ошибок в функции MwsRequest помогли устранить проблему. Пользователю удалось получить совпадающие подписи в Delphi и PHP, используя предложенные изменения.

Создано по материалам из источника по ссылке.

Пользователь сталкивается с проблемой несоответствия подписей при работе с Amazon MWS из-за неверной кодировки в Delphi XE7, которую решает обновление Indy и корректное использование кодировки UTF-8.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шифрование ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 12:47:52/0.0032799243927002/0