<?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);
?>
好的...使用下面代码中的结构,我终于通过上面的代码弄清楚了整个事情。在形成您的签名/网址时,需要注意三件事......
似乎参数“transactionAmount”对于有效的联合品牌 UI 管道是必需的,即使没有暗示该问题的具体说明。
如果您的任何参数中包含/包含空格,并且您尝试在除最新(5.4)版本的 PHP 之外的所有版本中使用 html_build_query(),您将获得一个编码方案,其中包含空格的“+”标记而不是“ %20" 这是亚马逊似乎喜欢的。我上面的代码通过在整个参数数组上实现 rawurlencode() 来解决这个问题。
参数的顺序在签名的构造中是最重要的。键(不是值)需要按不区分大小写的字母顺序排列。还值得注意的是,尽管文档对 API 进行了说明,但在创建签名的查询字符串时必须同时存在与号 (&) 和等号 (=)。
例如:
签名查询字符串:callerKey=1111111111111¤cyCode=USD&signatureVersion=2
我注意到的其他一些事情...
在 PHP SDK (2010-8-28) 附带的示例代码中,文件“CBUISingleUsePipelineSample.php”中的“paymentReason”属性被列为“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 上的第一篇文章,所以如果我破坏了协议,请不要杀了我。希望能帮助到你!