Error Magento y PayPal Express

MagentoHace unos días publiqué una entrada hablando sobre cómo integrar Magento (1.4.1.1) con PayPal Express. Todo parecía funcionar de fábula cuando se realizaban compras desde cuentas de PayPal. Sin embargo, si el comprador no tenía una cuenta de PayPal y únicamente quería efectuar un pago con tarjeta de crédito, la compra se realizaba de forma satisfactoria pero mostraba el siguiente mensaje al final del proceso de venta:

«El pago no se puede procesar mediante su cuenta de paypal en este momento»

¡Toma ya! La compra se realiza correctamente pero se le dice al comprador justo lo contrario. Feo, feo.

Después de mucho pelearme contacté con el soporte técnico de PayPal, quien ha estado ayudándome (y mucho) a solucionar la incidencia.

El problema es el siguiente:

Cuando se realiza el proceso de compra, se utiliza una función de PayPal llamada «DoExpressCheckoutPayment». En las compras que funcionan, el campo «successpageredirectrequested» está a «false», mientras que las compras que también funcionan pero a las que se les muestra el mensaje de error anterior, este campo está a «true».

En palabras del soporte ténico de PayPal:

De acuerdo con este enlace
https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_DoExpressCheckoutPayment

«Flag to indicate whether you need to redirect the customer to back to PayPal after completing the transaction. »

Es una opción para indicar si se necesitar redirigir al comprador de nuevo a PayPal tras completar la transacción, que no tiene mucho sentido ya que la transacción ya ha finalizado correctamente.

Finalmente, he aquí la conclusión por parte de PayPal:

SUCCESSPAGEREDIRECTREQUESTED se solía utilizar en versiones muy antiguas de PayPal, y tenía como propósito indicar que el comprador había pagado con tarjeta directamente, para que las integraciones que así lo tuvieran dispuesto, redirigieran al comprador de nuevo a la página de PayPal por si quería abrir una cuenta para usarla en un futuro (en vez de seguir pagando como invitado).

Parece que esto ya no está en vigor, por lo que una redirección final provocaría un error.

Es decir, Magento está usando un método obsoleto, y esto está devolviendo un mensaje de error falso, en el proceso de compra.

Siguiendo las indicaciones de este foro de discusión (y también los consejos del soporte de PayPal), he pasado a modificar el archivo app/code/core/Mage/Paypal/Controller/Express/Abstract.php

Concretamente, de la siguiente función, he comentado las líneas en negrita:

