Jump to content

[SOLUCIONADO] Problemas Configuración paypal


Olimax10

Recommended Posts

Hola me estoy volviendo loco con paypal ya que esta verificado que la API e Ipn estan bien configuradas, sin embargo cuando debuelbe el mensaje da un error de verificación cURL, en mi servidor me dicen que esta todo bien y hablitadas las ips de paypal para el cortafuegos, ya no se que hacer mas ya que yo recibo el pago y el cliente hace el pago pero sin embargo da el error de verificación y el pedido se añade como error de pago.

Tanto en Paypal como en mi servidor de dominio me dicen que es un error en la programación de validation.php y ya no se que hacer, dejo el ultimo mail que me han mandado a ver si alguien lo entiende y me puede ayudar:

 

 

Por la descripción del problema, entiendo que está recibiendo los pagos correctamente, pero que su integración está teniendo problemas. Ese mensaje se refiere no que haya ningún problema con el protocolo cURL, sino que hay una incidencia a la hora de verificar dichos pagos mediante las notificaciones IPN.

 

Las notificaciones IPN son una herramienta avanzada que permite automatizar una serie de tareas dentro de su propia integración web, como actualizar la base de datos, confirmar el pedido, etc, dependiendo de como esté programada el script que hace uso de las mismas.

 

Si tiene activado IPN, PayPal enviará las variables de la transacción por un método llamado POST a una URL dentro de su servidor.

 

Mirando en su Historial IPN (Seleccione Historial IPN desde el menú Historial) podemos ver que PayPal esta enviando las notificaciones de cada transacción a la siguiente URL:

 

http://rom.......com/ro.......shop/modules/paypal/validation.php

 

y su servidor está respondiendo con HTTP 200 OK, que es la respuesta HTTP Standard y que significa que su servidor ha recibido las notificaciones.

 

Desafortunadamente, no podemos saber exactamente lo que su script IPN está haciendo con la información recibida desde PayPal.

 

¿Está teniendo su script problemas para contactar de nuevo con PayPal a través del método cURL y verificar que el mensaje IPN proviene de su servidor? ¿Está su integración enviando correctamente el mensaje de vuelta a PayPal pero PayPal responde con INVALID en lugar de VERIFIED? Esto es algo que deberá consultar con su desarrollador web. Aquí tiene todas las direcciones IP de PayPal, incluyendo las de IPN, en caso de que tenga algún firewall y necesite añadirlas para las conexione salientes:

 

https://ppmts.custhe.../detail/a_id/92

 

Note que PayPal le enviará una respuesta de VERIFIED solo si el mensaje que su script devuelve a PayPal es el mismo que el recibido excepto añadiendo:

 

cmd=_notify-validate

 

al comienzo de la cadena.

 

Quizás pueda escribir el mensaje que recibe de PayPal en un archivo de texto, y luego escribir el mensaje que su integración va a enviar de vuelta para ver si ambos coinciden exactamente en sus parámetros y en el orden de los mismo (excepto la adición de cmd=_notify_validate).

 

Espero que esta información le sea de utilidad. Si le puedo ayudar en cualquier otra cosa no dude en volver a contactar con nosotros.

 

 

 

Aquí me e quedado, muchas gracias.

Edited by Olimax10
Editado titulo por no ser descriptivo / Normas del foro (see edit history)
Link to comment
Share on other sites

Esto es una locura, yo lo único que e cambiado es que actualice al nuevo tema de Prestashop, mi versión de presta es 1.4.8 no se si habrá influido pero no lo creo ya que el tema se instala en la carpeta /temas.

 

vte46, tu a echo algo parecido?

 

También e visto que en el paypal.php hace referencia a una ruta que yo no tengo:

modules/paypalapi/paypalapi.php

 

no quiero tocar nada por no fastidiarla mas.

 

AYUDA.

 

Gracias por vuestra colaboración.

Link to comment
Share on other sites

Bueno sigo con mis investigaciones, e conseguido eliminar el mensaje de cURL error eliminando estas dos lineas de validation.php

 

 

if (strtoupper($result) != 'VERIFIED')

