PagSeguro e PHP - Usando lightbox

PagSeguro

O PagSeguro é o gateway de pagamento, ou seja, é possível receber pagamentos de diferentes fontes através dele. É possível fazer cobranças únicas ou planos de assinatura.

Mas é uma merda.

Sim. A documentação é uma bosta. Não existe uma maneira fácil e prática de integrar a solução deles. Por causa disso, e pra servir de orientação futura pra você e pra mim, decidi escrever sobre isso. Serão 3 postagens mostrando como fazer pagamentos...

- Usando Lightbox (Checkout lightbox)
- Usando uma tela de pagamento personalizada (Checkout transparente)


Cada parte desse tutorial será escrito de maneira que um método não dependa de conhecimento do outro. Essa primeira parte tratará do pagamento usando Lightbox.

Instalação

A maneira mais rápida de integrar a API do PagSeguro a um sistema PHP é usando o composer. Para isso, acesse a raiz do seu projeto e digite (Ubuntu 19.04):

composer require pagseguro/pagseguro-php-sdk

Os arquivos serão baixados e o sdk configurado. Carregue o autoload no seu arquivo index.php, ou onde preferir.

require_once 'vendor/autoload.php';

Agora você já é capaz de usar as bibliotecas do PagSeguro em sua aplicação.

Sandbox x Produção

Sandbox é a "caixa de areia", ou a área de testes, onde as operações efetuadas não serão reais. A área de produção funciona (ou deveria funcionar) exatamente da mesma forma, mas em um "espaço de trabalho" diferente.

Antes de continuar, acesse https://sandbox.pagseguro.uol.com.br/ e crie a sua conta, caso não tenha. Se tiver, anote o seu e-mail e token. Essas informações serão usadas constantemente. Não é escopo desse tutorial mostrar como criar ou como conseguir esses dados.

Documento HTML

Usar o Lightbox requer código HTML. Você já possui um código HTML na sua página, então vale aqui algumas considerações apenas.

Tipo do documento

É necessário que o tipo do seu documento seja HTML 5, como no exemplo:

<!DOCTYPE html>

Javascript

Também é necessário carregar o javascript do Lightbox. Existe uma maneira de selecionar automaticamente o ambiente (sandbox ou produção), basta usar o seguinte código:

<script type="text/javascript" src="
<?php
  $links = [
    'production' => 'https://stc.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.lightbox.js',
    'sandbox' => 'https://stc.sandbox.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.lightbox.js'
  ];
  echo $links[\PagSeguro\Configuration\Configure::getEnvironment()->getEnvironment()];
?>
"></script>

Inicialização e Configurações da API

Qualquer transação só é possível após a criação da sessão e só é possível criar uma sessão após a configuração correta da API. Também é preciso iniciar a API usando o método initialize() da classe \PagSeguro\Library:

\PagSeguro\Library::initialize();

Configurando a API

A configuração da API se dá através da classe \PagSeguro\Configuration\Configure. Observe o código e os comentários:

//Determinando o ambiente. Aceita 'sandbox' ou 'production'
\PagSeguro\Configuration\Configure::setEnvironment('sandbox');

//Credenciais de acesso. O e-mail e o token do vendedor
\PagSeguro\Configuration\Configure::setAccountCredentials('e-mail', 'token');

//Determina o encoding. Aceita UTF-8 ou ISO-8859-1
\PagSeguro\Configuration\Configure::setCharset('UTF-8');

//Localização do log.
\PagSeguro\Configuration\Configure::setLog(true, 'logs/pseg.log');

Lightbox


Como funciona: O lightbox é uma janela que permite ao cliente pagar sua compra sem precisar ir até o ambiente PagSeguro.
Métodos de pagamento aceitos: cartão, boleto e débito online.

Antes de começar...

Você quer vender um produto ou serviço pela web. Antes de começar as rotinas de pagamento, perceba que é preciso possuir os produtos ou serviços armazenados de alguma forma, através de um carrinho de compras, por exemplo. Não é do escopo desse tutorial mostrar o desenvolvimento de um carrinho de compras ou da tela de seleção de serviços, então, por essa razão, os produtos serão armazenados em um array.

Vamos criar 3 produtos de exemplo:

$pedido = [
  1 => [
    'itemId' => '103',
    'itemDescription' => 'Raspberry Pi',
    'itemQuantity' => 1,
    'itemAmount' => '89.90',
    'itemWeight' => 200
  ],
  2 => [
    'itemId' => '478',
    'itemDescription' => 'Fonte 5v 2ah',
    'itemQuantity' => 1,
    'itemAmount' => '29.90',
    'itemWeight' => 90
  ],
  3 => [
    'itemId' => '3689',
    'itemDescription' => 'Cartão de memória 16GB',
    'itemQuantity' => 1,
    'itemAmount' => '39.90',
    'itemWeight' => 10
  ]
];


Esses produtos fictícios representarão o carrinho de compras do cliente.

Criando a requisição de pagamento

Classe \PagSeguro\Domains\Request\Payment


Descrição: a classe Payment recebe os dados dos produtos ou serviços vendidos. Abaixo eu demonstro como usar a classe para criar a requisição.

//Instancia a classe
$pay = new \PagSeguro\Domains\Requests\Payment();

//----------------------
//Configurações iniciais
//----------------------
$pay->setCurrency('BRL');//A única moeda aceita

/*Endereço para redirecionamento do cliente quando o pagamento estiver concluído */
$pay->setRedirectUrl('example.com');

/*Endereço de notificações. Falarei sobre isso em outro tutorial */
$pay->setNotificationUrl('example.com');


