Back-End

20 ago, 2019

Integração PayPal + Laravel – Passo a passo

Publicidade

Integrar meios de pagamento em aplicações é uma grande demanda que precisa ser atendida por programadores, então por que não ser você esse programador? Neste artigo vou ensinar um passo a passo bem completo e simples de como integrar o PayPal em uma aplicação Laravel.

A documentação oficial do PayPal SDK pode ser facilmente entendida para a implementação de recursos não citados neste tutorial.

Instalando e configurando o SDK do PayPal no Laravel

Primeiro é preciso instalar o SDK do PayPal. Na raiz do projeto rode o comando:

composer require paypal/rest-api-sdk-php

Em seguida abra o .env do seu projeto, copie o texto abaixo e cole no seu arquivo:

PAYPAL_CLIENT_ID=(Aqui você preenche com o id do cliente da sua conta PayPal)

PAYPAL_SECRET=(Aqui você preenche com a chave da sua conta PayPal)

PAYPAL_MODE=sandbox

Feito isso, na pasta config crie um arquivo chamado paypal.php e cole o seguinte conteúdo:

<?php

return [

   'client_id' => env('PAYPAL_CLIENT_ID',''),

   'secret' => env('PAYPAL_SECRET',''),

   'settings' => array(

       'mode' => env('PAYPAL_MODE', 'sandbox'),

       'http.ConnectionTimeOut' => 30,

       'log.LogEnabled' => true,

       'log.FileName' => storage_path() . '/logs/paypal.log',

       'log.LogLevel' => 'ERROR'

   ),

];

Criando um Formulário para Teste

Vou simplificar ao máximo possível este formulário. Tome de base para seu projeto.

Em resources\views encontre o arquivo welcome.blade.php e substitua seu conteúdo por esse:

<form class="w3-container w3-display-middle w3-card-4 " method="POST" id="formulario-pagamento"  action="{{ route(‘pagar_com_paypal’) }}">

 {{ csrf_field() }}

 <h2 class="w3-text-blue">Formulário de Pagamento</h2>

 <p>Integração PayPal + Laravel DEMO</p>

 <p>     

 <label class="w3-text-blue"><b>R$: </b></label>

 <input class="w3-input w3-border" name="valor" type="text"></p>     

 <button class="w3-btn w3-blue">Enviar Pagamento</button></p>

</form>

Criando Controller e Rotas

Crie um novo controller digitando o comando:

php artisan make:controller PagamentoController

Abra o novo controller e adicione o construtor abaixo:

public function __construct()

{

      $paypal_conf = \Config::get('paypal');




      $this->_api_context = new ApiContext(new OAuthTokenCredential(

           $paypal_conf['client_id'],

           $paypal_conf['secret'])

       );




       $this->_api_context->setConfig($paypal_conf['settings']);

}


No arquivo route\web.php adicione a seguinte linha:

Route::post(‘/pagar’, ‘PagamentoController@pagarComPayPal’)->name(‘pagar_com_paypal’);

E no seu PagamentoController adicione a função:

