Pierda dinero para dárselo a PayPal no aplicando recargos en sus transacciones con PayPal

Al entrar a mi cuenta PayPal me he visto con un «consejo» por parte de PayPal que me ha hecho reír a carcajadas. Me ha resultado penoso, muy penoso y sin lugar a dudas sensacionalista a más no poder.
El «consejo» es tal que así :

Sea más competitivo y no aplique recargos en sus transacciones con PayPal

PayPal, es un sistema ideal para realizar y recibir pagos en Internet, ya que es rápido, seguro, sencillo y totalmente gratuito para compradores.

Si usted es vendedor, sea más competitivo y no aplique recargos en sus transacciones con PayPal.

Los vendedores que ofrecen PayPal sin recargo consiguen una mejor calidad en las pujas y pueden llegar a recibir un incremento de entre el 5% y el 10% sobre el precio final del artículo.

La mayoría de los compradores encuentra el cálculo del recargo complicado y desalentador. Todo esto puede posiblemente ocasionar un impago por parte de los pujadores que deciden no continuar con la transacción al darse cuenta de que les están aplicando un recargo.

La mayoría de los vendedores no aplica recargo al aceptar pagos en Internet. Asegúrese de mostrar un único precio final del artículo más los gastos de envío, sin añadir costes adicionales.

Muchos compradores ignoran el recargo a pesar de estar especificado en la descripción del anuncio, y pagan sólo el artículo más los gastos de envío.

Aplicar recargos genera un aumento de la comunicación entre compradores y vendedores, demorando el pago final del artículo.

Para obtener más información sobre la política de recargo, consulte las políticas de PayPal y eBay en los siguientes vínculos: …

Lo que yo entiendo es lo siguiente :

Pierda dinero para dárselo a PayPal no aplicando recargos en sus transacciones con PayPal

PayPal, es uno de los muchos sistemas para realizar y recibir pagos en Internet. Suele ir rápido, es seguro, sencillo para los compradores que tienen dada de alta ya una cuenta con su respectiva tarjeta de crédito o cartilla bancaria asociada (para el resto ya es como cualquier otro sistema) y seguramente te van a cobrar una comisión por utilizar nuestro método de pago, pero ojo los malos son los vendedores, nosotros no cobramos comisiones a los compradores (las comisiones que cobramos al vendedor mejor las callamos).

Si usted es vendedor (al que le cobramos las comisiones), sea más competitivo y fomente NUESTRO negocio perdiendo usted dinero cada vez que paguen mediante PayPal, ¡no aplique recargos en sus transacciones con PayPal!

Los vendedores que ofrecen PayPal sin recargo consiguen una mejor calidad en las pujas y por si fuera poco LIGAS MÁS, además pueden llegar a recibir un incremento de entre el 5% y el 10% sobre el precio final del artículo (ahora lo más normal del mundo debe de ser tener una tienda en la que en vez de vender haces subastas de artículos … sí, lo más normal … si eres ebay…). Y por si fuera poco todo lo que te decimos se encuentra 100% verificado ya que aunque no tengamos ni puta idea sobre tu negocio lo hemos consultado con la bruja Lola.

La mayoría de los compradores encuentra el cálculo del recargo complicado y desalentador (se les salen los ojos y a veces hasta les explotan). Como te matamos con comisiones puede dar lugar a un impago por parte de los pujadores que deciden no continuar con la transacción al darse cuenta de que les están aplicando un recargo por nuestra culpa.

La mayoría de los vendedores no aplica recargo al aceptar pagos en Internet (sobre todo en Pitufolandia). Te ordenamos que muestres un único precio final del artículo más los gastos de envío, sin añadir costes adicionales (ya puestos contrareembolso también gratis). Nosotros vamos a cobrarte las comisiones igualmente, no es negociable, pero nos vas a hacer el favor, no?

