Magento, PayPal, IPN, las contrabarras (backslashes) y respuesta INVALID

Existe un pequeño problema en Magento con la validación de la respuesta IPN de PayPal. Ocurre incluso con el código de ejemplo para PHP4 del propio PayPal. Más que un problema se trata de una condición de error no contemplada. Esta condición ocurre cuando en algún campo del formulario de pago aparece el carcater contrabarra o backslash (\) y la opción de PHP magic_quotes_gpc está desactivada. Esta opción está marcada como obsoleta desde PHP 5.3 y suele encontrarse desactivada en la mayoría de las distribuciones actuales.

El problema está en utilizar la función stripslashes sobre el valor de los campos del formulario de pago que PayPal devuelve mediante el método POST. Si magic_quotes_gpc no está activada y se aplica stripslashes sobre los valores cualquier contrabarra desaparecerá o, más bien, se convertirá en un escapado del siguiente caracter. Y como al hacer el post back para verificar el pago PayPal espera recibir exactamente los mismos valores que ha enviado previamente, se recibirá un INVALID por resupuesta.

No es un problema grave, pero algunos usuarios de habla hispana abrevian calle como C\ (aunque la norma es hacerlo al revés, C/), y en estos casos el pago se realizará pero fallará su validación.

¿Cómo corregir esto? Bien NO haciendo el stripslashes o bien haciendo previamente un addslashes si magic_quotes_gpc está desactivado.

Para el código de ejemplo de PayPal:

Original:

...
foreach ($_POST as $key => $value) {
 $value = urlencode(stripslashes($value));
 $req .= "&$key=$value";
}
...

Solución 1:

...
foreach ($_POST as $key => $value) {
 $value = get_magic_quotes_gpc()?stripslashes($value):$value;
 $value = urlencode($value);
 $req .= "&$key=$value";
}
...

Solución 2a:

...
foreach ($_POST as $key => $value) {
 $value = get_magic_quotes_gpc()?$value:addslashes($value);
 $value = urlencode(stripslashes($value));
 $req .= "&$key=$value";
}
...

Solución 2b:

...
foreach ($_POST as $key => $value) $_POST[$key] = get_magic_quotes_gpc()?$value:addslashes($value);

foreach ($_POST as $key => $value) {
 $value = urlencode(stripslashes($value));
 $req .= "&$key=$value";
}
...

Para Magento hay que hacer algo análogo en el código de verificación. En la versión 1.5 puede encontrarse en el fichero

app/code/local/Onestic/PaypalIpnFixSlash/Model/Ipn.php

, en el método _postBack. en versiones anteriores este código está en

app/code/core/Mage/Paypal/Model/Standard.php

, en el método ipnPostSubmit.

Si no se desea tocar el código fuente de Magento, para la versión 1.5 se incluye este pequeño módulo Onestic_PaypalIpnFixSlash.


Compartir:
  • Print this article!
  • Facebook
  • Twitter
  • Meneame
  • Google Bookmarks
  • del.icio.us
  • Digg


COMENTARIOS

Yes, thats it!
Man, you saved my life. I was chasing this bug for days, but no one hat a solution on this.

Thanx!


PARTICIPA EN LA CONVERSACIÓN

Introduce tu información personal o utiliza tu cuenta de twitter o facebook para acceder

 






SIGUENOSEN: