簡體   English   中英

在PHP中編碼Amazon Flexible Payments秘密字符串的問題

[英]Problems encoding Amazon Flexible Payments secret string in 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);
?>

謝謝!!

檢查您是否在請求中包含了&SignatureMethod=HmacSHA256

這種錯誤有三個基本性質:

  • 缺少鍵/值
  • 按鍵/值的錯別字
  • 鍵/值上的編碼或空格不正確

希望有所幫助!

問候

這是不建議的唯一的一塊是你需要使用rawurlencode()transactionAmount那是一部分$string_to_sign

大多數其他答案都是問題的一部分。 例如,您需要在GET (您擁有)之后,在authorize.payments-sandbox.amazon.com之后以及/cobranded-ui/actions/start之后向$string_to_sign添加一個新行。 您還需要在hash_hmac()函數中將$raw_output參數設置為true

我已經包含了對代碼的完整重寫(替換<Your_Access_Key><Your_Secret_Key> ):

$return_url = rawurlencode('http://problemio.com');
$payment_reason = 'donation';
$transaction_amount = rawurlencode('4.0');

$secret_key = '<Your_Secret_Key>';
$my_access_key_id = '<Your_Access_Key>';

$string_to_sign = 'GET
authorize.payments-sandbox.amazon.com
/cobranded-ui/actions/start
SignatureMethod=HmacSHA256&SignatureVersion=2&callerKey=' . $my_access_key_id . '&callerReference=YourCallerReference&paymentReason=' . $payment_reason . '&pipelineName=SingleUse&returnUrl=' . $return_url . '&transactionAmount=' . $transaction_amount;

$encoded_string_to_sign = URLEncode(Base64_Encode(hash_hmac("sha256", $string_to_sign, $secret_key, true)));

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

但是,我強烈建議您使用FPS社區提供的PHP庫,可以在此處下載 我在生產代碼中使用它,從未遇到過問題。 使用FPS庫,您的代碼如下所示:

<?php

require_once 'CBUISingleUsePipeline.php';
require_once 'CBUIPipeline.php';

$secret_key = '<Your_Secret_Key>';
$my_access_key_id = '<Your_Access_Key>';

$return_url = 'http://problemio.com';
$transaction_amount = '4.0';
$caller_reference = '<Your_Caller_Reference>';
$payment_reason = 'donation';

$base = 'https://authorize.payments-sandbox.amazon.com/cobranded-ui/actions/start';

$pipeline = new Amazon_FPS_CBUISingleUsePipeline($my_access_key_id, $secret_key);
$pipeline->setMandatoryParameters($caller_reference, $return_url, $transaction_amount);
$pipeline->addParameter('paymentReason', $payment_reason);
$uRL = $pipeline->getURL($base);

?>

你有沒有設置簽名方法? 來自AWS文檔

您必須將SignatureMethod請求參數設置為HmacSHA256或HmacSHA1,以指示您正在使用的簽名方法

我不相信你需要base64編碼哈希(畢竟,它已經被urlencoded) - 嘗試刪除Base64_Encode。

您的$ string_to_sign變量缺少'?' 在您的編碼簽名的start和SignatureMethod之間。

簽名版本2是Amazon Simple Pay和Amazon Flexible Payments Service的增強簽名方法。

對於入站請求(從您的應用程序到Amazon Payments),它使用整個請求URI作為簽名的基礎,並根據您帳戶的唯一安全憑據進行加密。

對於出站請求(從Amazon Payments到您的應用程序),Amazon會使用VerifySignature API簽署您可以驗證的響應

編輯:

正如@Jonathan Spooner已經提到的那樣,我使用的是函數varifySignature()

/amazon-fps-2010-08-28-php5-library/src/Amazon/FPS/Samples/Client.php

可以在這里下載。 它還有一個如何使用它的例子

/amazon-fps-2010-08-28-php5-library/src/Amazon/FPS/Samples/VerifySignatureSample.php

它使整個過程更容易。 這可能值得一試......

你試過這個嗎?

base64_encode(hash_hmac('sha256',$ Request,$ AmazonSecretKey,true));

傳遞布爾值以將其作為原始輸出傳遞。

你肯定錯過了hash_hmac的最后一個參數,必須將其設置為true才能獲得符合RFC 2104標准的HMAC簽名:

base64_encode(
    hash_hmac($hash, $data, $key, true)
);

在完整的示例中,您缺少$string_to_sign新行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM