我正在尝试使用PHP来实现亚马逊的灵活支付。
下面是我发送支付请求的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);
?>
这似乎是按照他们的指示,但我无法克服这个错误。
谢谢!!
发布于 2012-04-21 17:25:26
<?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时,需要注意三件事.
上实现rawurlencode()来解决这个问题。
用于签名的查询字符串: 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()方法中查找以下行.
$queryString = http_build_query($parameters, '', '&');
代之以:
$queryString = str_replace('+', '%20', http_build_query($parameters, '', '&'));
这将解决PHP旧版本的空间编码问题(< 5.4)。在最新版本中,您可以设置一个"enc_type“标志。
最后的事最后..。
这是我在StackOverflow上的第一篇文章,所以如果我违反了协议,不要杀了我。希望能帮上忙!
发布于 2012-02-25 17:18:42
试试这段代码:
<?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)
\r\n
http_build_query()
(确保正确的来重用您的vars与重复工作(使发现错误更容易,等等)\n
--可能您的编辑器输入了\r
或\r\n
HTH
https://stackoverflow.com/questions/8896060
复制相似问题