$errors .= $paypal->getL('curlmethod').$result.' cURL error:'.curl_error($ch);

 

esto tiene sus riesgos, si algún día hay un error verdadero no lo notificara, sin embargo los pedidos me siguen entrando como error de verificación, a pesar de que yo recibo el pago y mi cliente lo envía correcto, entra en mi tienda como error de verificación.

 

Ahora me dispongo a sustituir en validation.php los https por http, a ver que pasa.

 

Pruebo y voy comentando, si no me arruino antes claro jajaja, ya que estoy haciendo todas las pruebas en modo ventas ya que soy incapaz de configurar el SandBox, " ya dije que era novato ".

 

Si alguien puede ayudar con otra duda ya que e leído por algún foro que si tienes configurada la IPN en Paypal no se debe rellenar los campos de la API en el modulo, yo actualmente tengo los dos activos API con usuario y firma " contraseña en blanco" y la IPN apuntando al validation.php, ¿ alguna sugerencia?.

 

Bueno un saludo.

Link to comment
Share on other sites

Sigo investigando, por lo visto o no tiene mi servidor SSL o no los tiene bien configurados, le e pedido que lo corrija.

Mientras tanto e leido que si no tienes credenciales SSL debes tener la API desactivada en PAYPAL y en el MODULO, ya que la pasarela estandar y expres deberia funcionar sin SLL, lo e probado y todo sigue igual Error de verificación.

 

Ya solo me queda o ayuda, o comprar un certificado SSL, que lo que me da miedo es que lo compre y siga sin funcionar, o esperar respuesta del servido pero en esta opción no tengo confianza ya que para ellos todo esta bien y lo suyo es lo mejor, !si hay problemas sera de programación! osea que me busque la vida.

 

sigo investigando y os cuento.

Edited by Olimax10 (see edit history)
Link to comment
Share on other sites

sigo investigando y la verdad estoy muy desanimado ya que no encuentro ni un poquito de luz a mi problema, ya no se que mas probar, me e fijado que aunque tengo configurada las reglas de impuestos y las factura las desglosa bien, en el historial de pedidos me pone:

 

Total productos (sin IVA): 1,82€

 

Cuando en realidad ese precio es con IVA

Como por lo que se ve en Paypal debe coincidir el precio, no se si puede venir por ay el problema, aunque por lo que e leido que no desglose el historial debe ser por algún fallo en la programación y no lo muestra.

 

La verdad no se si tirar la toalla, no va con migo pero esto me esta superando.

Si me pudieseis ayudar un poco os lo agradecería muchísimo.

 

Un saludo.

Link to comment
Share on other sites

Hola de nuevo como podéis ver no me rendí y si amigos lo e solucionado, " eso si con la ayuda de un gran amigo".

Bien a quien le pueda interesar voy a explicar como lo e solucionado yo, a mi me funciona perfectamente eso no quiere decir que valla a ser la solución en todos los servidores ya que como dije no soy un experto y no me hago responsable.

 

Lo primero respecto a que en el historial me ponía los precios sin IVA solo era un tema de las traducciones, en TAX Incl = con IVA y ya esta.

 

Respecto al PAYPAL

No tengo certificado SSL en mi servidor, la API configurada con usuario y contraseña o con usuario y firma. IPN configurada en PAYPAL apuntando a validation.php, moneda de tienda igual a moneda de Paypal.

 

Bien con todo esto echo lo importante, perdonar si no me explico muy bien ya que repito no soy un experto.

El meollo de todo esta en el validation.php lo que hicimos fue un volcado en un archivo log para ver los parámetros que validation.php pasaba de paypal, de esta manera:

 

//mio volcado de $params a fichero

 

$fichero = fopen("log.txt", "a");

fwrite($fichero, "|parametros-");

fwrite($fichero, $params);

 

//finmio

 

Con esto nos escribió un archivo con todos los datos de esta manera vimos que:

 

"payment_status" era COMPLETED

y "payer_status" era VERIFIED, sin embargo en el código no le llama payer_status sino "result"

 

así que probamos a cambiarlo y sustituimos:

 

 

