Я сделал успешные платежи с помощью Amazon Login и Pay Express (на основе демонстрации здесь: https://github.com/amzn/pay-with-amazon-express-demo/tree/master/php).
Тем не менее, когда пользователь успешно совершает покупку, он перенаправляется обратно на мой URL-адрес возврата возврата с набором параметров, описывающих то, что он купил, и подписью для запроса, предоставленного Amazon.
Я попробовал приведенный ниже код, чтобы вычислить исходную подпись для проверки возвращенной подписи от Amazon, но этот код не генерирует совпадающую подпись с тем, что Amazon отправляет в URL-адресе возврата.
ExpressSuccess.php
<?php
echo ("<pre>");
print_r($_GET);
echo ("</pre>");
/* begin signature validation */
$merchantId = "************"; // SellerID
$accessKey = "*****************"; // MWS Access Key
$secretKey = "***********************"; // MWS Secret Key
$lwaClientId = "***********************"; // Login With Amazon Client ID
/* Add http:// or https:// before your Return URL
* The webpage of your site where the buyer should be redirected to after the payment is made
* In this example you can link it to the Result.php, which checks for the success or failure of the payment
* and routes it to the appropriate URL defined
*/
$returnURL = "http://localhost/demo/pay-with-amazon/ExpressSuccess.php";
$cancelReturnURL = "http://localhost/demo/pay-with-amazon/ExpressCancel.php";
$signatureReturned = $_GET['signature'];
$parameters = $_GET;
unset($parameters['signature']);
if(isset($parameters['sellerOrderId'])) {
$parameters['sellerOrderId'] = rawurlencode($parameters['sellerOrderId']);
}
uksort($parameters, 'strcmp');
$parseUrl = parse_url($returnURL);
$stringToSign = "GET\n" . $parseUrl['host'] . "\n" . $parseUrl['path'] . "\n";
foreach ($parameters as $key => $value) {
$queryParameters[] = $key . '=' . str_replace('%7E', '~', rawurlencode($value));
}
$stringToSign .= implode('&', $queryParameters);
$signatureCalculated = base64_encode(hash_hmac("sha256", $stringToSign, $secretKey, true));
$signatureCalculated = str_replace('%7E', '~', rawurlencode($signatureCalculated));
if ($signatureReturned == $signatureCalculated) {
echo "Signature was successfully validated.";
} else {
echo "Signature does not match.";
}
?>
Если кто-нибудь знает, где я делаю неправильно, пожалуйста, дайте мне знать.
Спасибо !!
Задача ещё не решена.
Других решений пока нет …