2012-01-13 16 views
7

Estoy tratando de utilizar Amazon servicios de pago, y requieren que haga algo como esto:problemas de codificación Amazon Payments flexibles serie secreta en PHP

Aquí está la firma completa para que pueda ver he añadido el método de la firma:

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

y después cifrarlo como a continuación.

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

hago eso, pero entonces me da un error de ellos diciendo:

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

Cualquier idea de lo que podría estar pasando mal aquí?

Aquí está el código completo para esto: (las variables se asignan valores por encima de)

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

Gracias !!

+0

edité mi Q originales para demostrar que estoy incluyendo la cadena SignatureMethod = HMACSHA256, pero no ayuda :( – GeekedOut

+0

se ha asegurado de que no hay espacio en blanco entrando en la cadena de consulta decir quizás después de "comenzar?"? – travega

+0

¿Puedo preguntar también por qué está codificando los caracteres: y/en su returnUrl si lo está URLEncoding de todos modos? – travega

Respuesta

2

¿Ha establecido su método de firma? Del AWS documentation:

Debe establecer el parámetro de la petición SignatureMethod a cualquiera HMACSHA256 o HMACSHA1 para indicar qué método de firma que está utilizando

5

Comprobar si se incluye en la solicitud &SignatureMethod=HmacSHA256

Este tipo de errores tiene 3 naturalezas básicas:

  • Faltan llaves/valores
  • Los errores tipográficos en claves/Valores
  • codificación incorrecta o espacios en las teclas/Valores

Espero que ayude!

Saludos

2

no creo que necesita para base64 codificar el hash (después de todo, es que ya se están urlencoded) - Trate de no incluir base64_encode.

+0

Acabo de intentarlo - mismo error :( – GeekedOut

2

Su variable $ string_to_sign no tiene un '?' entre inicio y SignatureMethod para su Firma codificada.

La versión 2 de la firma es un método de firma mejorado para Amazon PaySimple Pay y Amazon Flexible Payments Service.

Para las solicitudes entrantes (de su aplicación a Amazon Payments), que utiliza toda la URI de la solicitud de base para la firma, con cifrado basado en las credenciales de seguridad única para su cuenta.

Para las solicitudes salientes (a partir de los pagos del Amazonas a su aplicación), Amazon firma la respuesta que se puede verificar mediante la API VerifySignature

EDIT:

Como ya se ha mencionado @ Jonathan Spooner y qué yo uso es la función varifySignature() situado en

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

que se pueden descargar here. También tiene un ejemplo de cómo utilizarlo en

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

Hace todo el proceso mucho más fácil. Puede ser digno de un tiro ...

+0

esto es lo que yo también pensaba, pero su ejemplo en la documentación no tiene el carácter? Voy a probar con el carácter? Solo para asegurarme. – GeekedOut

+0

Acabo de probarlo con el signo de interrogación. Tampoco funcionó – GeekedOut

+0

Aunque su firma aún no es la misma que su URI de solicitud ... Observé que su parámetro de pipelineName falta en su URI de firma y que sus parámetros están en un orden diferente al de la URI. solicitar el URI. Sugeriría intentar que su firma sea un clon de su URI de solicitud, obviamente sin la firma al final de su URI de firma;) – travega

1

Has probado esto

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

Pase un booleano para pasarlo como salida sin formato.

+0

al intentar esto ahora ... se informará en un segundo. – GeekedOut

+0

desafortunadamente, eso no ayudó :( – GeekedOut

1

Estás definitivamente falta el último parámetro para hash_hmac que tiene que ser establecido true para obtener el RFC 2104 compatible con HMAC firma:

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

Y en el ejemplo completo que se está perdiendo nuevas líneas en $string_to_sign .

+0

otro comentarista sugirió que no debería tener caracteres de espacio :) Estoy un poco perdido como debería ser. ¿Tienes algo similar que funcione para ti? ¿Cómo lo codificaste? – GeekedOut

3

La única pieza que no se sugirió es que debe usar rawurlencode() en el transactionAmount que forma parte del $string_to_sign.

La mayoría de las otras respuestas son una parte del problema. Por ejemplo, debe agregar una nueva línea al $string_to_sign después del GET (que tiene), después del authorize.payments-sandbox.amazon.com, y después del /cobranded-ui/actions/start. También debe establecer el parámetro $raw_output en true en la función hash_hmac().

He incluido una reescritura completa de trabajo de su código (sustituir <Your_Access_Key> y <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; 

Sin embargo, fuertemente sugieren que utiliza la librería PHP proporcionada por la comunidad FPS que puede ser downloaded here. Utilizo esto en el código de producción y nunca tuve un problema. El uso de la biblioteca FPS, su código se vería como la siguiente:

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

?> 
Cuestiones relacionadas