Como nos encontramos en la mente de todos los compradores, sabemos al 100% que ignoran el recargo a pesar de estar especificado claramente por lo que pagan sólo el artículo más los gastos de envío (en dos líneas hemos pasado de que los clientes no nos compran por el recargo que PayPal nos obliga a hacerles a que directamente ni se dan cuenta ¿es un poquito contradictorio, confuso?).

Aplicar recargos genera un aumento de la comunicación entre compradores y vendedores, demorando el pago final del artículo 0,01 segundos ya que tus clientes tienen que leer 1 línea más en la que dice «Recargo método de pago PayPal x €».

Para evitarnos tener que bajar las comisiones que les cobramos le recomendamos que fomente nuestro método de pago ante posibles mejores ofertas de nuestra competencia, te estamos haciendo un favor desde PayPal…

Conclusión :
– PayPal nos pide que fomentemos su método de pago para hacerlo más competitivo sin que ellos tengan que mover un dedo u ofrecernos mejores comisiones. Es decir que lo equiparemos a SU competencia aunque las comisiones de PayPal sean más altas que los otros métodos (tarjeta de crédito, transferencia bancaria …), eso si, además a cambio de que nosotros perdamos el dinero que ellos ganan.
¿Absurdo? Rotundamente SI.

¿Qué opinan ustedes?

Realizar pruebas de pagos con PayPal

Añado como anexo al tutorial Generador automático de avisos de pagos con Paypal información acerca de las pruebas para comprobar si nuestro script funciona correctamente o no.

Existen dos modos factibles, a mi juicio, para realizar pruebas con el proceso.
1º Realizar pruebas desde el recinto de seguridad/desarrolladores de PayPal.
2º Realizar las pruebas con dos cuentas en PayPal directamente y reintegrar las cantidades.
(Recomendada)

1º Realizar pruebas desde el recinto de seguridad/desarrolladores de PayPal.

Antes que nada decir que los datos aportados en el recinto de seguridad, son datos ficticios y por lo tanto carecen de validez real. Otro apunte que debo de dar es que recrea fielmente el entorno de PayPal, y más que ser un punto a su favor es una contra, puesto que personalizar las cuentas y demás puede resultarnos bastante farragoso.

Para realizar pruebas desde el recinto de seguridad/desarrollo de PayPal, deberemos seguir el link que tenemos en el pie de página de PayPal, Programadores.
La página esta en inglés y creo que las alternativas son el francés y el alemán.
Nos registranos en el apartado Testing / Sing Up y accedemos a nuestra cuenta.
Una vez dentro podemos crear usuarios pre-builders ya sean vendedor o comprador, que nos evitará el tedioso registro de las cuentas a mano. Como ya he dicho las alternativas de idioma son pocas y estos estarán en inglés, francés o alemán.
El recinto de seguridad te permite ver los mails ficticios en el apartado que tiene dedicado a dichos datos.
Para hacer las pruebas simplemente debes logearte con los datos de tus usuarios ficticios y realizar compras.
Encarecidamente, no recomiendo este método para realizar las pruebas a menos que tengas la paciencia ilimitada de un santo, puesto que el sitio parece estar siempre congestionado y la navegación se hace tediosa.

Realizar las pruebas con dos cuentas en PayPal directamente y reintegrar las cantidades.

Simplemente debes crearte una cuenta de vendedor y otra de comprador (personal mismamente) o acordar con algún amigo las pruebas. Con la cuenta comprador compras, para realizar las pruebas te sirve una cantidad tan desechable como lo son 0,01 céntimos, y con el vendedor reintegras la cantidad, con lo cual la transacción es llevaba atrás y no pierdes los 0,01 céntimos ya que se reintegra la cantidad y las tasas de la operación.
Para reintegrar un ingreso desde Mi Cuenta clicas en los detalles del ingreso, pulsas en reintegrar (esta casi al final del informe), seleccionas la cantidad, reintegras y listo.