if (strtoupper($result) != 'VERIFIED')

$errors .= $paypal->getL('curlmethod').$result.' cURL error:'.curl_error($ch);

curl_close($ch);

 

por:

 

 

if (strtoupper($_POST["payer_status"]) != 'VERIFIED')

$errors .= $paypal->getL('curlmethod').$result.' cURL error:'.curl_error($ch);

curl_close($ch);

 

de esta manera el error de cURL desapareció pero seguía el error de pago, y es que mas abajo verifica el pago, hacer los cambios de la misma manera, donde pone:

 

 

// Printing errors...

if (strtoupper($result) == 'VERIFIED')

 

pusimos:

 

 

// Printing errors...

if (strtoupper($_POST["payer_status"]) == 'VERIFIED')

 

y sorpresa !!!!PAGO ACEPTADO!!!!

 

Estoy muy contento de haberlo podido solucionar y espero que a alguien le pueda ser de ayuda, me gustaría que alguien mas experto del foro pueda repasarlo y me confirme que lo echo es correcto y no derive en un mal funcionamiento por otro lado, yo llevo varios días probando y todo va perfecto, pero no estaría mal la opinión de alguien mas experto. Dejo el codigo completo por si me e liado explicando:

 

 

 

 

 

 

<?php

/*

* 2007-2012 PrestaShop

*

* NOTICE OF LICENSE

*

* This source file is subject to the Academic Free License (AFL 3.0)

* that is bundled with this package in the file LICENSE.txt.

* It is also available through the world-wide-web at this URL:

* http://opensource.or...ses/afl-3.0.php

* If you did not receive a copy of the license and are unable to

* obtain it through the world-wide-web, please send an email

* to [email protected] so we can send you a copy immediately.

*

* DISCLAIMER

*

* Do not edit or add to this file if you wish to upgrade PrestaShop to newer

* versions in the future. If you wish to customize PrestaShop for your

* needs please refer to http://www.prestashop.com for more information.

*

* @author PrestaShop SA <[email protected]>

* @copyright 2007-2012 PrestaShop SA

* @version Release: $Revision: 14011 $

* @license http://opensource.or...ses/afl-3.0.php Academic Free License (AFL 3.0)

* International Registered Trademark & Property of PrestaShop SA

*/

 

include(dirname(__FILE__).'/../../config/config.inc.php');

include(dirname(__FILE__).'/paypal.php');

 

$errors = '';

$result = false;

$paypal = new Paypal();

 

// Fill params

$params = 'cmd=_notify-validate';

foreach ($_POST AS $key => $value)

$params .= '&'.$key.'='.urlencode(stripslashes($value));

 

//mio volcado de $params a fichero

//$fichero = fopen("log.txt", "a");

//fwrite($fichero, "|parametros-");

//fwrite($fichero, $params);

//finmio

 

// PayPal Server

$paypalServer = 'www.'.(Configuration::get('PAYPAL_SANDBOX') ? 'sandbox.' : '').'paypal.com';

 

// Getting PayPal data...

if (function_exists('curl_exec'))

{

// curl ready

$ch = curl_init('https://' . $paypalServer . '/cgi-bin/webscr');

 

// If the above fails, then try the url with a trailing slash (fixes problems on some servers)

if (!$ch)

$ch = curl_init('https://' . $paypalServer . '/cgi-bin/webscr/');

 

if (!$ch)

$errors .= $paypal->getL('connect').' '.$paypal->getL('curlmethodfailed');

else

{

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HEADER, false);

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

 

$result = curl_exec($ch);

 

 

//if (strtoupper($result) != 'VERIFIED')

//mio comento la de arriba e incorporo la de abajo

if (strtoupper($_POST["payer_status"]) != 'VERIFIED')

$errors .= $paypal->getL('curlmethod').$result.' cURL error:'.curl_error($ch);

curl_close($ch);

}

}

elseif (($fp = @fsockopen('ssl://' . $paypalServer, 443, $errno, $errstr, 30)) || ($fp = @fsockopen($paypalServer, 80, $errno, $errstr, 30)))

