首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >亚马逊灵活支付异常:呼叫者输入异常:无效签名

亚马逊灵活支付异常:呼叫者输入异常:无效签名
EN

Stack Overflow用户
提问于 2012-01-17 14:13:55
回答 2查看 1.7K关注 0票数 2

我正在尝试使用PHP来实现亚马逊的灵活支付。

下面是我发送支付请求的PHP代码片段:

代码语言:javascript
代码运行次数:0
运行
复制
<?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); 
?>

这似乎是按照他们的指示,但我无法克服这个错误。

谢谢!!

EN

回答 2

Stack Overflow用户

发布于 2012-04-22 01:25:26

代码语言:javascript
代码运行次数:0
运行
复制
<?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. 看起来参数"transactionAmount“对于一个有效的联合品牌用户界面管道是必要的,尽管没有具体的指令暗示这个问题。

  1. 如果您的参数中有/有空格,并且除了最新(5.4)版本的PHP之外,您尝试在所有参数中使用html_build_query(),您将得到一个编码方案,其中空格标记为"+“,而不是"%20”,这正是亚马逊所喜欢的。上面的代码通过在整个参数数组.

上实现rawurlencode()来解决这个问题。

  1. 参数的排序在签名的构造中是非常重要的。键(而不是值)需要按不区分大小写的字母顺序排列。还值得注意的是,尽管文档对API有什么规定,但在创建签名的查询字符串时,必须同时存在符号(&)和等于(=)。

用于签名的查询字符串: callerKey=1111111111111¤cyCode=USD&signatureVersion=2

其他我注意到的事情..。

在PHP (2010-8-28)包含的示例代码中,文件"paymentReason“中的"CBUISingleUsePipelineSample.php”属性被列为"HarryPotter 1-5 DVD set“。因为这个属性中有空格,所以当您试图访问生成的链接时,它会抛出这个恼人的“无效签名”错误,因为html_build_query()用于生成该URL的查询字符串。要解决此问题,请打开"CBUIPipeline.php",并在constructUrl()方法中查找以下行.

代码语言:javascript
代码运行次数:0
运行
复制
$queryString = http_build_query($parameters, '', '&');

代之以:

代码语言:javascript
代码运行次数:0
运行
复制
$queryString = str_replace('+', '%20', http_build_query($parameters, '', '&'));

这将解决PHP旧版本的空间编码问题(< 5.4)。在最新版本中,您可以设置一个"enc_type“标志。

最后的事最后..。

这是我在StackOverflow上的第一篇文章,所以如果我违反了协议,不要杀了我。希望能帮上忙!

票数 8
EN

Stack Overflow用户

发布于 2012-02-26 01:18:42

试试这段代码:

代码语言:javascript
代码运行次数:0
运行
复制
<?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);

所以我做了一些改变:

构建查询字符串的encoding)

  • trying \r\n

  • http_build_query() (确保正确的来重用您的vars与重复工作(使发现错误更容易,等等)
  • 显式\n --可能您的编辑器输入了\r\r\n

HTH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8896060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档