Подпись Amazon MWS — Delphi

Я написал приложение в Delphi для синхронизации между несколькими витринами. Кажется, я столкнулся с проблемой, когда дело доходит до подписи. Мой сценарий таков:

Когда я запускаю Orders API для Amazon, он примет подпись и успешно загрузит все заказы. У меня не было никаких проблем, когда дело доходит до этого.

Теперь, когда я переключаюсь на API отчетов, он не будет за исключением подписи. Вот функция подписи, которую я использую

hmac_SHA256_inits(hmc, FSecretAccessKey);
s := StringToSign;
hmac_SHA256_update(hmc, @(s[1]), Length(s));
hmac_SHA256_final(hmc, hmd);
SetLength(sBin, 32);
for i := 0 to 31
 do sBin[i+1] := AnsiChar(hmd[i]);

Result := Base64Encode(sBin);
Result := StringReplace(Result, '+', '%2B', [rfReplaceAll]);
Result := StringReplace(Result, '=', '%3D', [rfReplaceAll]);

Я даже запускал его с той же отметкой времени, что и блокнот MWS, чтобы сравнить сигнатуры, и они получаются разными. Тем не менее, строка для подписи точно такая же, слово в слово, с заглавными буквами. Я бы подумал, что это может быть процедура подписания, но тогда как API заказов будет работать без каких-либо проблем, если процедура будет неправильной? Единственное существенное различие, которое я вижу в них, заключается в том, что для API заказов вы должны использовать

POST /Orders/2011-01-01 ParamterString

и отчет один

POST / ПараметрСтрока

Может ли сольная косая черта вызвать сбой подписи? Я перепробовал все, что мог, чтобы исправить это, и на самом деле я рассматриваю возможность отказа от проекта в пользу другого языка.

Любая помощь будет принята с благодарностью


person aport002    schedule 10.09.2013    source источник
comment
Каково происхождение функций SHA256, которые вы используете? Вы их написали, сторонняя библиотека или...?   -  person alcalde    schedule 11.09.2013
comment
Вы решили это? Я тоже застрял, пытаясь сгенерировать подпись для моих запросов MWS в Delphi. Если вам это удалось, не могли бы вы указать правильное направление в отношении того, какие библиотеки SHA/HMAC использовать?   -  person MiGz    schedule 07.05.2014


Ответы (1)


Ваша проблема, скорее всего, в вашей функции StringToSign. Это должно выглядеть примерно так:

StringToSign := 'POST'+ chr(13)+ 
                 AmazonMWShost + chr(13) + 
                 '/'+ APIurl + chr(13) + 
                 URLencodedParameters;

Где AmazonMWShost — mws.amazonservices.com для продавцов из США. APIurl — это пустая строка для Report API и Orders/2011-01-01 для Order API.

person Hazzit    schedule 12.09.2013
comment
Я знаю, что это старый поток, но это может помочь другим... Амазонка использует символ конца строки — Chr(10), а не Chr(13), как упоминалось выше. Кроме того, если вы используете Indy для POST данных, не забудьте добавить :443 в конце конечной точки (AmazonMWShost+':443'), чтобы правильно рассчитать подпись, так как она добавит это к элементу строки заголовка Host и Amazon будет использовать это значение для расчета подписи на своей стороне. - person MiGz; 10.05.2014