Integración entre Paypal y CakePHP 2.0

  On 11 Jun, 2013   By With 2 Comments »
twittergoogle_plusFacebook

En ocasiones los proyectos que desarrollamos requieren ser integrados con algún método de pago en línea como Paypal. Sin embargo cuando se trabaja en frameworks como cakephp implementar esta integración desde cero puede ser un poco tedioso. Para estos requerimientos existen plugins para cakephp que pueden hacernos la vida mucho más fácil. A lo largo de este artículo se explica paso a paso cómo realizar esta integración de manera fácil.

1. Uno de los plugins de paypal disponibles para cakePHP 2.0 se pude descargar del siguiente repositorio de Git: https://github.com/tenutso/CakePHP-2.0-Paypal-IPN-Plugin. Este plugin debe alojarse en a carpeta app/Plugins/paypal_ipn dentro de su instalación de cakePHP.

2.  Agregue la siguiente línea de código al archivo bootstrap.php: CakePlugin::load(‘PaypalIpn’, array(‘bootstrap’ => array(‘paypal_ipn_config’), ‘routes’ => true));

3. Abra una terminal, diríjase a la carpeta de su instalación de cake, y ejecute el siguiente comando con el fin de crear el esquema en la base de datos requerido por el plugin:

$ cake schema create -path plugins/paypal_ipn/config/sql -name ipn

4. Agregue el siguiente código al archivo /app/config/routes.php. Este paso es opcional.

/* Paypal IPN plugin */
Router::connect('/paypal_ipn/process', array('plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'process'));
/* Optional Route, but nice for administration */
Router::connect('/paypal_ipn/:action/*', array('admin' => 'true', 'plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'index'));
/* End Paypal IPN plugin */

5. Ingrese a su cuenta de Paypal y obtenga las credenciales de su cuenta comercial e ingréselos en el archivo /paypal_ipn/config/paypal_ipn_config.php.

6. Adicione PaypalIpn.Paypal a la lista de helpers en su app_controller.php:

var $helpers = array('Html','Form','PaypalIpn.Paypal');

7. Con el fin de procesar la información obtenida una vez los pagos han sido completados, puede utilizar una función como la siguiente dentro de su app controller o en el controlador del plugin:

function afterPaypalNotification($txnId){
    //Here is where you can implement code to apply the transaction to your app.
    //for example, you could now mark an order as paid, a subscription, or give the user premium access.
    //retrieve the transaction using the txnId passed and apply whatever logic your site needs.

    $transaction = ClassRegistry::init('PaypalIpn.InstantPaymentNotification')->findById($txnId);
    $this->log($transaction['InstantPaymentNotification']['id'], 'paypal');

    //Tip: be sure to check the payment_status is complete because failure 
    //     are also saved to your database for review.

    if($transaction['InstantPaymentNotification']['payment_status'] == 'Completed'){
        //Yay!  We have monies!
    }
    else {
        //Oh no, better look at this transaction to determine what to do; like email a decline letter.
    }
} 

8. Ahora sólo resta agregar nuestro botón de compras a nuestra vista.  Esto se puede lograr añadiendo el siguiente código, donde el atributo ‘test’ sirve para definir si se utilizará el sandbox o la aplicación real de Paypal. ‘amount’ corresponde al monto de la transacción y ‘item_name’ al nombre del producto. La url de retorno se puede definir aquí con el atributo ‘return’.

$paypal->button('Pay Now', array('test' => true, 'amount' => '12.00', 'item_name' => 'test item' ));

Parte II: Obtención de las credenciales de prueba dePaypal.

Con el fin de probar nuestra integración con Paypal a través del Sandbox, es necesario tener credenciales de comprador y vendedor. Para obtenerlas, ingrese a https://developer.paypal.com/ y seleccione ‘Cuentas de prueba del Sandbox’. Si no ha creado otras cuentas, usted verá una cuenta de vendedor por defecto, y deberá crear al menos una cuenta personal o de comprador para realizar su pago a través del Sandbox. Una vez tenga la cuenta de comprador y vendedor, utilícelas para hacer sus pagos de prueba en su ambiente local o de desarrollo.

2 thoughts on "Integración entre Paypal y CakePHP 2.0"

  1.    dadaama says :
    September 3, 2013 at 3:01 pm

    Hola!

    estoy usando cakePhp 2.3.8 y el script para generar las tablas en la base de datos no me funcionó. tuve que colocar la url absoluta del path (no me sirvió la url relativa como la tienes en el tutorial).
    otra cosa que tuve que cambiar, fue la forma de llamar los parametros:
    en vez de -path es –path
    en vez de -name es –name
    con esos cambios si me funcionó.

    luego de seguir los otros pasos del tutorial, me sale este error:
    Missing Helper
    Error: PaypalIpnHelper could not be found.

    el plugin lo coloqué en:
    ../app/Plugin/paypal_ipn/

    en mi bootstrap.php estoy cargando el plugin asi:
    CakePlugin::load(‘PaypalIpn’, array(‘bootstrap’ => array(‘paypal_ipn_config’), ‘routes’ => true));

    en mi controller, estoy cargando el helper asi:
    var $helpers = array(‘PaypalIpn.Paypal’);

    no sé que me puede estar faltando, agradecería tu ayuda.
    muchas gracias de antemano!
    saludos!

    •    dadaama says :
      September 3, 2013 at 3:13 pm

      Hola!
      logré encontrar el problema. tuve que cambiar el nombre de un archivo del plugin:
      ../app/Plugin/paypal_ipn/View/Helper/Paypal.php

      renombrarlo asi:
      ../app/Plugin/paypal_ipn/View/Helper/PaypalHelper.php

      ahora me sale otro error y es respecto a la creación del boton paypal:
      echo $paypal->button(‘Pay Now’, array(‘test’ => true, ‘amount’ => ‘12.00’, ‘item_name’ => ‘test item’ ));

      el error que me saca es este:
      Fatal Error
      Error: Call to a member function button() on a non-object