Tutorial: Saca provecho a tu Web (PayPal y más)
Hace unos días puse en una web un servicio de compra por PayPal. Al principio pensaba que no me llevaría mucho, que sería algo sencillo. El problema es que quise hacerlo de la forma más segura posible, como es lógico, y eso me complicó bastante la tarea.
Es por esto que he decidido elaborar una especie de tutorial para ayudaros a sacar provecho a vuestras páginas web con el servicio que PayPal nos ofrece. Además añadiré otra guía para utilizar un servicio de pagos por sms, en este caso con el servicio de allopass.com.
No pretendo hacer propaganda de ninguna empresa ni servicio. He elegido estos en concreto debido a que son los que yo configuré. Si se considera la publicación, o cualquier parte de esta, como inapropiada, ruego que se me comunique o modere directamente, el único fin del post es ayudar y facilitar a los usuarios.
Dicho esto ¡comencemos !
Para entender este tutorial es necesario tener conocimientos básicos de PHP. Para utilizarlo como recurso (Ctrl+c, Ctrl+v) no se necesita más que sentido común.
PayPal:
Esta parte la dividiré en 3 apartados (ordenados cronológicamente por el proceso):
- Cifrado: En este apartado se hablará del cifrado de los botones de PayPal para que nadie nos modifique los datos que queremos pasar (La obtención del certificado y la clave están detallados para Windows).
- IPN: Instant Payment Notification, o sea, la URL de notificación donde se procesa la petición y se actualizan los datos.
- Retroceso automático: Es lo mismo que URL de retorno, volver a nuestra página y mostrar la información adecuada.
1. Cifrado de los botones:- OPCIONAL: Para maximizar la seguridad aconsejo activar la opción que nos ofrece PayPal "Pagos en sitio web codificados", lo que hace que sólo se acepten las peticiones de botones codificados. Esta opción se encuentra en: Perfil->Mis herramientas de Venta->Preferencias de pago en el sitio Web->Pagos en sitio web codificados
El cifrado de la API utiliza openSSL así que lo primero que necesitamos es crear nuestro certificado SSL, de la siguiente manera (Windows).
- Seguid el siguiente enlace: OpenSSL Windows
- Descargad Visual C++ 2008 Redistributables (si no lo tenéis instalado) y Win32 OpenSSL (versión que querais).
- Intalarlos por ese orden, la instalación es totalmente intuitiva.
Una vez instalados, abre el símbolo del sistema (Buscar/Ejecutar-> cmd) y ve al directorio dónde instalaste openSSL (Normalmente C:\OpenSSL-Win32). Ahora dirígete a la carpeta "bin" (C:\OpenSSL-Win32\bin).
Ahora crearemos la clave privada y el certificado necesario para utilizar la API de PayPal (si quereis más información sobre el funcionamiento de openSSL podéis visitar el enlace (1) de fuentes)
- Desde C:\OpenSSL-Win32\bin escribimos: "openssl genrsa -out my-prvkey.pem 1024" (SIN COMILLAS)
Esto genera una clave privada 1024-bit RSA. - Una vez termine ejecutamos: "openssl req -new -key my-prvkey.pem -x509 -days 3650 -out my-pubcert.pem" (SIN COMILLAS) Nos hará unas preguntas que responderemos como muestra el ejemplo en la consola (los datos no son importantes es para generar tu certificado único)
Esto genera un certificado público válido durante 10 años (3650 días), podéis cambiar ese valor, en la guía oficial de PayPal utilizan 365 días.
Ahora debemos subir nuestro certificado a PayPal. Vamos a Perfil->Mis herramientas de Venta->Configuración de pago codificado
Se cargará una nueva página, algo parecido a:
Aquí lo primero es subir el certificado, le damos a añadir y subimos el certificado que generamos.
Nos dará una ID de CERTIFICADO, la apuntamos porque la necesitaremos.
Además hacemos click en el primer download y nos descargamos el certificado público de PayPal.
Por último, para cifrar los botones necesitamos la siguiente clase:
Clase de Cifrado
¡Ya tenemos todo lo necesario para encriptar nuestros botones! Haremos un repaso:
- Clave privada SSL
- Ceritficado público SSL y su ID en PayPal
- Certificado público PayPal
- Clase PayPalEWP (php)
Abrimos el archivo dónde pondremos nuestro botón de comprar (debe ser de extensión .php).
Añadimos el siguiente código:
Código PHP:
<?php
$ruta = '' //Variable para guardar la ruta hacia la clase Class.PayPalEWP.php
$cert_id = 'XXXXXXXXXX'; //Id del certificado
include($ruta ."Class.PayPalEWP.php"); //Ruta hacia la clase
$paypal = new PayPalEWP();
$paypal->setTempFileDirectory($ruta ."tmp"); // HAY que crear una carpeta tmp en el directorio de la clase
$paypal->setCertificate($ruta ."my-pubcert.pem", $ruta ."my-prvkey.pem");
$paypal->setPayPalCertificate($ruta ."paypal_cert_pem.txt");
$paypal->setCertificateID($cert_id);
$boton1 = array(
'cmd' => '_xclick',
'cert_id' => $cert_id,
'business' => '[email protected]',
'receiver_email' => '[email protected]',
'custom' => 'Datos personalizados a mayores', //Por si quieres añadir algún dato más
'item_name' => 'Nombre del objeto', // Nombre del objeto que vendemos
'currency_code' => 'EUR', //Tipo de moneda
'amount' => '10', //Precio
'lc' => 'ES', //Idioma
'no_note' => '1', //1-0 Mostrar cuadro de texto
'no_shipping' => '1',
'return' => 'http://urlDeRetorno', //Url de retorno a la que nos devuelve paypal al comprar (incluido en el tuto)
'cancel_return' => 'http://urlDeRetorno', //Url a la que nos devuelve al cancelar la compra
'notify_url' => 'http://urlDeRetorno', //Url de notificación dónde se realiza el IPN (incluido en el tuto)
'cbt' => 'Texto Voler a mi página'
);
?>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----<?php echo $paypal->encryptButton($boton1); ?>-----END PKCS7-----"/>
<input type="image" src="https://www.paypal.com/es_XC/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal, la forma más segura y rápida de pagar en línea.">
<img alt="" border="0" src="https://www.paypal.com/es_XC/i/scr/pixel.gif" width="1" height="1">
</form>
Obviamente el botón se puede generar dinámicamente sacando los datos de una DB y hay muchas más variables además de las que puse yo.
Podéis encontrar mucha más información como el significado de 'no_shipping' en el enlace (2) y el enlace(3) de las fuentes.
¡LISTO! De esta manera ya tenemos nuestro botón cifrado que sólo podrá descifrar PayPal gracias a los datos que les proporcionamos al subir nuestro certificado público.