andersonav / laravel-psp-pix
Integration PIX with Laravel
Requires
- php: ^8.0
- mpdf/qrcode: ^1.1
- symfony/psr-http-message-bridge: ^7.1
Requires (Dev)
- ext-json: *
- guzzlehttp/guzzle: ^7.9
- orchestra/testbench: ^9.3
- phpunit/phpunit: ^11.3
README
- Instalação
- Endpoints
- Configurações iniciais
- Cob
- CobV
- LoteCobV
- Payload Location
- Pix recebidos
- Webhooks
- Configurando endpoints
Este pacote oferece integração completa com a API PIX do Banco Central do Brasil.
Instalação
Você pode instalar este pacote utilizando o composer:
composer require andersonav/laravel-psp-pix
Agora, é necessário publicar os assets utilizados e o arquivo de configuração do pacote.
Publicando os assets
Para publicar os assets deste pacote para a pasta public do seu projeto, utilize o comando
php artisan vendor:publish --tag=laravel-psp-pix-assets
Publicando o arquivo de configuração
Para publicar o arquivo de configuração, execute o comando abaixo:
php artisan vendor:publish --tag=laravel-psp-pix-config
Este comando vai copiar o arquivo laravel-psp-pix.php
para sua pasta config, com o seguinte conteúdo:
<?php return [ 'transaction_currency_code' => 986, 'country_code' => 'BR', /* | O PIX precisa definir seu GUI (Global Unique Identifier) para ser utilizado. */ 'gui' => 'br.gov.bcb.pix', 'country_phone_prefix' => '+55', /* * Tamanho do QR code quer será gerado pelo gerador implementado no pacote, em pixels. */ 'qr_code_size' => 200, /* * Você pode definir um middleware para proteger a rota disponibilizada para gerar QR codes. * O nome registrado para este middleware precisa ser definido aqui. */ 'create_qr_code_route_middleware' => '', /* * Informações do Prestador de serviço de pagamento (PSP) que você está utilizando. * Você pode utilizar vários psps com este pacote, bastando adicionar um novo array com configurações. * base_url: URL base da API do seu PSP. * oauth_bearer_token: Você pode definir o seu Token */ 'psp' => [ 'default' => [ 'base_url' => env('LARAVEL_PIX_PSP_BASE_URL'), 'oauth_token_url' => env('LARAVEL_PIX_PSP_OAUTH_URL', false), 'oauth_bearer_token' => env('LARAVEL_PIX_OAUTH2_BEARER_TOKEN'), 'ssl_certificate' => env('LARAVEL_PIX_PSP_SSL_CERTIFICATE'), 'client_secret' => env('LARAVEL_PIX_PSP_CLIENT_SECRET'), 'client_id' => env('LARAVEL_PIX_PSP_CLIENT_ID'), 'authentication_class' => \Alves\Pix\Api\Contracts\AuthenticatesPSPs::class ] ], ];
Endpoints
Os endpoints disponibilizados por este pacote são os mesmos implementados pelo Banco Central, e documentados aqui. Entretanto, o seu provedor de serviços de pagamento (PSP) pode não implementar todos eles.
A lista de endpoints completa está descrita aqui:
-
Cob (Reúne endpoints destinados a lidar com gerenciamento de cobranças imediatas)
PUT
/cob/{txid}
: Cria uma cobrança imediata.PATCH
/cob/{txid}
: Revisar uma cobrança imediata.GET
/cob/{txid}
: Consultar uma cobrança imediata.POST
/cob
: Cria uma cobrança imediata com id de transação definido pelo PSP.GET
/cob
: Consultar lista de cobranças imediatas.
-
CobV (Reúne endpoints destinados a lidar com gerenciamento de cobranças com vencimento.)
PUT
/cobv/{txid}
: Cria uma cobrança com vencimento.PATCH
/cobv/{txid}
: Revisar uma cobrança com vencimento.GET
/cobv/{txid}
: Consultar uma cobrança com vencimento.GET
/cobv
: Consultar lista de cobranças com vencimento.
-
LoteCobV (Reúne endpoints destinados a lidar com gerenciamento de cobranças com vencimento em lote.)
PUT
/lotecobv/{id}
: Criar/Alterar lote de cobranças com vencimento.PATCH
/lotecobv/{id}
: Utilizado para revisar cobranças específicas dentro de um lote de cobranças com vencimento.GET
/lotecobv/{id}
: Utilizado para consultar um lote específico de cobranças com vencimento.GET
/lotecobv
: Consultar lotes de cobranças com vencimento.
-
PayloadLocation (Reúne endpoints destinados a lidar com configuração e remoção de locations para uso dos payloads)
POST
/loc
: Criar location do payload.GET
/loc
: Consultar locations cadastradas.GET
/loc/{id}
: Recuperar location do payload.DELETE
/loc/{id}/{txid}
: Desvincular uma cobrança de uma location.
-
Pix (Reúne endpoints destinados a lidar com gerenciamento de Pix recebidos.)
GET
/pix/{e2eid}
: Consultar Pix.GET
/pix
: Consultar pix recebidos.PUT
/pix/{e2eid}/devolucao/{id}
: Solicitar devolucão.GET
/pix/{e2eid}/devolucao/{id}
: Consultar devolução.
-
Webhook (Reúne endpoints para gerenciamento de notificações por parte do PSP recebedor ao usuário recebedor.)
PUT
/webhook/{chave}
: Configurar o webhook pix.GET
/webhook/{chave}
: Exibir informações acerca do webhook pix.DELETE
/webhook/{chave}
: Cancelar o webhook pix.GET
/webhook
: Consultar webhooks cadastrados.
Configurações iniciais.
Para iniciar a utilização da API Pix, você precisa autenticar com o seu PSP via OAuth.
Para isso, é necessário informar o seu client_id
e client_secret
, disponibilizados pelo seu PSP.
Isso deve ser feito no arquivo .env
de sua aplicação:
LARAVEL_PIX_PSP_CLIENT_SECRET="seu client_secret aqui"
LARAVEL_PIX_PSP_CLIENT_ID="seu client_id aqui"
Vários PSP que disponibilizam a API Pix possuem uma URL para obtenção do token de acesso diferente da URL para a API. Portanto, você precisa
configurar as duas URLs no seu .env
:
LARAVEL_PIX_PSP_OAUTH_URL="url para obtenção do access token"
LARAVEL_PIX_PSP_BASE_URL="url da api pix"
Agora, todas as chamadas a API Pix utilizarão estas credencias, e você não precisa informar manualmente para cada requisição.
Entretando, se por algum motivo você desejar alterar estas credenciais em tempo de execução,
é possível através dos métodos ->clientId()
e ->clientSecret()
, disponibilizados em todos os endpoints neste pacote. Um exemplo é mostrado abaixo:
use Alves\Pix\Pix; $api = Pix::api() ->clientId('client_id') ->clientSecret('client_secret');
Estes métodos estão disponíveis em todos os recursos da api Pix: cob
, cobv
, loteCobv
, payloadLocation
, receivedPix
e webhook
.
Obtendo o token de acesso
Este pacote disponibiliza uma implementação de autenticação geral, que pode ser utilizada da seguinte forma:
use Alves\Pix\Pix; // Se você já informou o seu client_id e client_secret no .env, não é necessário informar nesta requisição. $token = Pix::api()->getOauth2Token()->json();
Alguns PSPs requerem a verificação de um certificado disponibilizado no momento da criação de sua aplicação. Este certificado pode ser informado
no .env
, ou informado na requisição através do método certificate()
, e será carregado automaticamente na api.
use Alves\Pix\Pix; // Se você já informou o seu client_id e client_secret no .env, não é necessário informar nesta requisição. $token = Pix::api()->certificate('path/to/certificate')->getOauth2Token()->json();
Caso os endpoints do PSP utilizado necessitem da verificação deste certificado, você precisa informar
este pacote para fazer esta verificação. Isto pode ser feito através do AppServiceProvider
da sua aplicação, bastando adicionar esta linha ao método
register
:
use Alves\Pix\LaravelPix; public function register() { LaravelPix::validatingSslCertificate(); }
Agora, todas as chamadas aos endpoints da API Pix farão a verificação com o certificado informado.
Caso a classe de autenticação disponibilizada por este pacote não funcione para obter o access token no seu PSP,
você pode criar sua própria implementação, bastando criar uma classe e extender a class Alves\Pix\Api\Auth
:
<?php namespace App\Pix; use Alves\Pix\Api\Auth; class CustomAuthentication extends Auth { public function getToken(string $scopes = null) { // Metodo para retornar o token de acesso } public function getOauthEndpoint() : string{ // Retorna o endpoint que deve ser utilizado para autenticação. // Você precisa informar a URL completa. } }
Agora, é necessário informar este pacote para utilizar a sua classe para obtenção do token de acesso.
Você pode fazer isso através do AppServiceProvider
da sua aplicação:
public function boot() { \Alves\Pix\LaravelPix::authenticatesUsing(CustomAuthentication::class); }
Agora, sua classe de autenticação com sua própria lógica será utilizada para obter o token de acesso, e o método getOAuthToken()
retorna o
conteúdo retornado pelo método getToken
desta classe.
É possível configurar uma classe de autenticação para cada PSP.
Configurando PSPs
Se você possui integrações com mais de um psp, você pode configurar os parâmetros individuais para cara um no arquivo de configurações deste pacote,
em config/laravel-psp-pix.php
.
O PSP default utilizado pelo pacote está definido na key default
, do array de PSPs. Você pode alterar o PSP padrão através do método useAsDefaultPsp()
,
no seu service provider:
public function boot() { \Alves\Pix\LaravelPix::useAsDefaultPsp('your-default-psp-here'); }
Para alterar o PSP em tempo de execução, você deve utilizar o método usingPsp()
, disponível em todos os endpoints implementados neste pacote:
\Alves\Pix\Pix::cob()->usingPsp('your-psp-here'); \Alves\Pix\Pix::cobv()->usingPsp('your-psp-here'); \Alves\Pix\Pix::loteCobv()->usingPsp('your-psp-here'); \Alves\Pix\Pix::payloadLocation()->usingPsp('your-psp-here'); \Alves\Pix\Pix::receivedPix()->usingPsp('your-psp-here'); \Alves\Pix\Pix::webhook()->usingPsp('your-psp-here');
Cob
O Cob reúne os endpoints relacionados a criação de cobranças instantâneas.
Consulte a documentação oficial do banco central para informações sobre o request a ser enviado para cada endpoint, disponível neste link.
Para utilizar os endpoints do cob
, utilize o método cob()
, da class Alves\Pix\Pix
:
$cob = \Alves\Pix\Pix::cob();
Criando um cob
Para criar uma cobrança instantânea, é necessário utilizar a api cob
, disponibilizada pela classe Pix
, neste pacote.
use Alves\Pix\Pix; $cob = Pix::cob()->create('transactionId', $request)->json();
Revisar uma cobrança imediata
Para revisar uma cobrança imediata, deve ser utilizado o método updateByTransactionId()
, informando o id da transação a ser atualizada e
os dados para atualização.
use Alves\Pix\Pix; $updateCob = Pix::cob()->updateByTransactionId('transactionId', $dataToUpdate)->json();
Consultando uma cobrança imediata
Para consultar uma cobrança através de um determinado id de transação, você deve utilizar o método getByTransactionId
, informando o id
da transação como parâmetro:
use Alves\Pix\Pix; $cob = Pix::cob()->getByTransactionId('transactionId')->json();
Criando cobranças imediatas sem transactionId
Para criar uma cobrança imediata com transactionId
definido pelo PSP, utilize o método createWithoutTransactionId()
,
informando apenas os dados para criação da cobrança, sem a necessidade de passar um id de transação:
use Alves\Pix\Pix; $cob = Pix::cob()->createWithoutTransactionId($request);
Consultando lista de cobranças imediatas
Para consultar a lista de cobranças imediatas com parâmetros como inicio, fim, status e outros, utilize o método all()
,
passando os filtros necessários. Os filtros inicio
e fim
são obrigatórios para toda requisição neste endpoint. Este pacote
disponibiliza uma api para aplicação de filtros na requisição, bastando instanciar uma nova classe para os filtros desejados e aplicá-los
a requisição com o método withFilters()
:
use Alves\Pix\Pix; use Alves\Pix\Api\Filters\CobFilters; $filters = (new CobFilters()) ->startingAt(now()->subMonth()->toISOString()) ->endingAt(now()->addMonth()->toISOString()); $cobs = Pix::cob()->withFilters($filters)->all()->json();
A lista de filtros disponíveis para o endpoint cob
é listada aqui:
CobV
O CobV
reúne os endpoints destinados a lidar com o gerenciamento de cobranças com vencimento.
A documentação oficial do Banco Central do Brasil sobre os requests a serem enviados para cada endpoint pode ser visualizada aqui
Para utilizar estes endpoints, utilize o método cobv()
, da classe Alves\Pix\Pix
:
$cobv = \Alves\Pix\Pix::cobv();
Criando cobranças com vencimento
Para criar uma cobrança com vencimento, utilize o método createWithTransactionId
:
$cobv = \Alves\Pix\Pix::cobv()->createWithTransactionId('transactionId', $request)->json();
Revisando cobranças com vencimento
Para revisar e atualizar uma cobrança com vencimento, utilize o método updateWithTransactionId
:
$cobv = \Alves\Pix\Pix::cobv()->updateWithTransactionId('transactionId', $request)->json();
Consultar uma cobrança com vencimento
Para consultar uma cobrança com vencimento, você pode utilizar o método getByTransactionId
, informando o id de transação da cobrança:
$cobv = \Alves\Pix\Pix::cobv()->getByTransactionId('transactionId')->json();
Consultar lista de cobranças com vencimento
Para consultar a lista de cobranças imediatas com vencimento com parâmetros como inicio, fim, status e outros, utilize o método all()
,
passando os filtros necessários. Os filtros inicio
e fim
são obrigatórios para todas as requisição neste endpoint. Este pacote
disponibiliza uma api para aplicação de filtros na requisição, bastando instanciar uma nova classe para os filtros desejados e aplicá-los
a requisição com o método withFilters()
:
use Alves\Pix\Pix; use Alves\Pix\Api\Filters\CobvFilters; $filters = (new CobvFilters()) ->startingAt(now()->subMonth()->toISOString()) ->endingAt(now()->addMonth()->toISOString()); $cobs = Pix::cobv()->withFilters($filters)->all()->json();
A lista de filtros disponíveis para o endpoint cobv
é listada aqui:
LoteCobV
O loteCobV
reúne os endpoints destinados a lidar com o gerenciamento de cobranças com vencimento em lote.
A documentação oficial do Banco Central do Brasil a respeito dos requests que devem ser enviados em cada requisiçao pode se encontrada neste link;
Para utilizar estes endpointes, utilize o método loteCobv()
, da classe Alves\Pix\Pix
:
$cobv = \Alves\Pix\Pix::loteCobv();
Criando cobrança com vencimento em lote
Para criar cobranças com vencimento em lote utilize o método createBatch()
, informando o id do lote e as cobranças que
devem ser incluídas:
$batch = \Alves\Pix\Pix::loteCobv()->createBatch('batchId', $request)->json();
Revisar lotes de cobranças com vencimento
Para atualizar dados de um lote de cobranças, utilize o método updateBatch()
, informando o id do lote a ser
atualizado e os novos dados:
$batch = \Alves\Pix\Pix::loteCobv()->updateBatch('batchIdToUpdate', $request)->json();
Consultar um lote de cobranças com vencimento
Para consultar um lote de cobranças com vencimento, utilize o método getByBatchId()
, informando o id do lote
que deseja consultar:
$batch = \Alves\Pix\Pix::loteCobv()->getByBatchId('batchId')->json();
Consultar lista de cobranças com vencimento em lote:
Para consultar a lista de cobranças com vencimento em lote com parâmetros como inicio, fim, status e outros, utilize o método all()
,
passando os filtros necessários. Os filtros inicio
e fim
são obrigatórios para todas as requisição neste endpoint. Este pacote
disponibiliza uma api para aplicação de filtros na requisição, bastando instanciar uma nova classe para os filtros desejados e aplicá-los
a requisição com o método withFilters()
:
use Alves\Pix\Pix; use Alves\Pix\Api\Filters\LoteCobvFilter; $filters = (new LoteCobvFilter()) ->startingAt(now()->subMonth()->toISOString()) ->endingAt(now()->addMonth()->toISOString()); $batches = Pix::loteCobv()->withFilters($filters)->all()->json();
A lista de filtros disponíveis para o endpoint loteCobv
é listada aqui:
Payload Location
O payload location reúne os endpoints destinados a lidar com a configuração e remoção dos locations utilizados nos payloads.
Para utilizar o payload location, utilize o método payloadLocation()
, da classe Alves\Pix\Pix
:
$payloadLocation = \Alves\Pix\Pix::payloadLocation();
Criar location do payload
Para criar uma location do payload, utilize o método create
, passando a location que deseja criar:
$payloadLocation = \Alves\Pix\Pix::payloadLocation()->create('payload-location')->json();
Consultar locations cadastradas
Para consultar a lista de locations cadastrados, com parâmetros como inicio, fim, status e outros, utilize o método all()
,
passando os filtros necessários. Os filtros inicio
e fim
são obrigatórios para todas as requisição neste endpoint. Este pacote
disponibiliza uma api para aplicação de filtros na requisição, bastando instanciar uma nova classe para os filtros desejados e aplicá-los
a requisição com o método withFilters()
:
use Alves\Pix\Pix; use Alves\Pix\Api\Filters\PayloadLocationFilters; $filters = (new PayloadLocationFilters()) ->startingAt(now()->subMonth()->toISOString()) ->endingAt(now()->addMonth()->toISOString()); $locs = Pix::payloadLocation()->withFilters($filters)->all()->json();
A lista de filtros disponíveis para o endpoint payloadLocation
é listada aqui:
Recuperar location do
Para consultar a location de um payload, você deve utilizar o método getById()
:
$payloadLocation = \Alves\Pix\Pix::payloadLocation()->getById('payload-location-id')->json();
Desvincular uma cobrança de uma location
Para desvincular uma cobrança de uma location, você deve utilizar o método detachChargeFromLocation()
,
informando o id da location:
$detach = \Alves\Pix\Pix::payloadLocation()->detachChargeFromLocation('payload-location-id')->json();
ecutado com sucesso, a entidade loc
não apresentará mais um transaction_id
,
se apresentava anteriormente à chamada. Adicionalmente, a entidade cob
ou cobv
associada ao txid
desvinculado também passará a não mais apresentar um location. Esta operação não altera o status
da cob
ou cobv
em questão.
Pix recebidos
Este método reúne endpoints destinados a lidar com gerenciamento de Pix recebidos.
Para utilizá-lo, utilize o método receivedPix
, da classe Alves\Pix\Pix
:
$receivedPix = \Alves\Pix\Pix::receivedPix();
Consultar pix
Você pode consultar um pix recebido através do id end to end (e2eid):
$pix = \Alves\Pix\Pix::receivedPix()->getBye2eid('pix-e2eid')->json()
Consultar pix recebidos
Para consultar a lista de todos os pix recebidos, com parâmetros como inicio, fim, status e outros, utilize o método all()
,
passando os filtros necessários. Os filtros inicio
e fim
são obrigatórios para todas as requisição neste endpoint. Este pacote
disponibiliza uma api para aplicação de filtros na requisição, bastando instanciar uma nova classe para os filtros desejados e aplicá-los
a requisição com o método withFilters()
:
use Alves\Pix\Pix; use Alves\Pix\Api\Filters\ReceivedPixFilters; $filters = (new ReceivedPixFilters()) ->startingAt(now()->subMonth()->toISOString()) ->endingAt(now()->addMonth()->toISOString()); $pix = Pix::receivedPix()->withFilters($filters)->all()->json();
A lista de filtros disponíveis para o endpoint receivedPix
é listada aqui:
Solicitar devolução
Você pode solicitar uma devolução de um pix recebido através do método refund
, informando o id e2eid
do pix a ser devolvido
e um id para a devolução:
$refundPix = \Alves\Pix\Pix::receivedPix()->refund('e2eid', 'refundId')->json();
Consultar devolução
Você pode consultar uma devolução através do id desta devolução e do e2eid
do pix:
$refund = \Alves\Pix\Pix::receivedPix()->consultRefund('e2eid', 'refundId')->json();
Webhooks
Reúne endpoints para gerenciamento de notificações por parte do PSP recebedor ao usuário recebedor.
Para gerenciar webhooks, utilize o método webhook
, da classe Alves\Pix\Pix
:
$webhook = \Alves\Pix\Pix::webhook();
Configurar o webhook pix
Este é o endpoint para configuração do serviço de notificações acerca de Pix recebidos. Somente Pix associados a um txid serão notificados.
Para configurar um webhook, você deve utilizar o método create
, informando a chave pix e o URL para onde o webhook deve ser enviado:
$webhook = \Alves\Pix\Pix::webhook()->create('pixKey', 'https://url-do-webhook.com')->json();
Exibir informações sobre o webhook pix
Para consultar um webhook, utilize o método getByPixKey
, informando a chave pix associada ao webhook:
$webhook = \Alves\Pix\Pix::webhook()->getByPixKey('pixKey')->json();
Cancelar o webhook pix
Para remover um webhook, utilize o método delete
, informando a chave pix associada ao webhook:
$webhook = \Alves\Pix\Pix::webhook()->delete('pixKey')->json();
Consultar webhooks cadastrados
Para consultar todos os webhooks cadastrados, utilize o método all
:
$webhooks = \Alves\Pix\Pix::webhook()->all()->json();
Também é possível incluir alguns filtros, como inicio, fim e paginação, mas neste endpoint nenhum deles é obritagtório:
use Alves\Pix\Pix; use Alves\Pix\Api\Filters\WebhookFilters; $filters = (new WebhookFilters()) ->startingAt(now()->subMonth()->toISOString()) ->endingAt(now()->addMonth()->toISOString()); $webhooks = Pix::webhook()->withFilters($filters)->all()->json();
A lista de filtros disponíveis para o endpoint webhook
é listada aqui:
Configurando Endpoints
Para configurar endpoints específicos para cada PSP, você precisa criar um EndpointResolver
para cada PSP que não segue a convenção do BACEN.
Para criar um endpoint Resolver, crie um classe com o nome desejado e implemente a interface CanResolveEndpoints
, ou, simplesmente extenda a class Endpoints
,
disponível neste pacote. Ela fornece os endpoints necessários, e você pode copiar o array de endpoints e alterar o necessário para o seu PSP.
public array $endpoints = [ self::OAUTH_TOKEN => '/oauth/token', self::CREATE_COB => '/cob/', self::GET_COB => '/cob/', self::UPDATE_COB => '/cob/', self::GET_ALL_COBS => '/cob/', self::CREATE_COBV => '/cobv/', self::GET_COBV => '/cobv/', self::GET_ALL_COBV => '/cobv/', self::CREATE_LOTE_COBV => '/lotecobv/', self::UPDATE_LOTE_COBV => '/lotecobv/', self::GET_LOTE_COBV => '/lotecobv/', self::GET_ALL_LOTE_COBV => '/lotecobv/', self::CREATE_WEBHOOK => '/webhook/', self::GET_WEBHOOK => '/webhook/', self::DELETE_WEBHOOK => '/webhook/', self::GET_WEBHOOKS => '/webhooks/', self::RECEIVED_PIX => '/pix/', self::RECEIVED_PIX_REFUND => '/devolucao/', self::CREATE_PAYLOAD_LOCATION => '/loc/', self::GET_PAYLOAD_LOCATION => '/loc/', self::DETACH_CHARGE_FROM_LOCATION => '/loc/', self::PAYLOAD_LOCATION_TXID => '/loc/', ];
Após isso, registre o endpoint resolver do seu PSP na chave resolve_endpoints_using
, do arquivo de configurações deste pacote, dentro das configurações do PSP desejado.
'psp' => [ 'default' => [ 'base_url' => env('LARAVEL_PIX_PSP_BASE_URL'), 'oauth_token_url' => env('LARAVEL_PIX_PSP_OAUTH_URL', false), 'oauth_bearer_token' => env('LARAVEL_PIX_OAUTH2_BEARER_TOKEN'), 'ssl_certificate' => env('LARAVEL_PIX_PSP_SSL_CERTIFICATE'), 'client_secret' => env('LARAVEL_PIX_PSP_CLIENT_SECRET'), 'client_id' => env('LARAVEL_PIX_PSP_CLIENT_ID'), 'authentication_class' => \Alves\Pix\Api\Contracts\AuthenticatesPSPs::class, 'resolve_endpoints_using' => YourCustomEndpointResolver::class, ], ],