{

// fsockopen ready

$header = 'POST /cgi-bin/webscr HTTP/1.0'."\r\n" .

'Host: '.$paypalServer."\r\n".

'Content-Type: application/x-www-form-urlencoded'."\r\n".

'Content-Length: '.Tools::strlen($params)."\r\n".

'Connection: close'."\r\n\r\n";

fputs($fp, $header.$params);

 

$read = '';

while (!feof($fp))

{

$reading = trim(fgets($fp, 1024));

$read .= $reading;

if (strtoupper($reading) == 'VERIFIED' OR strtoupper($reading) == 'INVALID')

{

$result = $reading;

break;

}

}

if (strtoupper($result) != 'VERIFIED')

$errors .= $paypal->getL('socketmethod').$result;

fclose($fp);

}

else

$errors = $paypal->getL('connect').$paypal->getL('nomethod');

 

$cart_secure = (isset($_POST['custom']) ? explode('_', $_POST['custom']) : array());

// If there isn't any cart ID, set it to "0"

if (!isset($cart_secure[0]))

$cart_secure[0] = 0;

// If there isn't any secure key, set it to anything short of "false"

if (!isset($cart_secure[1]))

$cart_secure[1] = '42';

 

// Printing errors...

//if (strtoupper($result) == 'VERIFIED')

//mio comento la de arriba e incorporo la de abajo

if (strtoupper($_POST["payer_status"]) == 'VERIFIED')

{

if (!isset($_POST['mc_gross']))

{

$errors .= $paypal->getL('mc_gross').'<br />';

$_POST['mc_gross'] = 0;

}

if (!isset($_POST['payment_status']))

{

$errors .= $paypal->getL('payment_status').'<br />';

$_POST['payment_status'] = 'ko';

}

elseif (strtoupper($_POST['payment_status']) != 'COMPLETED')

$errors .= $paypal->getL('payment').$_POST['payment_status'].'<br />';

if (!isset($_POST['custom']))

$errors .= $paypal->getL('custom').'<br />';

if (!isset($_POST['txn_id']))

{

$errors .= $paypal->getL('txn_id').'<br />';

$_POST['txn_id'] = 0;

}

if (!isset($_POST['mc_currency']))

$errors .= $paypal->getL('mc_currency').'<br />';

if (empty($errors))

{

$cart = new Cart((int)$cart_secure[0]);

if (!$cart->id)

$errors = $paypal->getL('cart').'<br />';

elseif (Order::getOrderByCartId((int)($cart_secure[0])))

$errors = $paypal->getL('order').'<br />';

else

$paypal->validateOrder((int)$cart_secure[0], Configuration::get('PS_OS_PAYMENT'), (float)($_POST['mc_gross']), $paypal->displayName, $paypal->getL('transaction').$_POST['txn_id'], array('transaction_id' => $_POST['txn_id'], 'payment_status' => $_POST['payment_status']), NULL, false, $cart_secure[1]);

}

}

else

$errors .= $paypal->getL('verified');

 

// Set transaction details if pcc is defiend in PaymentModule class

if (isset($paypal->pcc))

{

$this->pcc->transaction_id = (isset($_POST['txn_id']) ? $_POST['txn_id'] : '');

}

 

if (!empty($errors) AND isset($_POST['custom']))

{

if (strtoupper($_POST['payment_status']) == 'PENDING')

$paypal->validateOrder((int)$cart_secure[0], Configuration::get('PS_OS_PAYPAL'), (float)$_POST['mc_gross'], $paypal->displayName, $paypal->getL('transaction').$_POST['txn_id'].'<br />'.$errors, array('transaction_id' => $_POST['txn_id'], 'payment_status' => $_POST['payment_status']), NULL, false, $cart_secure[1]);

else

$paypal->validateOrder((int)$cart_secure[0], Configuration::get('PS_OS_ERROR'), 0, $paypal->displayName, $errors.'<br />', array(), NULL, false, $cart_secure[1]);

}

 

 

 

 

Un saludo.

post-386317-0-17468500-1348179410_thumb.jpg

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...