Ich versuche, eine Signatur zu berechnen Amazon Marketplace API-Aufrufe zu machen, aber ich bekomme immer folgende Fehlermeldung:Probleme Berechnung Signatur für Amazon Marketplace API
The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
ich den Signaturerstellungsprozesses in eine eingewickelt habe Klasse:
<?php
namespace App\Marketplace\Amazon;
class Signature
{
protected $signedString;
public function __construct($url, array $parameters, $secretAccessKey)
{
$stringToSign = $this->calculateStringToSign($url, $parameters);
$this->signedString = $this->sign($stringToSign, $secretAccessKey);
}
protected function calculateStringToSign($url, array $parameters)
{
$url = parse_url($url);
$string = "POST\n";
$string .= $url['host'] . "\n";
$string .= $url['path'] . "\n";
$string .= $this->getParametersAsString($parameters);
return $string;
}
protected function sign($data, $secretAccessKey)
{
return base64_encode(hash_hmac('sha256', $data, $secretAccessKey, true));
}
protected function getParametersAsString(array $parameters)
{
uksort($parameters, 'strcmp');
$queryParameters = [];
foreach ($parameters as $key => $value) {
$queryParameters[$key] = $this->urlEncode($value);
}
return http_build_query($queryParameters);
}
protected function urlEncode($value)
{
return str_replace('%7E', '~', rawurlencode($value));
}
public function __toString()
{
return $this->signedString;
}
}
Aber ich kann nicht für das Leben von mir sehen, wo ich falsch liege. Ich habe den Leitfaden in der API verfolgt und das Java-Beispiel sowie das veraltete Marketplace PHP SDK * betrachtet.
EDIT: Und hier ist, wie ich die Signature
Klasse bin mit:
$version = '2011-07-01';
$url = 'https://mws.amazonservices.com/Sellers/'.$version;
$timestamp = gmdate('c', time());
$parameters = [
'AWSAccessKeyId' => $command->accessKeyId,
'Action' => 'GetAuthToken',
'SellerId' => $command->sellerId,
'SignatureMethod' => 'HmacSHA256',
'SignatureVersion' => 2,
'Timestamp' => $timestamp,
'Version' => $version,
];
$signature = new Signature($url, $parameters, $command->secretAccessKey);
$parameters['Signature'] = strval($signature);
try {
$response = $this->client->post($url, [
'headers' => [
'User-Agent' => 'my-app-name',
],
'body' => $parameters,
]);
dd($response->getBody());
} catch (\Exception $e) {
dd(strval($e->getResponse()));
}
Als Nebenwirkung: Ich wissen die Marktdaten richtig sind, wie ich in dem Konto angemeldet haben und hat die Zugriffsschlüssel-, Geheim- und Verkäufer-IDs abgerufen.
* Ich verwende nicht das SDK, da es den API-Aufruf nicht unterstützt, den ich brauche: SubmitFeed
.
Ich bin nicht sicher, was der Körper Ihres 'amazonEncode()' Methode tut, aber ich scheine zu tun, was die Dokumentation in meinem 'Zeichen sagt()' Methode, aber mit den Funktionen 'base64_encode' und' hash_hmac'. Kannst du den Unterschied erklären? Außerdem ist die von Ihnen bereitgestellte Dokumentation für AWS und nicht für MWS. –
Es ist ähnlich, die Signatur-Generation für beide. Sie müssen URI das generierte base64 kodieren, was fast mein amazonEncode ist. –
Ich habe das Ergebnis meiner 'sign()' Methode in Ihrer 'amazonEncode()' Funktion eingeschlossen, aber ich bekomme immer noch 'SignatureDoesNotMatch' Fehler. –