Исключение гибких платежей Amazon: исключение ввода звонящего: неверная подпись - PullRequest
2 голосов
/ 17 января 2012

Я пытаюсь работать с PHP API для гибких платежей Amazon.

Вот мой фрагмент PHP для отправки запроса на оплату:

<?php

$string_to_sign = 'GET
authorize.payments-sandbox.amazon.com
/cobranded-ui/actions/start
SignatureMethod=HmacSHA256&SignatureVersion=2&callerKey=my_access_key&callerReference=YourCallerReference&paymentReason=donation&pipelineName=SingleUse&returnUrl=http%3A%2F%2Fproblemio.com&transactionAmount=4.0';

$encoded_string_to_sign = URLEncode(Base64_Encode(hash_hmac('sha256', $string_to_sign, 'my_secret_key')));

$amazon_request_sandbox = 'https://authorize.payments-sandbox.amazon.com/cobranded-ui/actions/start?SignatureVersion=2&returnUrl='.$return_url.'&paymentReason='.$payment_reason.'&callerReference=YourCallerReference&callerKey='.$my_access_key_id.'&transactionAmount=4.0&pipelineName=SingleUse&SignatureMethod=HmacSHA256&Signature='.$encoded_string_to_sign;

// When it goes to the url, it gets the invalid signature error
header('Location: '.$amazon_request_sandbox); 
?>

Кажется, что он следует их инструкциям, но я не могу обойти эту ошибку.

Спасибо !!

Ответы [ 2 ]

8 голосов
/ 22 апреля 2012
<?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-адреса нужно следить за тремя вещами ...

  1. Похоже, что параметр "actionAmount "необходим для действительного конвейерного интерфейса с совместным брендом, даже если нет конкретной инструкции, ссылающейся на проблему.

  2. Если у какого-либо из ваших параметров есть / были пробелы в них, и вы пытались использовать html_build_query () во всех версиях PHP, кроме последней (5.4), вам была бы предоставлена ​​схема кодирования, содержащая "+" знаки для пробелов вместо "% 20", что, похоже, нравится Amazon. Мой код выше заботится об этом путем реализации rawurlencode () для всего массива параметров.

  3. Порядок параметров имеет первостепенное значение при построении подписи. Ключи (не значения) должны быть в алфавитном порядке без учета регистра. Стоит также отметить, что, несмотря на то, что в документации говорится об 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, так что не убивайте меня, если я нарушил протокол. Надеюсь, это поможет!

0 голосов
/ 26 февраля 2012

Попробуйте этот фрагмент кода:

<?php

$method = 'GET';
$host   = 'authorize.payments-sandbox.amazon.com';
$path   = '/cobranded-ui/actions/start';

$params = array(
    'SignatureMethod'  => 'HmacSHA256'
    'SignatureVersion' => 2,
    'callerKey'        => 'my_access_key',
    'callerReference'  => 'YourCallerReference',
    'paymentReason'    => 'donation',
    'pipelineName'     => 'SingleUse',
    'returnUrl'        => 'http://problemio.com&transactionAmount=4.0',
);

$string_to_sign = $method . "\n"
    . $host . "\n"
    . $path . "\n"
    . http_build_query($params);

$signature = base64_encode(hash_hmac(
    'sha256',
    $string_to_sign,
    'my_secret_key'
));

$params['Signature'] = $signature;

$amazon_request_sandbox = "https://{$host}{$path}?" . http_build_query($params);

header('Location: ' . $amazon_request_sandbox);

Итак, я сделал несколько изменений:

  • PHP * http_build_query() для построения строки запроса (проверьте правильность кодировки)
  • Попытка повторно использовать ваши переменные вместо дублирования усилий (упрощает обнаружение ошибок и т. Д.)
  • явное \n - возможно, ваш редактор ввел \r или \r\n

HTH

...