Espero que os sirva de utilidad, la documentación, capitulo 14 – pag 89, aporta alguna que otra forma más para carritos de la compra y demás.

Generador automático de avisos de pagos con Paypal

Bueno, hoy voy a explicar el proceso para saber cuando se ha hecho un pago en tu cuenta de PayPal.
Me podrías decir, pués es simple, te avisan por correo.
Pero la cuestión es la siguiente, automatizar el recibo de los avisos para poder generar un informe personalizado o desencadenar acciones en nuestra base de datos y un largo etcétera, las posibilidades son bastante amplias.


Bueno lo primero que tenemos que hacer, es tener una cuenta en PayPal.
Para activar la Notificación de pago instantánea debes acceder a tu cuenta.
Desde el apartado Mi Cuenta accedes al Perfil y bajo la cabecera Preferencias de venta clicamos en Preferencias de Notificación de pago instantánea.
Una vez dentro pulsamos en editar.
Activamos la casilla y asignamos una url, que será el destino de los avisos.

Decir que también se puede activar la Notificación de pago instantánea agregando el campo notify_url=dirección url, pero no creo que sea muy recomendable hacerlo (a menos que tengas varias cuentas de correo asignadas en tu cuenta paypal) puesto que es un campo que puede ser visionado por cualquiera.

Una vez hemos activado el IPN, generamos los botones de donación/pago y los agregamos a nuestro sitio web.

Terminada la «infraestructura de venta visual» solamente nos falta el archivo que hará de receptor de los avisos.

Decir que en la web de PayPal ponen a disposición una serie de scripts de ejemplo para los siguientes lenguajes :
ASP.Net/C#
ASP.Net/VB
ASP/VBScript
Cold Fusion
Java/JSP
PERL
PHP
(Hace falta estar logeado en paypal para poder verlos, para la documentación también)
La documentación así la podéis encontrar en

Si no podéis acceder os la subo a algún sitio.

Yo voy a proseguir a partir del ejemplo de PHP 4.1 que ofrecen en la web, voy a comentarlo y
luego pondré un ejemplo con una base de datos y que cada cual lo adapte a sus necesidades.
Decir que pese a mi esfuerzo por guardar márgenes y demás en los ejemplos para un mejor visionado el muy perrete se ha comido las tabulaciones al publicar el tutorial ¬¬’

PHP 4.1

//comentado por Roberto Herrero para su blog http://blog-indomita.blogspot.com/
// read the post from PayPal system and add 'cmd'
//es la variable señuelo que hay que devolver a PayPal para que compruebe su veracidad
$req = 'cmd=_notify-validate';

//recogemos todos los datos POST que nos envía paypal y los guardamos en el mismo orden
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}

// post back to PayPal system to validate
//creamos la petición de llamada para avisar de la recepción
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
//en la documentación dice que pongas www.paypal.es pero supongo que es un errata, con .es no funciona así que deja el .com
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);

// assign posted variables to local variables
//tomamos los valores del POST anterior
//nombre que hemos asignado al crear el botón
$item_name = $_POST['item_name'];
//número personal que hemos asignado al crear el botón
$item_number = $_POST['item_number'];
//estado del pago la buena noticia es que este en Completed xD
$payment_status = $_POST['payment_status'];
//ojo aquí que el payment_amount es el mc_gross no liarse que al mirar la documentación puede dar a confusiones
//la cantidad del ingreso
$payment_amount = $_POST['mc_gross'];
//igual que antes ojito xD
//la moneda del ingreso
$payment_currency = $_POST['mc_currency'];
//identificador alfanumérico que PayPal le asigna
$txn_id = $_POST['txn_id'];
//cuenta a la que se ha ingresado
$receiver_email = $_POST['receiver_email'];
//emisor del pago
$payer_email = $_POST['payer_email'];

