Hola,
Dispongo del módulo oficial de Paypal en mi tienda. Tanto la tienda como el módulo, actualizados a la última versión posible.
Puntualmente a veces un cliente realiza pedido mediante Paypal y obtengo un "Error de pago" como status del pedido. Esto, en su día, me generaba un comentario automático en el propio pedido, visible desde el backoffice, en el que aparecían datos técnicos del motivo y número del error, y con esto podía yo irme a Paypal a hacer seguimiento o abrir incidencia. Normalmente cuando pasa esto, en el propio Paypal no llega a efectuarse ningún registro.
Actualmente este detalle técnico del error ya no se guarda, o no sé yo llegar a él. He revisado en el pedido, sin éxito, y tampoco lo localizo en el archivo public_html/error_log
El cliente, por mucho que reincida y vuelva a probar, no le acaba funcionando nunca. Mi única opción ha sido, de momento, editar el email automático de "error de pago" advirtiendo a los clientes de esta situación para que prueben con otro método.
¿Tenéis alguna pista de dónde puede estar registrándose el detalle técnico del error de Paypal?
Muchas gracias por adelantado,
Eva
Contenido solo visible a usuarios registrados
Hola Eva.
Pues la verdad que no vemos nada que pueda estar afectando, si el problema es puntual a ser complicado encontrarlo a no ser que veas alguna relación en lso pedidos que no se realizan bien, mismo usuario, mismo producto, etc...
A nivel de instalación y hosting no vemos ningún problema.
¿ El pedido llega a registrarse en Prestashop ? Revisaste en la plataforma de Paypal si ese pago llego a terminar o te indica algún error en ese pago ?
Un Saludo
El pedido se registra en Prestashop tal como se puede ver en la captura. Al tener status de "error de pago" no se hace descuento de las unidades en stock, pero todo lo demás queda ahí. No hemos descubierto ningún patrón, ya sea por cliente o por combinación de productos, que pueda darnos ninguna pista acerca de qué puede provocar el fallo, es por eso que queríamos ir directamente al mensaje de error nº XXX que antes solía darnos y aclarar (a veces) el motivo.
En la captura se puede ver un pedido Paypal en medio que sí se procesó bien. Normalmente tenemos el 20-25% de los pedidos por Paypal, y uno de cada cuatro Paypals falla.
En nuestro portal de Paypal sólo aparecen las transacciones correctas, o como mucho las incorrectas cuando el usuario tiene algún problema con su cuenta, o no tiene la cuenta validada, o no dispone de saldo. Pero no hay registro alguno de estos intentos de pago que aparecen como "Error de pago" en nuestro BO. Es como si nunca llegaran a pasar desde nuestro Prestashop a Paypal, con alguna interrupción que no sabemos ver y de la que no hay registro más allá de la vista de pedidos.
Hola Eva,
Si usas el modulo de paypal que viene por defecto comprueba si puedes ver los logs de error, usualmente esto lo localizas en la sección de Módulos -> Modules Mánager -> Paypal, dentro de este veras una pestaña logs donde debe mostrarse el historial de las transacciones
Un Saludo
Hola,
veo que mi módulo de Paypal no es exactamente el mismo, yo no dispongo de ese tab con la información de los logs. El que tengo yo dispone de tabs dentro del propio módulo. Utilizo este, que creía que era el oficial: https://addons.prestashop.com/es/pago-tarjeta-carteras-digitales/1748-oficial-de-paypal.html
¿No es así? ¿No es este el adecuado?
Hola Eva.
El plugin es el mismo lo que pasa es que estas utilizando paar la version de Prestashop 1.6 y el que muestra Karen es de la version 1.7
¿ Tienes aplicado redondeo en las preferencias de prestashop ?
Si es así puede ser que el problema venga de ahi.
.- Accede a tu cuenta de cPanel -> Administrador de archivos.
.- Accede a la carpeta modules -> paypal -> express_checkout y edita el archivo " proccess.php "
.- Sobre la linea 329 veras el siguiente código:
private function setProductsList(&$fields, &$index, &$total)
{
foreach ($this->product_list as $product) {
$fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = (int) $product['id_product'];
$fields['L_PAYMENTREQUEST_0_NAME'.$index] = $product['name'];
if (isset($product['attributes']) && (empty($product['attributes']) === false)) {
$fields['L_PAYMENTREQUEST_0_NAME'.$index] .= ' - '.$product['attributes'];
}
$fields['L_PAYMENTREQUEST_0_DESC'.$index] = Tools::substr(strip_tags($product['description_short']), 0, 50).'...';
$price = $product['price_wt'];
if (version_compare(_PS_VERSION_, '1.6.1', '<')) {
if (isset($product['ecotax']) && $product['ecotax'] > 0) {
$price += $product['ecotax'];
}
}
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($price, $this->decimals);
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = $product['quantity'];
$total = $total + ($fields['L_PAYMENTREQUEST_0_AMT'.$index] * $product['quantity']);
}
}
Lo sustituyes por lo siguiente:
private function setProductsList(&$fields, &$index, &$total)
{
foreach ($this->product_list as $product) {
$fields['L_PAYMENTREQUEST_0_NUMBER'.++$index] = 1;
$fields['L_PAYMENTREQUEST_0_NAME'.$index] = 'Total Productos '; // o el texto que deseemos
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = $this->context->cart->getOrderTotal(true,Cart::ONLY_PRODUCTS);
//mandamos el total de los productos con IVA incluido
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = 1;
$total = $total + ($fields['L_PAYMENTREQUEST_0_AMT'.$index] * 1);
break;
}
}
.- En el mismo archivo busca los siguiente:
public function getTotalPaid()
{
$total = 0.00;
foreach ($this->product_list as $product) {
$price = Tools::ps_round($product['price_wt'], $this->decimals);
$quantity = Tools::ps_round($product['quantity'], $this->decimals);
$total = Tools::ps_round($total + ($price * $quantity), $this->decimals);
}
if ($this->context->cart->gift == 1) {
$total = Tools::ps_round($total + $this->getGiftWrappingPrice(), $this->decimals);
}
if (version_compare(_PS_VERSION_, '1.5', '<')) { $discounts = $this->context->cart->getDiscounts();
$shipping_cost = $this->context->cart->getOrderShippingCost();
} else {
$discounts = $this->context->cart->getCartRules();
$shipping_cost = $this->context->cart->getTotalShippingCost();
}
if (count($discounts) > 0) {
foreach ($discounts as $product) {
$price = -1 * Tools::ps_round($product['value_real'], $this->decimals);
$total = Tools::ps_round($total + $price, $this->decimals);
}
}
return Tools::ps_round($shipping_cost, $this->decimals) + $total;
}
Lo sustituyes por lo siguiente:
public function getTotalPaid()
{
$total = 0.00;
$total = $total + $this->context->cart->getOrderTotal(true,Cart::ONLY_PRODUCTS);
if ($this->context->cart->gift == 1) {
$total = Tools::ps_round($total + $this->getGiftWrappingPrice(), $this->decimals);
}
if (version_compare(_PS_VERSION_, '1.5', '<')) { $discounts = $this->context->cart->getDiscounts();
$shipping_cost = $this->context->cart->getOrderShippingCost();
} else {
$discounts = $this->context->cart->getCartRules();
$shipping_cost = $this->context->cart->getTotalShippingCost();
}
if (count($discounts) > 0) {
foreach ($discounts as $product) {
$price = -1 * Tools::ps_round($product['value_real'], $this->decimals);
$total = Tools::ps_round($total + $price, $this->decimals);
}
}
return Tools::ps_round($shipping_cost, $this->decimals) + $total;
}
Tienes mas información en este enlace:
-> https://prestamarketing.com/blog/bug-arreglado-pedidos-pagados-paypal-dan-error-pedido-prestashop/
Nota: recuerda descargar una copia del archivo antes de la modificación para tener el original
Un saludo
Hola de nuevo. Esta solución ya la probé en octubre de 2017 y aparentemente funcionó bien, con este problema podía mantener en ambos lados el mismo redondeo calculado al final de la factura (prestashop por un lado y paypal por el otro). Desgraciadamente en alguna actualización del módulo de Paypal esto desapareció, la función getTotalPaid ya no se encuentra localizable en el archivo process.php ni en ningún otro (que yo haya podido encontrar).
Para salir del paso, lo que hice fue cambiar el método de pago de Paypal a manual:
Con esta opción pierdo el automatismo y tengo que validar cada pago que me hacen por aquí, pero a cambio puedo corregir a mano los decimales que Paypal cuenta de más o de menos con su sistema de redondeo por ítems.
Aprovecho para comentaros que he contactado con los desarrolladores de este módulo oficial, a ver si ellos me pueden orientar, ya sea para lograr llegar a los logs, o para tratar de solventar el Error de pago.
Hola Eva.
Ok dejamos el hilo abierto en espera de lo que te indiquen lso desarrolladores.
Un saludo