PHPAY-76: adicionar o gateway PagBank (PagSeguro) - #77
Merged
Merged
Conversation
Quarto gateway da biblioteca. Declara três das cinco capacidades:
SupportsCustomers /customers (assinantes)
SupportsCharges /orders, /charges
SupportsSubscriptions /plans, /subscriptions
Não declara SupportsWebhooks porque o PagBank não expõe CRUD de webhooks por
API — eles são registrados no painel, ou por pedido via notification_urls. Não
declara SupportsPixKeys porque lá o Pix não é sequer uma cobrança.
Três particularidades que nenhum gateway anterior tinha:
1. Duas APIs em hosts diferentes. Pedidos e cobranças vivem em
api.pagseguro.com; planos, assinantes e assinaturas em
api.assinaturas.pagseguro.com. O trait expõe clientPagBankBoot() e
clientPagBankSubscriptionsBoot(), e cada recurso boota o da sua API — quem usa
a biblioteca não precisa saber que são duas.
2. Pix não é uma charge. O pedido carrega qr_codes: [{amount: {value}}] em vez
de charges, o copia-e-cola volta em qr_codes[0].text, e só um QR Code por
pedido é aceito. setQrCode() e setCharges() expressam essa diferença em vez de
escondê-la atrás de um "billingType".
3. Todo valor é inteiro em centavos. R$ 100,50 é 10050, e mandar 100.50 cobraria
um real. Os validadores recusam decimal antes de qualquer chamada, com mensagem
dizendo a conversão — é o erro mais fácil de cometer com essa API e o mais caro
de descobrir em produção.
O cliente do pedido vem embutido nele; o CRUD de /customers é de assinantes, do
domínio de recorrência, e por isso vive no host de assinaturas. Planos ficam no
recurso Subscription em vez de virarem recurso próprio: uma assinatura sempre
pertence a um plano, é um fluxo só.
123 testes no total. Os do PagBank cobrem o roteamento de cada recurso para o
host certo, o Pix indo como qr_code e não como charge, a recusa de valor
decimal, a recusa de mais de um QR Code, e as rotas de suspender, reativar e
cancelar assinatura.
Inclui também examples/pagbank/sandbox-check.php, que roda contra o sandbox de
verdade e relata cada operação — teste com HTTP mockado prova que montamos o
payload que decidimos, não que o gateway o aceita.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #76
Parte da v2.0.0. Base em
refactor/phpay-70, onde #73 e #75 já estão mergeados.Quarto gateway da biblioteca. Junto com o Mercado Pago, é o de maior alcance no Brasil — forte especialmente em PME e varejo.
Capacidades
Declara três das cinco:
SupportsCustomers/customers(assinantes)SupportsCharges/orders,/charges,/charges/{id}/cancelSupportsSubscriptions/plans,/subscriptionsSupportsWebhooksnotification_urlsSupportsPixKeysTrês particularidades que nenhum gateway anterior tinha
1. Duas APIs em hosts diferentes. Pedidos e cobranças em
api.pagseguro.com; planos, assinantes e assinaturas emapi.assinaturas.pagseguro.com. O trait expõeclientPagBankBoot()eclientPagBankSubscriptionsBoot(), e cada recurso boota o da sua API — quem usa a biblioteca não precisa saber que são duas.2. Pix não é uma
charge. O pedido carregaqr_codes: [{amount: {value}}]em vez decharges, o copia-e-cola volta emqr_codes[0].text, e só um QR Code por pedido é aceito (a conta também precisa de uma chave Pix ativa).setQrCode()esetCharges()expressam essa diferença em vez de escondê-la atrás de um "billingType" que não existe lá.3. Todo valor é inteiro em centavos. R$ 100,50 é
10050. Mandar100.50cobraria um real. Os validadores recusam decimal antes de qualquer chamada, com mensagem dizendo a conversão — é o erro mais fácil de cometer com essa API e o mais caro de descobrir em produção.Decisões de modelagem
/customersé de assinantes e pertence ao domínio de recorrência, por isso vive no host de assinaturas.SupportsCustomersdiz "tem o recurso", não "é o mesmo cliente do pedido".Subscription. Uma assinatura sempre pertence a um plano — é um fluxo só. Criar um recursoPlanseparado exigiria uma capacidade nova para pouco ganho.Recursos
setOrder,setCustomer,setItems/addItem,setCharges,setQrCode,setNotificationUrls,create,find,findCharge,getStatus,getPixCode,refundtotal ou parcialcreate,find,update,getAll,setFiltercreatePlan,findPlan,getAllPlans,create,find,getAll,suspend,activate,cancelVerificação
123 testes (307 asserções), PHPStan nível 9 limpo, Pint limpo. Os do PagBank cobrem o roteamento de cada recurso para o host certo, o Pix indo como
qr_codee não comocharge, a recusa de valor decimal, a recusa de mais de um QR Code, e as rotas de suspender/reativar/cancelar.Inclui
examples/pagbank/sandbox-check.php, que roda contra o sandbox de verdade e relata cada operação — teste com HTTP mockado prova que montamos o payload que decidimos, não que o gateway o aceita.Endpoints, o modelo
qr_codese a unidade em centavos foram conferidos na documentação oficial do PagBank, não escritos de memória.