7

我正在尝试使用亚马逊支付服务,他们要求我这样做:

这是完整的签名,因此您可以看到我添加了签名方法:

$string_to_sign = "GET\n
authorize.payments-sandbox.amazon.com\n
cobranded-ui/actions/start?
SignatureMethod=HmacSHA256&SignatureVersion=2&callerKey=my_key&callerReference=YourCallerReference&paymentReason=donation&pipelineName=SingleUse&returnUrl=http%3A%2F%2Fyourwebsite.com%2Freturn.html&transactionAmount=4.0";

然后我像下面这样加密它。

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

我这样做了,但后来我从他们那里得到一个错误,说:

Caller Input Exception: The following input(s) are either invalid or absent:[signatureMethod]

知道这里可能出了什么问题吗?

这是完整的代码:(变量在上面分配了值)

<?php
$string_to_sign = 'GET
authorize.payments-sandbox.amazon.com/cobranded-ui/actions/startSignatureMethod=HmacSHA256&SignatureVersion=2&callerKey=AKIAJENBYSJCJX2IDWDQ&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;

//echo $amazon_request_sandbox; - use this if you want to see the resulting request and paste it into the browser

header('Location: '.$amazon_request_sandbox);
?>

谢谢!!

4

7 回答 7

5

检查您是否包含&SignatureMethod=HmacSHA256在请求中

这种错误有3个基本性质:

  • 缺少键/值
  • 键/值的错别字
  • 键/值上的编码或空格不正确

希望有帮助!

问候

于 2012-01-13T20:28:19.453 回答
3

唯一没有建议的部分是您需要rawurlencode()在.transactionAmount$string_to_sign

大多数其他答案都是问题的一部分。例如,您需要$string_to_signGET(您拥有的)之后authorize.payments-sandbox.amazon.com、 之后和 . 之后添加一个新行/cobranded-ui/actions/start。您还需要在函数中将$raw_output参数设置为。truehash_hmac()

我已经对您的代码进行了完整的工作重写(替换<Your_Access_Key><Your_Secret_Key>):

$return_url = rawurlencode('http://problemio.com');
$payment_reason = 'donation';
$transaction_amount = rawurlencode('4.0');

$secret_key = '<Your_Secret_Key>';
$my_access_key_id = '<Your_Access_Key>';

$string_to_sign = 'GET
authorize.payments-sandbox.amazon.com
/cobranded-ui/actions/start
SignatureMethod=HmacSHA256&SignatureVersion=2&callerKey=' . $my_access_key_id . '&callerReference=YourCallerReference&paymentReason=' . $payment_reason . '&pipelineName=SingleUse&returnUrl=' . $return_url . '&transactionAmount=' . $transaction_amount;

$encoded_string_to_sign = URLEncode(Base64_Encode(hash_hmac("sha256", $string_to_sign, $secret_key, true)));

$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;

但是,我强烈建议您使用 FPS 社区提供的 PHP 库,可以在这里下载。我在生产代码中使用它并且从未遇到过问题。使用 FPS 库,您的代码将如下所示:

<?php

require_once 'CBUISingleUsePipeline.php';
require_once 'CBUIPipeline.php';

$secret_key = '<Your_Secret_Key>';
$my_access_key_id = '<Your_Access_Key>';

$return_url = 'http://problemio.com';
$transaction_amount = '4.0';
$caller_reference = '<Your_Caller_Reference>';
$payment_reason = 'donation';

$base = 'https://authorize.payments-sandbox.amazon.com/cobranded-ui/actions/start';

$pipeline = new Amazon_FPS_CBUISingleUsePipeline($my_access_key_id, $secret_key);
$pipeline->setMandatoryParameters($caller_reference, $return_url, $transaction_amount);
$pipeline->addParameter('paymentReason', $payment_reason);
$uRL = $pipeline->getURL($base);

?>
于 2012-01-21T01:10:19.800 回答
2

我认为您不需要对哈希进行 base64 编码(毕竟,它已经被 urlencoded)——尝试删除 Base64_Encode。

于 2012-01-18T16:55:55.080 回答
2

您的 $string_to_sign 变量缺少“?” 在您的编码签名的 start 和 SignatureMethod 之间。

签名版本 2 是 Amazon Simple Pay 和 Amazon Flexible Payments Service 的增强签名方法。

对于入站请求(从您的应用程序到 Amazon Payments),它使用整个请求 URI 作为签名的基础,并根据您账户的唯一安全凭证进行加密。

对于出站请求(从 Amazon Payments 到您的应用程序),Amazon 会签署您可以使用 VerifySignature API 验证的响应

编辑:

正如@Jonathan Spooner 已经提到的,我使用的是varifySignature()位于

/amazon-fps-2010-08-28-php5-library/src/Amazon/FPS/Samples/Client.php

可以在这里下载。它还有一个关于如何使用它的示例

/amazon-fps-2010-08-28-php5-library/src/Amazon/FPS/Samples/VerifySignatureSample.php

它使整个过程变得更加容易。可能值得一试...

于 2012-01-19T19:44:26.077 回答
2

你设置好你的签名方式了吗?来自AWS 文档

您必须将 SignatureMethod 请求参数设置为 HmacSHA256 或 HmacSHA1 以指示您使用的签名方法

于 2012-01-13T20:23:31.383 回答
1

您肯定错过了hash_hmac必须设置true为获得符合 RFC 2104 的 HMAC 签名的最后一个参数:

base64_encode(
    hash_hmac($hash, $data, $key, true)
);

在完整的示例中,您缺少$string_to_sign.

于 2012-01-20T07:04:12.767 回答
1

你试过这个

base64_encode(hash_hmac('sha256', $Request, $AmazonSecretKey, true));

传递一个布尔值以将其作为原始输出传递。

于 2012-01-19T19:47:06.343 回答