07 Implementar pagos con Paypal – Taller de desarrollo de una Tienda en Línea

Hola, bienvenido(a), al Post 07 del Taller de Desarrollo de una Tienda en línea con Bootstrap, Laravel 5.1 y la API de Paypal.

Hoy vamos a implementar pagos con Paypal para nuestra tienda, para ello vamos a utilizar el API de Paypal.

Para lograrlo tenemos que seguir una serie de pasos:

1) CUENTA DE PAYPAL

Es necesario que tengamos una cuenta en Paypal, después hay que iniciar sesión y realizar lo siguiente:

  • Ir al Dashboard
  • Crear una app
  • Obtener el client_id y el secret
  • Crear 2 usuarios, uno de tipo Business (el que venderá) y otro de tipo Personal (el que realizara los pedidos).

2) INSTALAR PACKAGE

Vamos a instalar el package rest-api-sdk-php, lo buscamos en Packagist, podemos revisar su página en Github para ver los prerrequisitos para instalarlo.

Lo instalamos vía Composer: composer require paypal/rest-api-sdk-php

3) ARCHIVO DE CONFIGURACIÓN

Tenemos que crear un archivo llamado paypal.php en la carpeta config de nuestra app, en donde pondremos los datos client_id y secret, además de establecer si trabajaremos en el modo sandbox (pruebas) o live.

4) RUTAS

Establecemos las rutas en nuestro Router, la primera servirá para enviar información a Paypal y la segunda para recibir la respuesta que nos de.

5) CONTROLADOR

Ahora vamos a crear el Controlador PaypalController en el que pondremos los métodos postPayment y getPaymentStatus, lo hacemos desde la línea de comandos:

php artisan make:controller PaypalController –plain

Definimos nuestros métodos:

6) VISTA MESSAGE

Cuando Paypal redirecciona al usuario a nuestro sitio y se concreta o cancela la venta lo vamos a redireccionar al home y le vamos a mostrar un mensaje indicándole que la compra se realizo de forma satisfactoria o que se cancelo, dicho mensaje se lo pasamos mediante una variable de sesión de tipo flash (solo se mostrará una vez).

Para lograr esto tenemos que crear la vista parcial message dentro de views/store/partials:

Ahora incluimos esa vista en nuestro template:

7) MODELOS Y MIGRACIONES DE ORDER Y ORDERITEM

Para guardar la información de los pedidos es necesario que creemos nuestros Modelos y Migraciones para las tablas orders y order_items, lo hacemos desde la línea de comandos:

php artisan make:model Order -m

y

php artisan make:model OrderItem -m

Ahora modificamos los archivos de migraciones de acuerdo al esquema de nuestra base de datos:

La información la guardamos dentro del método getPaymentStatus en nuestro controlador PaypalController llamando al método saveOrder, que se encargara de guardar la información del pedido y este a su vez llamara al método saveOrderItem por cada item del pedido para guardar la información de cada producto.

Lo único que falta es cambiar el enlace que desencadenara todo lo que hemos hecho, dicho enlace se encuentra en nuestra vista order_detail:

Para seguir pasa a paso toda la implementación te dejo a continuación el vídeo de la clase:

Pronto actualizare la versión del proyecto que tenemos en Github con el nombre de tienda, para que lo compares con tu propia versión.

Te comparto también algunos enlaces con información valiosa para este tutorial:

  1. Página developers de Paypal
  2. Package rest-api-sdk-php en Packagist
  3. Documentación de la API de Paypal
  4. Listado de códigos para monedas de diferentes países
  5. Ejemplos REST API
  6. Tutorial: Integrate PayPal SDK Into Laravel 4

Eso es todo para este post, compártelo por favor.

Con este post terminamos todo el front de nuestra app, es decir toda la parte de nuestra app que le ofrecemos al usuario, solo falta desarrollar un Back o Panel de Administración para que el admin pueda gestionar la información de la tienda, eso lo haremos en los siguientes posts.

