API de Amazon MWS Scratchpad

Estoy intentando que Amazon MWS Scratchpad funcione, pero me sigue dando un mensaje:

La firma de solicitud que calculamos no coincide con la firma que proporcionó. Verifique su clave de acceso secreta de AWS y el método de firma. Consulte la documentación del servicio para más detalles.

Estaba buscando un tema similar aquí, pero nada realmente útil. Entonces, aquí está el código:

$params = array( 'AWSAccessKeyId' => AWS_ACCESS_KEY_ID, 'Action' => "GetLowestOfferListingsForASIN", 'SellerId' => MERCHANT_ID, 'SignatureMethod' => "HmacSHA256", 'SignatureVersion' => "2", 'Timestamp' => gmdate("Ymd\TH:i:s\Z", time()), 'Version' => "2011-10-01", 'MarketplaceId' => MARKETPLACE_ID, 'ItemCondition' => "new", 'ASINList.ASIN.1' => "B001T6OP32"); $url = array(); foreach($params as $key => $val){ $val = str_replace('%7E', '~', rawurlencode($val)); $url[] = $key . '=' . $val; } $uri = implode('&', $url); $string_to_sign = 'POST'; $string_to_sign .= "\n"; $string_to_sign .= 'mws.amazonservices.co.uk' . "\n"; $string_to_sign .= '/Products/2011-10-01' . "\n"; $string_to_sign .= $uri; $signature = hash_hmac("sha256", $string_to_sign, AWS_SECRET_ACCESS_KEY, TRUE); $signature = base64_encode($signature); $signature = urlencode($signature); $signature = str_replace("%7E", "~", $signature); $url = 'https://mws.amazonservices.co.uk/'; $url .= 'Products/2011-10-01' . '?' . $uri . "&Signature=" . $signature; 

Apuesto a que el problema es con Signature, cuando lo imprimo con print $signature , siempre contiene % símbolos, y cuando estoy comparando con la página de detalles de solicitud de Amazon Scratchpad , campo SHA 256 HMAC , no hay ninguno.

Maby, hay algo que no puedo ver? Estaba buscando espacios en la clave de acceso secreta, se ve bien.

Muchas gracias.

Versión de trabajo:

 $param = array(); $param['AWSAccessKeyId'] = AWS_ACCESS_KEY_ID; $param['Action'] = 'GetLowestOfferListingsForASIN'; $param['SellerId'] = MERCHANT_ID; $param['SignatureMethod'] = 'HmacSHA256'; $param['SignatureVersion'] = '2'; $param['Timestamp'] = gmdate("Ymd\TH:i:s.\\0\\0\\0\\Z", time()); $param['Version'] = '2011-10-01'; $param['MarketplaceId'] = MARKETPLACE_ID; $param['ItemCondition'] = 'new'; $param['ASINList.ASIN.1'] = << ITEM ASIN >>; $url = array(); foreach ($param as $key => $val) { $key = str_replace("%7E", "~", rawurlencode($key)); $val = str_replace("%7E", "~", rawurlencode($val)); $url[] = "{$key}={$val}"; } sort($url); $arr = implode('&', $url); $sign = 'GET' . "\n"; $sign .= 'mws.amazonservices.co.uk' . "\n"; $sign .= '/Products/2011-10-01' . "\n"; $sign .= $arr; $signature = hash_hmac("sha256", $sign, AWS_SECRET_ACCESS_KEY, true); $signature = urlencode(base64_encode($signature)); $link = "https://mws.amazonservices.co.uk/Products/2011-10-01?"; $link .= $arr . "&Signature=" . $signature; 

Cargue $link con curl y vualia!

Para comenzar a acceder a Amazon MWS desde PHP, puede descargar la biblioteca del cliente para la API MWS de Amazon que le interese utilizar, como la API de productos a la que hizo referencia.

Elija un ejemplo del directorio src/MarketplaceWebServiceProducts/Samples , complete sus valores únicos y ejecútelo.

Los ejemplos implementan la autenticación utilizando la clase MarketplaceWebServiceProducts_Client en src/MarketplaceWebServiceProducts/Client.php que muestra cómo firmar correctamente una solicitud.