public function placeOrderAction()
{
try {
$this->_initCheckout();
$this->_checkout->place($this-

>_initToken());

// prepare session to success or cancellation page
$session = $this->_getCheckoutSession();
$session->clearHelperData();

// «last successful quote»
$quoteId = $this->_getQuote()->getId();
$session->setLastQuoteId($quoteId)->setLastSuccessQuoteId($quoteId);

// an order may be created
$order = $this->_checkout->getOrder();
if ($order) {
$session->setLastOrderId($order->getId())
->setLastRealOrderId($order->getIncrementId());
// as well a billing agreement can be created
$agreement = $this->_checkout->getBillingAgreement();
if ($agreement) {
$session->setLastBillingAgreementId($agreement->getId());
}
}

// recurring profiles may be created along with the order or without it
$profiles = $this->_checkout->getRecurringPaymentProfiles();
if ($profiles) {
$ids = array();
foreach($profiles as $profile) {
$ids[] = $profile->getId();
}
$session->setLastRecurringProfileIds($ids);
}

// redirect if PayPal specified some URL (for example, to Giropay bank)
$url = $this->_checkout->getRedirectUrl();
//if ($url) {
//$this->getResponse()->setRedirect($url);
// return;
//}

$this->_initToken(false); // no need in token anymore
$this->_redirect(‘checkout/onepage/success’);
return;
}
catch (Mage_Core_Exception $e) {
$this->_getSession()->addError($e->getMessage());
}
catch (Exception $e) {
$this->_getSession()->addError($this->__(‘Unable to place the order.’));
Mage::logException($e);
}
$this->_redirect(‘*/*/review’);
}

Con esto se evita la redirección por parte de Magento al recibir el parámetro obsoleto, y se consigue completar correctamente el proceso de compra, esta vez, sin mensajes de error.

ATENCIÓN: Se recomienda realizar todos los tests que se crean convenientes antes de adaptar esta solución a tu sitio web en producción.

PD: Sí, ya he contactado con Magento para avisarles de este error, que podéis ver explicado aquí (si tenéis cuenta en Magento).

9 respuestas a «Error Magento y PayPal Express»

  1. Hola Adrián, vi que comentabas un problema en el pago a través de paypal cuando no cuentas con cuenta, por medio de tarjeta. Tengo un problemilla no se como modificar el archivo abstract.php, a lo mejor es la hora, que ya debería estar en la cama, peron no sé si entendi bien. Debo sustituir la parte que toca por el código que facilitas? Es mucho, mcuho pedir que me dijeras justo donde debo pegar, tras cortar el código, para que no tenga problemas:
    1; Soy un poco novatillo como ves?
    2; Tengo sueño, mucho sueño.
    Bueno espero tu respuesta, por cierto me parece genial (no es porque ahora te necesite) este foro, para ayudar un poco agente despistaillaaaa.
    Un saludo

    1. Buenas Francisco,
      Tampoco te creas que yo soy un experto, ni mucho menos 😉 , únicamente trato de escribir las soluciones a los problemas que me he ido encontrando, para que puedan ayudar a la gente que se encuentre problemas similares.

      Si tienes este mismo problema, lo que tienes que hacer es únicamente comentar las 4 líneas de código que están en negrita. Son estas 4:
      if ($url) {
      $this->getResponse()->setRedirect($url);
      return;
      }

      Para comentarlas, bastará con que escribas «//» (sin comillas) deltante de cada línea, tal y como está explicado en el post.

      Con esto se debería solucionar el probelma.

      ¡Saludos compañero!
      Adri

  2. Antetodo gracias por tu blog.
    Me temo que no soy muy bueno, porque no logro activar ningún método de Paypal en mi web cuando selecciono algún país europeo, los checkbox no se activan. Si utilizo EEUU o Reino Unido por ejemplo me permite seleccionar los métodos Pro, pero ni express ni standard. Mi versión de Magento es 1.4.1.1 y no sé que se me olvida para poder activar estos checkboxs. Siento que la pregunta sea tan sencilla pero me tiene dando tumbos.
    Muchas gracias.

    1. Hola Jose,
      Disculpa el no haber contestado antes, pero no sé porqué últimamente no me están llegando las notificaciones de nuevos comentarios a mi correo.

      Hace un tiempo escribí el paso a paso que seguí para integrar Magento (la misma versión que comentas) con PayPal Express.

      La escribí en este otro post:
      http://helloit.es/?p=243

      Si puedes, pégale un vistazo a ver si te ayuda a solucionar el problema.

      ¡Saludos!
      Adri

  3. Hola Adri, ya te escribi en otra ocasión en este mismo post. Quería comentarte, si conoces o sabes que sea normal que aparezca cuando introduces la tarjeta en el proceso de pago de paypal lo siguiente:
    «Mensaje de errorLa tarjeta introducida no se puede utilizar para este pago. Introduzca un número diferente de tarjeta de débito o crédito». Leí en un post:
    http://www.tipandtrick.net/2008/credit-card-cannot-be-used-for-paypal-payment-error/es/
    que podía ser por haber estado antes con paypal las tarjetas, en este caso sería mi problema.
    No obstante te quería comentar a ver si podrías echarme una mano, cuando el cliente va a pagar a paypal no aparece el producto ni el dinero que debe pagar, supongo que esto debería de modificarlo en paypal, pero no tengo ni idea de donde. Tengo Paypal express con una cuenta business.
    No sé que más, salvo que me alegra tener dudas para contactar de nuevo contigo. Un saludo, y gracias por ayudar a algunos desesperados.

    1. Buenas Francisco,
      Mírate este otro post -> http://helloit.es/?p=243
      En el segundo comentario, hay un ejemplo de configuración 100% funcional para integrar Magento con Paypal.
      Si no se te soluciona, quizá sería una buena idea probar de instalar la última versión de Magento, en la que creo que se han incluído mejoras respecto a la integración con Paypal.

      ¡Ya nos contarás!

  4. Primero de todo, muchas gracias, no ya sólo por la aportación sino por la rápidez en contestar. Aquél otro post ya lo había visto. No obstante pienso que tendrá que ver con mi configuración directa de Paypal, de configuración de la experiencia para el cliente que ofrece paypal, algo no tendré bien, por lo menos para que no aparezca el producto y el precio, cuando el cliente va a ingresar el número de tarjeta.
    Con respecto a las tarjetas, no sé, por otra parte me da un poco de respeto actualizar a la última versión de magento.
    Gracias por todo de nuevo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.