if (!$fp) {
// HTTP ERROR
//no hemos podido conectar con paypal
} else {
//tenemos respuesta de paypal
fputs ($fp, $header . $req);
//leémos los datos recibidos, realmente estamos buscando si los datos que hemos recogido con anterioridad son válidos, ya que algún graciosillo/lamercillo puede estar intentando tomarnos el pelo
while (!feof($fp)) {
$res = fgets ($fp, 1024);
//comprobación verificada
if (strcmp ($res, "VERIFIED") == 0) {
// check the payment_status is Completed
//ahora tenemos que comprobar que el payment_status es Completed, en la documentación pone Completado pero ni caso xD
// check that txn_id has not been previously processed
//comprobamos en nuestra base de datos que no sea una transacción ya procesada, ¿por qué? para evitar malas intenciones de terceros no tiene sentido procesar algo que ya hemos procesado
// check that receiver_email is your Primary PayPal email
//comprobamos si el email de la transacción es el nuestro
// check that payment_amount/payment_currency are correct
//comprobamos que tanto la cantidad como la moneda son las correctas
// process payment
//si todo ha ido bien ya podemos procesar el pago/donación

//la comprobación es incorrecta
}else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
//aquí puedes guardar un log para ir investigando quién esta jugando con tu sistema
}
}
//cerramos
fclose ($fp);
}

Ejemplo con base de datos MySql
Requisitos previos:
* Conocer como crear el conector $link.
Te dejo el tutorial por si te interesa: Tutorial Conexión a MySql desde PHP
* La base de datos debe tener tantos campos como parametros desees guardar, en este caso guardaremos la fecha(datetime) y una cadena(varchar o text) con todos los parámetros, amén del identificador(varchar) único que otorga PayPal para la transacción

