[英]Invalid signature error when making an Amazon Flexible Payments request
[英]Problems encoding Amazon Flexible Payments secret string in PHP
我正在尝试使用亚马逊支付服务,他们要求我做这样的事情:
这是完整的签名,所以你可以看到我添加了签名方法:
$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);
?>
谢谢!!
检查您是否在请求中包含了&SignatureMethod=HmacSHA256
这种错误有三个基本性质:
希望有所帮助!
问候
这是不建议的唯一的一块是你需要使用rawurlencode()
的transactionAmount
那是一部分$string_to_sign
。
大多数其他答案都是问题的一部分。 例如,您需要在GET
(您拥有)之后,在authorize.payments-sandbox.amazon.com
之后以及/cobranded-ui/actions/start
之后向$string_to_sign
添加一个新行。 您还需要在hash_hmac()
函数中将$raw_output
参数设置为true
。
我已经包含了对代码的完整重写(替换<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);
?>
你有没有设置签名方法? 来自AWS文档 :
您必须将SignatureMethod请求参数设置为HmacSHA256或HmacSHA1,以指示您正在使用的签名方法
我不相信你需要base64编码哈希(毕竟,它已经被urlencoded) - 尝试删除Base64_Encode。
您的$ 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
它使整个过程更容易。 这可能值得一试......
你试过这个吗?
base64_encode(hash_hmac('sha256',$ Request,$ AmazonSecretKey,true));
传递布尔值以将其作为原始输出传递。
你肯定错过了hash_hmac
的最后一个参数,必须将其设置为true
才能获得符合RFC 2104标准的HMAC签名:
base64_encode(
hash_hmac($hash, $data, $key, true)
);
在完整的示例中,您缺少$string_to_sign
新行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.