PayPal

Helper con funciones auxiliares para generas pagos integrados utilizando la API SDK de PayPal.

Conectar nuestra aplicación a PayPal

  • Antes de poder utilizar este Helper, debemos registrar una APP en Paypal, para ello debemos ir a PayPal Developer e Iniciar Sesión con una cuenta real y verificada de PayPal.
  • Lo siguiente es ir a Applications y en REST API apps debemos crear una nueva APP.

Luego en SANDBOX API CREDENTIALS debemos tomar los datos de Client ID y Secret para colocarlos respectivamente en ./core/config.php

# PayPal SDK
    define('PAYPAL_MODE','sandbox'); # sandbox ó live
    define('PAYPAL_CLIENT_ID','AQUÍ EL Client ID');
    define('PAYPAL_CLIENT_SECRET','AQUÍ EL Secret');

También podemos notar que PAYPAL_MODE que por defecto es sandbox, este estado es para realizar pruebas con dinero falso, es sólo para desarrollo, una vez montemos en producción debemos utilizar live en vez de sandbox, esto trae como consecuencia, uso de dinero real y las credenciales de la api cambian ya que no son las mismas que en modo sandbox, para obtener las nuevas credenciales, desde nuestra app en PayPal debemos dar clic en "Live"

PayPal Helper

Crear Pago con PayPal

Supongamos que tenemos una vista en la cual existe un botón de un carrito llamado "Pagar", al darle allí lo mandamos a un controlador llamado pagarController

public function __construct() {
    # Dentro del controlador llamamos al modelo Pagar y al método HacerPago()
    $p = new Pagar;
    $p->HacerPago();
}

A continuación en el modelo Pagar

final class Pagar extends Models implements OCREND {

    public function __construct() {
        parent::__construct();
    }

    public function HacerPago() {
        # De alguna forma obtenemos la lista de elementos del carrito
        # Entonces debemos generar un arreglo con la forma
        $items = array(
            array(), # Item 1
            array(), # Item 2
            array(), # Item 3 (Todos los items que estén en nuestro carrito)
            # Acá la estructura interna de cada item
            array(
            'nombre' => 'Pelota',
            'cantidad' => 1, # Una pelota,
            'precio' => 200.4, # 200.4 euros, o dólares, o alguna moneda, la moneda se define después
            # En precio sólo va la magnitud del precio, no la moneda (un float)
            'envio' => 0, # Coste por el envío de este item
            'tax' => # Coste por el tax de este item
        )
        );

        # Cargamos el Helper
        Helper::load('paypal');

        # Pasamos la configuración inicial
        $config = array(
            'url' => 'pagado/', # Pasamos la URL en donde se debe verificar si el pago se hizo con éxito en PayPal,
            'descripcion' => 'Descripción del carrito de los items'
        );

        /**
        * Generamos el pago
          * El tercer parámetro indica si los costes de tax y shipping son individuales para cada producto, o totales
            * El cuarto parámetro es la MONEDA, USD, EUR, etc...
        */
        $pago = Paypal::pay($config, $items, false, 'USD');

        # Si todo estuvo bien (no hubo ningú problema de conexión con PayPal)
        # Entonces el ID del pago será muy distinto de NULL
        if(null !== $pago['id'] && 1 === $pago['success']) {
            # Si todo estuvo bien, pues
            $pago['id']; # Tiene el ID del pago por PayPal
            $pago['hash']; # Tiene un HASH seguro del ID del pago
            $pago['success']; # 1
            $pago['message']; # 'Conexión realizada'

            /*
                EN ESTE PUNTO LO IDEAL SERÍA INSERTAR
                $pago['id'] y $pago['hash'] en una tabla en la base de datos.
                Para que quede como registro de una transacción, que más adelante se va a comprobar.
            */

            # Redireccionamos al cliente para que haga un pago con paypal
            Func::redir($pago['url']);

            # URL tiene la direccion a donde debemos redireccionar para que el cliente pague,así que si estamos
            # Desde la API REST, podemos pasarla por JSON a javascript para que redireccionemos con javascript
          # Una vez el cliente pague, será redireccionado por PayPal a $config['url'] que hemos definido
        } else {
            # De lo contrario, si hubo algún problema de conexión
            echo $pago['message'];
            # Tendremos el problema que ocurrió en 'message'
        }
    }

    public function __destruct() {
        parent::__destruct();
    }

}

Cómo comprobar un pago realizado con PayPal

En nuestro modelo de ejemplo Pagar hemos establecido en

$config = array(
    'url' => URL . 'pagado/' # Pasamos la URL en donde se debe verificar si el pago se hizo con éxito en PayPal
);

Por lo que cuando nuestro cliente haga el pago o lo o cancele, paypal lo va a retornar hasta esa URL, la cual asumimos que llega a un controlador llamado pagadoController el cual debería tener algo como esto:

public function __construct() {
    parent::__construct();

    # Volvemos llamar a Pago
    $p = new Pagar;
    # Llamamos al método AnalizarPago
    $respuesta = $p->AnalizarPago();
    echo $this->template->render('alguna/vista', 'respuesta' => $respuesta);

    # En donde $respuesta, será TRUE si se comprobó y FALSE si no el pago.
}

Lo cual nos lleva a ver el método AnalizarPago() en nuestro modelo Pagar de nuevo.

public function AnalizarPago() : bool {

        # Cargamos el Helper
        Helper::load('paypal');

        # Verificamos el pago
        $pago = Paypal::check_pay();

        # Si el cliente pagó con éxito en PayPal entrará aquí
        if($pago['success']) {

            $pago['id']; # ID del pago (el mismo que obtuvimos en Paypal::pay())
            $pago['hash']; # Hash del ID del pago

            /*
                Para que todo esto tenga sentido, deberíamos de comprobar si el ID y el HASH
                del pago que estamos obteniendo aquí coincide con el de la base de datos en caso
                de que lo hayamos hecho en Paypal::pay() (meter esos campos en la DB)

                Para una explicación detallada visitar la lista de reproducción de YouTube
            */

            return true; # Por tanto devolvemos true (se realizó bien el pago)
        }

    # Si no pagó con éxito o canceló el pago en PayPal, se devuelve false
    return false;
}