Espero tus comentarios y nos vemos en el siguiente 🙂

  • Celpabu

    gracias excelente a practicar con el 7 video tutorial sinceramente es una de los mejores tutos q sigo

    • Gracias Celpabu, un saludo!

  • Roberto Figuera Espinoza

    amigo saludos!!! hombre todo fino me funcionaba el codigo migre a linux mint instale todo con php v.5.6 y corre fino, pero a la hora de ir a paypal me dispara este error tendras idea de que puede ser??

    • Hola Roberto, el error al parecer tiene que ver con Curl, que utiliza la Api de Paypal, revisa tu php.ini para ver si esta habilitado, puedes auxiliarte con este link: http://stackoverflow.com/questions/8014482/php-curl-enable-linux

      • Roberto Figuera Espinoza

        Gracias si era eso jeje, estoy ansioso por que terminemos jaja para cuando el proximo video?

        • Esta semana ha estado un poco complicada, espero el fin de semana poder publicar el siguiente post, saludos!

          • Roberto Figuera Espinoza

            Vale genio cuidate

  • guillermo romo

    ola actual mente estoy teniendo este problema que podria ser invesntigando un poco creo que es try y el catch pero aun no doy con la solucion

    • Hola Guillermo, es complicado determinar cual podría ser el error solo con la captura de pantalla, vas a tener que hacer debug, (suponiendo que todos tus datos de paypal están correctos y bien configurados), podrías empezar por poner los datos estáticos de un producto y tratar de hacer la conexión y así poco a poco encontrar el error, puedes auxiliarte viendo el código de la aplicación, esta en github: https://github.com/ovedfs/tienda

      • Edward

        ovedfs, puede que sea el tipo de moneda que esta utilizando en el PaypalController, en el ejemplo que tienes la moneda es mexicana, pero hay diferentes tipos de monedas que Paypal no reconoce por ejemplo la de mi país DOP, lo recomendable es que pruebe con USD y Paypal hace la conversión al tipo de moneda correspondiente, así me funciono ya que presentaba el mismo error.

        Gracias ovedfs por el aporte que haces, saludos.

      • GAMG

        Oved a mi también me arroja el mismo error. Reviso los logs y me aparece ésto: PayPalCorePayPalHttpConnection : INFO: POST https://api.sandbox.paypal.com/v1/oauth2/token

        Tienes alguna idea que será?

    • GAMG

      oye amigo tengo el mismo error, pudiste solucionar?. Revise el archivo de logs y me indica ésto: PayPalCorePayPalHttpConnection : INFO: POST https://api.sandbox.paypal.com/v1/oauth2/token

    • Brayan LP

      Tenia el mismo error , lo que hice para resolver fue, irme al repositorio y copiar el codigo de PaypalController y reemplazarlo, hay algunas variaciones que no tomo en cuenta, espero se solucione saludos y excelente curso, vamos no te quedes link :https://github.com/ovedfs/tienda/blob/master/app/Http/Controllers/PaypalController.php

  • Edward

    Buenos dias ovedfs muy agradecido por tus aportes, estoy utilizando la API de Paypal para procesar el pedido pero el proyecto que estoy realizando no requiere pagos, estoy modificando el PaypalController para que solo me devuelva el array con los datos de los artículos que agregó el usuario y los mismos se guarden en la tabla orders.

    Orientarme si es una buena practica o si puedes recomendarme otro método.

    Saludos.

    • Hola Edward, si tu proyecto no requiere pagos, entonces no utilices la api de paypal, no es necesaria. Lo que puedes hacer es agregar un método al StoreController para que se llame cuando el usuario da click en un botón “Enviar pedido” (que sustituye al botón “Pagar con Paypal”), en ese método pones la lógica para guardar el pedido en la base de datos y tal vez notificar al admin del sitio vía correo que un cliente realizó un pedido. Saludos!

      • Edward

        Muchas gracias nuevamente ovedfs, complete esta parte gracias a tus recomendaciones.

  • Steven

    Hola, que buen video, mira tengo una dudita, Cuando yo tengo esto:

    $cart = Session::get(‘cart’);

    y trato de imprimir asi: $cart->quantity, me genera un error de: property of non-object,

    Pero si le doy un foreach si me sale bien con product

    foreach($cart as $producto){
    $subtotal +=$producto->quantity * $producto->price;
    }

    y lo estoy llamando de la misma forma, sabes porque pasa esto? como puedo acceder solo a un producto en caso que tenga varios desde el carrito.

    Muchas Gracias

    • Hola Steven, $cart es un array de objetos, donde cada objeto representa un producto del carrito, estas tratando de leer una propiedad (quantity) del array por eso te aparece ese error, al recorrer el array con el foreach tenemos acceso a cada objeto (producto) por eso podemos leer o modificar la propiedad quantity de ese objeto en particular.

      Si solo quieres acceder a un producto en particular sin recorrer el array con foreach, entonces necesitas saber el slug del producto porque es el identificador que usamos para cada producto dentro del carrito, podría hacer algo así:

      echo $cart[$slug]->quantity;

      Donde $slug es el slug de un producto ya agregado al carrito. Saludos!

      • Steven

        Muchas Gracias, tienes toda la razon, estaba haciendo una prueba siempre con un producto abordo del cart y por eso me surgio la pregunta. Muchisismas gracias, excelente los videos.

  • Pedro Cardoso Rdz

    Excelente articulo, me ha sido sumamente útil, muchas gracias!!!

  • Milton Gilmour Led Zeppeliano

    Hola solo una duda por que no me muestra cada producto que selecciona en paypal
    :/

  • Johan Navarro

    Buenas amigo, sus video tuturiales son geniales, no te pude copiar en tu blog porque no he podido autenticarme, pasa que tengo un problema con linea 128 del contolPypal y ya no se como solucionarla // clear the session payment ID// clear the session payment ID Session::forget(‘paypal_payment_id’); $payerId = Input::get(‘PayerID’); $token = Input::get(‘token’);he intetado buscar el error por la web y no lo he podido encontrar, por favor! es urgente gracias!

  • Johan Navarro

    Buenas amigo, sus video tuturiales son geniales, pasa que tengo un problema con linea 128 del paypalController.php y ya no se como solucionarla // clear the session payment ID// clear the session payment ID Session::forget(‘paypal_payment_id’); $payerId = Input::get(‘PayerID’); $token = Input::get(‘token’); he intentado buscar el error por la web y no lo he podido encontrar, por favor AYUDAAAA! es urgente gracias!,

    • Johan Navarro

      no funciono me toco que dejarlo sin el Paypal, si alguien quiere saber como se hace sin el Paypal me dicen que todo bien!; se coloca el siguiente codigo en CartController:

      public function saveOrder()
      {
      $cart = Session::get(‘cart’);
      $subtotal = 0;
      foreach($cart as $item){
      $subtotal += $item->price * $item->quantity;
      }

      $order = Order::create([
      ‘subtotal’ => $subtotal,
      ‘shipping’ => 100,
      ‘user_id’ => Auth::user()->id
      ]);

      foreach($cart as $item){
      $this->saveOrderItem($item, $order->id);
      }
      return redirect()->route(‘cart-show’);
      }

      private function saveOrderItem($item, $order_id)
      {
      OrderItem::create([
      ‘quantity’ => $item->quantity,
      ‘price’ => $item->price,
      ‘product_id’ => $item->id,
      ‘order_id’ => $order_id
      ]);
      }

      • Johan Navarro

        este código en routes.php
        Route::get(‘buy’, [
        ‘as’ => ‘buy’,
        ‘uses’ => ‘CartController@saveOrder’
        ]);

        y en el boton de paypal .|. que no me funciono colocan :
        slug) }}”>
        Comprar
        Y listo todo bien

  • Guadalupe Lopez

    No me aparece la informacion de Resumen de su pedido , ¿sabes a que se deba? ya compare mi código con el tuyo y parece estar todo bien

  • Raul Herrera

    y para colocarlo a live amigo, para que este en produccion, gracias

  • luis collins

    hola, me gustria que me ayudaran a resolver este error.

    InvalidArgumentException in ArgumentValidator.php line 25:
    paymentId cannot be null

    eso me pasa cando retorna de sandbox a la url /payment/status

  • GAMG

    Hola Oved, gracias por éste taller. Una duda, habrá alguna forma de pasar un descuento a cada item, con alguna funcion por ejemplo setDiscount()? o habrá alguna forma de pasar el monto de un descuento en el objeto Details?

  • Mario Andres Torres Clavijo

    Hola, excelente tutorial, en general muy bien explicado, sólo tengo un pequeño inconveniente al intentar conectar con paypal, me sale este error:

    PayPalConnectionException in PayPalHttpConnection.php line 140:

    Unsupported SSL protocol version

    No tengo muy claro qué puede estar fallando.

  • Adrian Sosa

    Buen día, tengo 0 experiencia en laravel con este curso puedo aprender o es muy avanzado?

    • Nikon

      Va paso a paso y seguro que al principio no sabrás lo que estás haciendo pero como lo explica muy bien no creo que tengas ningún problema. Aunque si ves que este te va demasiado adelantado, te recomiendo el de iniciacion a laravel de la web styde.net (que es gratuito) para tener los conceptos básicos. y luego hagas este.

  • Miguel Quiroz

    Hola muy buen tutorial.
    Alguien me podria ayudar alguien sabe porque me sale este error:
    PayPalConnectionException in PayPalHttpConnection.php line 181:
    failed setting cipher list: TLSv1:TLSv1.2

    en local me funciona bien pero cuando subo mi sistema en linea me lansa error porfavor necesito ayuda :/