<?php
$method = 'GET';
$host = 'authorize.payments-sandbox.amazon.com';
$path = '/cobranded-ui/actions/start';
$params = array(
'signatureMethod' => 'HmacSHA256',
'signatureVersion' => '2',
'currencyCode' => 'USD',
'callerKey' => 'Your_Key_ID',
'callerReference' => 'YourCallerReference',
'paymentReason' => 'donation',
'pipelineName' => 'SingleUse',
'returnUrl' => 'http://yourcallback.com',
'transactionAmount'=> '5',
'version' => '2009-01-09',
);
$params = array_map('rawurlencode', $params);
$paramStringArray = array();
foreach($params as $key => $value){
$paramStringArray[] = $key . '=' . $value;
}
$paramString = implode('&', $paramStringArray);
$string_to_sign = $method . "\n"
. $host . "\n"
. $path . "\n"
. $paramString;
$signature = base64_encode(hash_hmac(
'sha256',
$string_to_sign,
'Your_Super_Secret_Key',
true
));
$amazon_request_sandbox = "https://{$host}{$path}?" . $paramString .
'&signature=' . rawurlencode($signature);
header('Location: '.$amazon_request_sandbox);
?>
Хорошо ... используя структуру из приведенного ниже кода, я наконец-то понял все это с помощью кода выше. При формировании подписи / URL-адреса нужно следить за тремя вещами ...
Похоже, что параметр "actionAmount "необходим для действительного конвейерного интерфейса с совместным брендом, даже если нет конкретной инструкции, ссылающейся на проблему.
Если у какого-либо из ваших параметров есть / были пробелы в них, и вы пытались использовать html_build_query () во всех версиях PHP, кроме последней (5.4), вам была бы предоставлена схема кодирования, содержащая "+" знаки для пробелов вместо "% 20", что, похоже, нравится Amazon. Мой код выше заботится об этом путем реализации rawurlencode () для всего массива параметров.
Порядок параметров имеет первостепенное значение при построении подписи. Ключи (не значения) должны быть в алфавитном порядке без учета регистра. Стоит также отметить, что, несмотря на то, что в документации говорится об API, при создании строки запроса для подписи должны присутствовать как амперсанды (&), так и равно (=).
Пример:
Строка запроса для подписи: callerKey = 1111111111111 & currencyCode = USD & signatureVersion = 2
Некоторые другие вещи, которые я заметил ...
В примере кода, включенного в PHP SDK (2010-8-28), атрибут «paymentReason» в файле «CBUISingleUsePipelineSample.php» указан как «HarryPotter 1-5 DVD set». Поскольку в этом атрибуте есть пробелы, он выдает эту постоянно раздражающую ошибку «недопустимая подпись», когда вы пытаетесь посетить созданную ссылку, потому что html_build_query () используется для генерации строки запроса для URL. Чтобы устранить эту проблему, откройте «CBUIPipeline.php» и найдите следующую строку в методе constructUrl () ...
$queryString = http_build_query($parameters, '', '&');
заменить его на:
$queryString = str_replace('+', '%20', http_build_query($parameters, '', '&'));
Это решит проблему кодирования пространства для более старых версий PHP (<5.4). В последней версии вы можете установить флаг "enc_type". </p>
Последние вещи, последние ...
Это мой первый пост в StackOverflow, так что не убивайте меня, если я нарушил протокол. Надеюсь, это поможет!