//comentado por Roberto Herrero para su blog https://www.miblog.indomita.org/
//recomiendo añadir un parámetro personal a la url que utilizaremos para gestionar los pagos, nuestro señuelo y si esta encriptado pos mejor
//con comprobar si la variable ha sido enviada creo que es suficiente,
pero si eres un paranoico y no te fias de los mamones que navegan por la red
puedes añadir && $_GET["antimamones"]==md5("nointentesjodermequetevasaenterar")
//el parámetro que pases por GET recuerda que tienes que agregarlo en el perfil de url IPN del comienzo de este manual.
if(isset($_GET["antimamones"]))
nuevo_ingreso();


    function nuevo_ingreso(){
      //esto ya lo he comentado antes así que paso xD
      // read the post from PayPal system and add 'cmd'
      $req = 'cmd=_notify-validate';

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

    // post back to PayPal system to validate
    $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
    $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);

    // assign posted variables to local variables
    $item_name = $_POST['item_name'];
    $item_number = $_POST['item_number'];
    $payment_status = $_POST['payment_status'];
    $payment_amount = $_POST['mc_gross'];
    $payment_currency = $_POST['mc_currency'];
    $txn_id = $_POST['txn_id'];
    $receiver_email = $_POST['receiver_email'];
    $payer_email = $_POST['payer_email'];
    //podemos añadir el campo custom en nuestros botones (en el código una vez generados) con la información que deseemos, esto viene bien para identificar al usuario
    $custom = $_POST['custom'];


    //creamos una conexión a nuestra base de datos
    conecta($link); 
    if (!$fp) {
      // HTTP ERROR
    } else {
      //recorremos respuesta      
      fputs ($fp, $header . $req);

      while (!feof($fp)) {
        $res = fgets ($fp, 1024);
        if (strcmp ($res, "VERIFIED") == 0) {
       // check the payment_status is Completed
       if(strcmp ($payment_status, "Completed")==0){
         //la transacción esta completada
        // check that txn_id has not been previously processed

       //la función es_idenfiticador_alfanumerico comprueba que no inyecten sentencias SQL (usease antimamoneo) esta definida al final
       if(es_identificador_alfanumerico($txn_id)) {
         //comprobamos si no la hemos procesado ya
        $r=mysql_query("select count(txn_id) as repes from ingresos_recibidos where txn_id='".$txn_id."'",$link);
        $f=mysql_fetch_array($r);
        $repetida=(int)$f["repes"];
       }else{ $repetida=1;}
      //en el caso de que no sea válido tendremos valor 1
      if($repetida==0){
      //no es una transacción repetida
      // check that receiver_email is your Primary PayPal email
      if(strcmp ($receiver_email, "micorreo@loquesea.com")==0){
      //es un correo válido
      // check that payment_amount/payment_currency are correct
      //ahora pasamos a comprobar que tipo de pago ha realizado tenemos que anidar los diferentes casos de alguna manera, en el ejemplo lo he hecho con 2 casos
     //obtengo el usuario que ha hecho el ingreso del campo custom
     //supongo que tendrás tu propia clase de acceso y recogida de datos, si no la tienes lo que pongo es funcional
     $r=mysql_query("select usuario from tabla_usuarios where usuario=".((int)$custom), $link);
     $f=mysql_fetch_array($r);
     $usuario=(int)$f["usuario"];
     //caso 1: el pago es de 1.99 la moneda el EURO que son los valores que debería de tener el elemento identificador personal 1
     if($payment_amount==1.99&&strcmp($payment_currency, "EUR")==0
    &&$item_number==1&&$usuario>0){
    //aquí van las operaciones de guardado de informe y las que desencadenas al recibir un pago
    //ingresamos los datos
    $cadena=sprintf("guardando informe
    item_name=%s

    item_number=%s

    custom=%s

    payment_status=%s

    mc_gross=%s

    mc_currency=%s

    txn_id=%s

    receiver_email=%s

    payer_email=%s",
    $item_name,$item_number,$custom,$payment_status,$payment_amount,$payment_currency,$txn_id,$receiver_email,$payer_email);
    mysql_query("insert into ingresos_recibidos (cadena,txn_id,fecha) values ('".$cadena."'
    ,'".$txn_id."','".date("Y-m-d H:i:s")."')",$c);
    //actualizamos las gracias que le damos al usuario
    (mil gracias)

    mysql_query("update tabla_usuarios set gracias=gracias+1000 where usuario=".$usuario,$link);
    //caso 2: el pago es de 6.99 la moneda el EURO que son los valores que debería de tener el elemento identificador personal 2
    }elseif($payment_amount==6.99&&strcmp($payment_currency, "EUR")==0
    &&$item_number==2&&$usuario>0){
    //aquí van las operaciones de guardado de informe y las que desencadenas al recibir un pago
    //lo mismo que antes aunque yo recomiendo hacerse una funcioncita o algo que evite repetir código
    //actualizamos las gracias que le damos al usuario
    (un millón de gracias)
    mysql_query("update tabla_usuarios set gracias=gracias+1000000 where usuario=".$usuario,$link);
    }
    }
    }
    }
    }elseif (strcmp ($res, "INVALID") == 0) {
    // log for manual investigation
    }
    }
    fclose ($fp);
    }
    }

    //funcion antimamoneo, realmente no se el rango total de caractéres raros que envia paypal así que habría que adaptarla xD
    function es_identificador_alfanumerico($cadena){
      return ereg("^[A-Za-z0-9_]*$",$cadena);
    }

No he probado el código y seguramente tenga algun pequeño fallo (falta de paréntesis, ; o alguna } )

Reitero de que es un código orientativo y que cada uno tiene que adaptarlo y optimizarlo.
Paypal ofrece otros métodos IPN que incluyen conexión https y demás en el servidor.
El código del ejemplo no necesita una conexión segura para llevarse a cabo.
Si alguien ve algun agujero de seguridad le agradecería que me lo comunicase para modificarlo.

Anexo: Realizar pruebas de pagos con PayPal

Espero que a alguien le sirva de ayuda.