//------------------
//Dados do comprador
//------------------
//Você pode ou não enviar os dados do comprador
$pay->setSender()->setName('Cliente de teste');//Nome
$pay->setSender()->setEmail('teste@sandbox.pagseguro.com.br');//E-mail

/* O telefone deve ser uma instância da classe \PagSeguro\Domains\Phone:
$phone = new \PagSeguro\Domains\Phone($ddd, $numero) */
$pay->setSender()->setPhone()->instance($phone); 

/* O documento dever ser uma instância da classe \PagSeguro\Domais\Document:
$document = new \PagSeguro\Domains\Document('CPF', '688.415.810-77
') */
$pay->setSender()->setDocument()->instance($document);

//---------------
//Dados do pedido
//---------------
/* Os itens foram criados anteriormente. Agora é preciso adicioná-los */
$item = new \PagSeguro\Domains\Item();
$items = [$item];
$pay->setItems($items);
foreach ($pedido as $id => $produto) {
  foreach ($produto as $key => $val) {
    $pay->addParameter()->withParameters($key, $val)->index($id);
  }
}


/*Acréscimo (valor positivo) ou desconto (valor negativo) no valor total do pedido. Isso é opcional. */
$pay->setExtraAmount($extraAmount);

/*Se quiser, informe a referência do pagamento, ou seja, o código gerado na sua aplicação que identifica essa compra (o número da nota fiscal, código do pedido, essas coisas) */
$pay->setReference($reference);


//-------------------
//Endereço de entrega
//-------------------
/* Tipo de frete. É uma instância de \PagSeguro\Domains\ShippingType.
$shptype = new \PagSeguro\Domains\ShippingType();
$shptype->setType(1);
1: PAC
2: Sedex
3: Outros
*/
$pay->setShipping()->setType()->instance($shptype);

/* Custo do frete. É uma instância de \PagSeguro\Domains\ShippingCost
$shpcost = new \PagSeguro\Domains\ShippingCost();
$shpcost->setCost(10.00)
*/
$pay->setShipping()->setCost()->instance($shpcost);

/* Endereço de entrega. É uma instância de \PagSeguro\Domains\Address 
$address = new \PagSeguro\Domains\Address (
  'rua',
  'numero',
  'complemento',
  'bairro',
  'cep',
  'cidade',
  'estado',
  'BRA', //Só BRA é aceito
)
*/
$pay->setShipping()->setAddress()->instance($address);

Com a requisição criada, só falta agora registrá-la e recuperar a URL de redirecionamento.

//Credenciais de acesso
$credenciais = \PagSeguro\Configuration\Configure::getAccountCredentials();

//Registro da transação e retorno da URL
$resposta = $pay->register($credenciais, true);
$codigo = $resposta->getCode();

Em $codigo você terá o código que deverá para ser usado como parâmetro do método PagSeguroLightbox;

echo "<script>PagSeguroLightbox('{$codigo}');</script>";



Tudo pronto. Agora ajuste o código para o seu sistema e use-o à vontade.

Warning: count(): Parameter must be an array or an object that implements Countable

Esse warning aparece no nosso código, apesar de estar tudo certo e de, inclusive, recebermos de volta o link para pagamento. Isso acontece porque a classe PagSeguro\Domains\Requests\Item, na linha 67, usa um current() para retornar o elemento atual do array em questão. O problema é que o elemento retornado pode não ser do tipo Countable, aí o warning.

Para resolver, altere o código-fonte da API de...

public function itemLenght()
{
  return count(current($this->items));
}


... para...

public function itemLenght()
{
  if((current($this->items) instanceof \Countable) || \is_array(current($this->items))) {
    return count(current($this->items));
  } else {
    return count($this->items);
  }
}


Na prática, nada muda no resultado, mas o warning deixa de existir.

Conclusão

Espero ter ajudado na sua maratona para fazer funcionar o PagSeguro. Se preferir, faça o download do código completo para seus estudos.

Comentários

  1. só um detalhe não é getway é gateway

    ResponderExcluir
  2. Recebi esse erro. o que pode ser?

    Fatal error: Uncaught Error: Call to undefined method PagSeguro\Domains\Requests\Payment::getItems() in /home/u765121192/domains/syntaktis.com.br/public_html/plataforma/s_pagamentos/vendor/pagseguro/pagseguro-php-sdk/source/Parsers/Item.php:43 Stack trace: #0 /home/u765121192/domains/syntaktis.com.br/public_html/plataforma/s_pagamentos/vendor/pagseguro/pagseguro-php-sdk/source/Parsers/Checkout/Request.php(74): PagSeguro\Parsers\Item::getData() #1 /home/u765121192/domains/syntaktis.com.br/public_html/plataforma/s_pagamentos/vendor/pagseguro/pagseguro-php-sdk/source/Services/Checkout/Payment.php(59): PagSeguro\Parsers\Checkout\Request::getData() #2 /home/u765121192/domains/syntaktis.com.br/public_html/plataforma/s_pagamentos/vendor/pagseguro/pagseguro-php-sdk/source/Domains/Requests/Payment.php(43): PagSeguro\Services\Checkout\Payment::checkout() #3 /home/u765121192/domains/syntaktis.com.br/public_html/plataforma/s_pagamentos/processa.php(154): PagSeguro\Domains\Requests\Payment->register() #4 {main} thrown in /home/u765121192/domains/syntaktis.com.br/public_html/plataforma/s_pagamentos/vendor/pagseguro/pagseguro-php-sdk/source/Parsers/Item.php on line 43]

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Tá na hora de piscar LEDs de maneira melhorada

LEDs on/off com PHP, Python e RPi

PagSeguro e PHP - Usando a tela do PagSeguro (checkout redirect)