Skip to main content

Problems encoding Amazon Flexible Payments secret string in PHP


I am trying to use Amazon Payment Services, and they require me to do something like this:



Here is the complete signature so you can see I added the signature method:




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



and then I encrypt it like below.




$encoded_string_to_sign = URLEncode(Base64_Encode(hash_hmac("sha256", $string_to_sign, 'my_secret_key')));



I do that, but then I get an error from them saying:




Caller Input Exception: The following input(s) are either invalid or absent:[signatureMethod]



Any idea what might be going wrong here?



Here is the entire code for this: (the variables are assigned values above)




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



Thanks!!


Source: Tips4all

Comments

  1. Check if you included &SignatureMethod=HmacSHA256 on the request

    This kind of errors has 3 basic natures:


    Missing Keys/Values
    Typos on Keys/Values
    Incorrect encoding or spaces on Keys/Values


    Hope that helps!

    Regards

    ReplyDelete
  2. Have you set your signature method? from the AWS documentation:


    You must set the SignatureMethod request parameter to either
    HmacSHA256 or HmacSHA1 to indicate which signing method you're using

    ReplyDelete
  3. I don't believe you need to base64 encode the hash (after all, it's already being urlencoded) -- try removing Base64_Encode.

    ReplyDelete
  4. Your $string_to_sign variable is missing a '?' between start and SignatureMethod for your encoded Signature.


    Signature version 2 is an enhanced signing method for both Amazon
    Simple Pay and Amazon Flexible Payments Service.

    For inbound requests (from your application to Amazon Payments), it
    uses the entire request URI as the basis for the signature, with
    encryption based on the unique security credentials for your account.

    For outbound requests (from Amazon Payments to your application),
    Amazon signs the response which you can verify using the
    VerifySignature API


    EDIT:

    As @Jonathan Spooner mentioned already and what I use is the function varifySignature() located in


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


    which can be downloaded here. It also has an example as to how to use it in


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


    It makes the whole process much easier. It may be worth a shot...

    ReplyDelete
  5. Have you tried this

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

    Pass a boolean to pass it as a raw output.

    ReplyDelete
  6. You're most definitely missing the last parameter for hash_hmac which has to be set true to get RFC 2104-compliant HMAC signature:

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


    And in the complete example you're missing new lines in $string_to_sign.

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.