7

Amazon Payment Services を使用しようとしていますが、次のようなことを要求されます。

これが完全な署名です。署名方法を追加したことがわかります。

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

ありがとう!!

4

7 に答える 7

5

&SignatureMethod=HmacSHA256リクエストに含まれているかどうかを確認します

この種のエラーには、次の 3 つの基本的な性質があります。

  • キー/値がありません
  • キー/値のタイプミス
  • Keys/Value の不適切なエンコーディングまたはスペース

それが役立つことを願っています!

よろしく

于 2012-01-13T20:28:19.453 に答える
3

提案されなかった唯一の部分は、 の一部である で使用rawurlencode()する必要があるということでした。transactionAmount$string_to_sign

他のほとんどの答えは問題の一部です。たとえば、 (あなたが持っている)の後、の後、 の$string_to_sign後に新しい行を追加する必要があります。また、関数内でパラメーターをに設定する必要があります。GETauthorize.payments-sandbox.amazon.com/cobranded-ui/actions/start$raw_outputtruehash_hmac()

私はあなたのコードを完全に書き直しました(<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);

?>
于 2012-01-21T01:10:19.800 に答える
2

署名方法を設定しましたか?AWS ドキュメントから:

使用している署名方法を示すには、SignatureMethod 要求パラメーターを HmacSHA256 または HmacSHA1 に設定する必要があります。

于 2012-01-13T20:23:31.383 に答える
2

ハッシュを base64 でエンコードする必要はないと思います (結局のところ、すでに urlencode されています)。Base64_Encode を削除してみてください。

于 2012-01-18T16:55:55.080 に答える
2

$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

これにより、プロセス全体がはるかに簡単になります。試してみる価値はあるかもしれません...

于 2012-01-19T19:44:26.077 に答える
1

これを試しましたか

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

ブール値を渡して、生の出力として渡します。

于 2012-01-19T19:47:06.343 に答える
1

RFC 2104 準拠の HMAC 署名を取得するためhash_hmacに設定する必要がある最後のパラメーターが間違いなく欠落しています。true

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

そして、完全な例では、 に改行がありません$string_to_sign

于 2012-01-20T07:04:12.767 に答える