在 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);
?>
谢谢!
I am trying to use Amazon Payment Services, and they require me to do something like this:
Here is the complete signature so you can see I added the signature method:
$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";
and then I encrypt it like below.
$encoded_string_to_sign = URLEncode(Base64_Encode(hash_hmac("sha256", $string_to_sign, 'my_secret_key')));
I do that, but then I get an error from them saying:
Caller Input Exception: The following input(s) are either invalid or absent:[signatureMethod]
Any idea what might be going wrong here?
Here is the entire code for this: (the variables are assigned values above)
<?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);
?>
Thanks!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
检查您是否在请求中包含
&SignatureMethod=HmacSHA256
此类错误有 3 个基本性质:
希望有所帮助!
问候
Check if you included
&SignatureMethod=HmacSHA256
on the requestThis kind of errors has 3 basic natures:
Hope that helps!
Regards
唯一没有建议的是,您需要对属于
$string_to_sign
一部分的transactionAmount
使用rawurlencode()
。大多数其他答案都是问题的一部分。例如,您需要在
GET
(您已拥有)之后、authorize. payments-sandbox.amazon 之后的
,以及$string_to_sign
中添加新行。 com/cobranded-ui/actions/start
之后。您还需要在hash_hmac()
函数中将$raw_output
参数设置为true
。我已经对您的代码进行了完整的重写(替换
和
):但是,我强烈建议您使用 FPS 社区提供的 PHP 库,该库可以是 在此处下载。我在生产代码中使用它并且从未遇到过问题。使用 FPS 库,您的代码将如下所示:
The only piece that wasn't suggested was that you need to use
rawurlencode()
on thetransactionAmount
that's part of the$string_to_sign
.Most other answers are a piece of the problem. For instance, you need to add a new line to the
$string_to_sign
after theGET
(which you have), after theauthorize.payments-sandbox.amazon.com
, and after the/cobranded-ui/actions/start
. You also need to set the$raw_output
parameter totrue
in thehash_hmac()
function.I've included a complete working rewrite of your code (replace
<Your_Access_Key>
and<Your_Secret_Key>
):However, I strongly suggest that you use the PHP library provided by the FPS community which can be downloaded here. I use this in production code and have never had an issue. Using the FPS library, your code would look like the following:
您设置签名方式了吗?来自 AWS 文档:
Have you set your signature method? from the AWS documentation:
我不认为您需要对散列进行 Base64 编码(毕竟,它已经被进行了 urlencoded)——尝试删除 Base64_Encode。
I don't believe you need to base64 encode the hash (after all, it's already being urlencoded) -- try removing Base64_Encode.
您的 $string_to_sign 变量缺少“?”位于编码签名的 start 和 SignatureMethod 之间。
编辑:
正如 @Jonathan Spooner 已经提到的,我使用的是位于的函数
varifySignature()
可以下载 此处。它还有一个关于如何使用它的示例
它使整个过程变得更加容易。也许值得一试...
Your $string_to_sign variable is missing a '?' between start and SignatureMethod for your encoded Signature.
EDIT:
As @Jonathan Spooner mentioned already and what I use is the function
varifySignature()
located inwhich can be downloaded here. It also has an example as to how to use it in
It makes the whole process much easier. It may be worth a shot...
您尝试过这个
base64_encode(hash_hmac('sha256', $Request, $AmazonSecretKey, true));
传递一个布尔值以将其作为原始输出传递。
Have you tried this
base64_encode(hash_hmac('sha256', $Request, $AmazonSecretKey, true));
Pass a boolean to pass it as a raw output.
您肯定缺少
hash_hmac
的最后一个参数,必须将其设置为true
才能获得符合 RFC 2104 的 HMAC 签名:在完整的示例中,您缺少新的
$string_to_sign
中的行。You're most definitely missing the last parameter for
hash_hmac
which has to be settrue
to get RFC 2104-compliant HMAC signature:And in the complete example you're missing new lines in
$string_to_sign
.