public function pagarComPayPal(Request $request) {

   $pagador = new Payer();

   $pagador->setPaymentMethod('paypal');

   $item_1 = new Item();

   $item_1->setName('Item 1')-> setCurrency('BRL')->setQuantity(1)->setPrice($request->get('amount'));

   $lista_itens = new ItemList();

   $lista_itens->setItems(array($item_1));

   $valor = new Amount();

   $valor->setCurrency('BRL')->setTotal($request->get('amount'));

   $transacao = new Transaction();

   $transacao->setAmount($valor)->setItemList($lista_itens)->setDescription('Your transaction description');

   $urls_redirecionamento = new RedirectUrls();

   $urls_redirecionamento->setReturnUrl(URL::route('status'))->setCancelUrl(URL::route('status'));

   $pagamento = new Payment();

   $pagamento->setIntent('Sale')->setPayer($pagador)->setRedirectUrls($urls_redirecionamento)->setTransactions(array($transacao));

  

   try {

       $pagamento->create($this ->_api_context);

   } catch (\PayPal\Exception\PPConnectionException $e) {

      

       if (\Config::get('app.debug')) {\

           Session::put('error', 'Tempo Limite de Conexão Excedido');

           return Redirect::route('home');

       } else {\

           Session::put('error', 'Serviço fora do ar, tente novamente mais tarde.');

           return Redirect::route('home');

       }

   }

   foreach($pagamento->getLinks() as $link) {

       if ($link->getRel() == 'approval_url') {

           $url_redirecionar = $link->getHref();

           break;

       }

   }

 

   /** Adiciona o id do pagamento a sessão **/

   Session::put('pagamento_paypal_id', $pagamento->getId());

   if (isset($url_redirecionar)) {

 

       /** Redireciona para o PayPal **/

   Session::put('pagamento_paypal_id', $pagamento->getId());

   if (isset($url_redirecionar)) {

Vou passar rapidamente por cada ponto importante da função acima:

Payer

Classe que representa o pagador dessa transação. O método de pagamento deve ser setado como “paypal”.

Item information

(Opcional) Permite que você especifique informações do item.

Amount

Permite que você especifique um valor de pagamento. Você também pode especificar detalhes adicionais, como frete, impostos etc.

Transaction

Uma transação representa e define o contrato de um pagamento – o que é o pagamento e quem está participando.

RedirectURL

Define as URLs para as quais o comprador deve ser redirecionado após a aprovação / cancelamento do pagamento.

Payment

Classe que representa o pagamento dessa transação. A intenção (intent) deve estar setada como “sale”.

Status de Pagamento

Depois de enviarmos os dados para pagamento, precisamos informar ao usuário se a operação foi um sucesso ou um fracasso. A funcionalidade a seguir deve ser  executada depois que um pagamento é processado.

public function statusPagamento()

{

 /** Resgata o id do pagamento armazenado na sessao **/

   $id_pagamento = Session::get('pagamento_paypal_id');

  

   /** Limpa o id do pagamento armazenado na sessao **/

   Session::forget('pagamento_paypal_id');




   if (empty(Input::get('PayerID')) || empty(Input::get('token'))) {

       \Session::put('erro', 'Falha na transação.');

       return Redirect::route('home');

   }

  

   $pagamento = Payment::get($id_pagamento, $this->_api_context);

  

   $execucao_pagamento = new PaymentExecution();

   $execucao_pagamento->setPayerId(Input::get('PayerID'));

  

   /** Executa o pagamento **/

   $result = $pagamento->execute($execucao_pagamento, $this->_api_context);

  

   if ($result->getState() == 'approved') {

       \Session::put('successo', 'Pagamento realizado com sucesso!');

       return Redirect::route('home');

   }

  

   \Session::put('erro', 'Falha na transação.');

   return Redirect::route('home');

}

Vou passar rapidamente por cada ponto importante da função acima:

Approval Status

Determina se o usuário aprovou ou não o pagamento.

Payment Execute

O objeto PaymentExecution inclui informações necessárias para executar um pagamento via PayPal. O payer_id é adicionado aos parâmetros de consulta da solicitação quando o usuário é redirecionado do PayPal de volta ao seu site.

Para finalizar, caso o pagamento seja realizado corretamente, mostrarei uma mensagem de sucesso, caso contrário uma mensagem de falha.

Adicione o trecho a seguir a sua view welcome.blade.php:

@if ($mensagem = Session::get('successo'))

   <div class="w3-panel w3-green w3-display-container">

       <span onclick="this.parentElement.style.display='none'"

               class="w3-button w3-green w3-large w3-display-topright">&times;</span>

       <p>{!! $mensagem !!}</p>

   </div>


   <?php Session::forget('successo');?>


@endif


@if ($mensagem = Session::get('erro'))

   <div class="w3-panel w3-red w3-display-container">

       <span onclick="this.parentElement.style.display='none'" class="w3-button w3-red w3-large w3-display-topright">&times;</span>

       <p>{!! $mensagem !!}</p>

   </div>


   <?php Session::forget('erro');?>

@endif

Pronto, basta abrir o formulário, digitar um valor e realizar uma transação teste!

Lembrando que esse tutorial trabalha no ambiente de testes, e quando sua aplicação for para produção e tiver que realizar transações reais será necessário a instalação de um certificado SSL. 

Se você não sabe o que é e como obter um certificado de segurança gratuitamente veja este tutorial linkado.

E ai conseguiu? Qualquer dúvida entre em contato pelo douglas@programandocomphp.com.br!