2012-01-17 56 views
2

我正在嘗試使用亞馬遜靈活付款的PHP API。亞馬遜靈活付款例外:來電輸入例外:無效簽名

這是我的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); 
?> 

這似乎是跟隨他們的指示,但我不能讓過去的錯誤。

謝謝!

+0

我不確定你是否看到我的回答,但我想知道它是否有幫助。 – Funktr0n 2012-05-15 00:44:32

回答

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); 

所以我做了一些改動:

  • PHP的http_build_query()打造的查詢字符串(確保正確的編碼)
  • 試圖重新使用你的變數與重複的努力(使得更容易發現錯誤等)
  • 顯式\n - 也許你的編輯器輸入\r\r\n

HTH

7
<?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」是必要的有效的聯合品牌UI管道,即使沒有具體的指示暗指的問題。

  2. 如果您的任何參數中都有/有空格,並且您嘗試在除PHP的最新(5.4)版本之外的其他所有版本中使用html_build_query(),則會給出以「+」標記爲特徵的編碼方案而不是「亞馬遜」似乎喜歡的「%20」。上面的代碼通過在整個參數數組上實現rawurlencode()來處理這個問題。

  3. 參數的排序在簽名的構造中是非常重要的。鍵(不是值)需要以不區分大小寫的字母順序。同樣值得注意的是,儘管文檔中提到的API,符號(&)和equals(=)必須存在於創建簽名的查詢字符串中。

例:

查詢字符串簽名:callerKey = 1111111111111 & CURRENCYCODE = USD & signatureVersion = 2

其他一些事情,我注意到...

在包含在PHP SDK(2010-8-28)中的示例代碼,文件「CBUISingleUsePipelineSample.php」中的「paymentReason」屬性列爲s「HarryPotter 1-5 DVD套裝」。由於此屬性在其中包含空格,因此當您嘗試訪問生成的鏈接時,它會引發永久令人討厭的「無效簽名」錯誤,因爲使用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」標誌。

最後事情最後...

這是我在計算器上的第一篇文章,所以如果我打破了協議,不要殺我。希望能幫助到你!