Skip to content

PHPAY-78: adicionar o gateway Pagar.me (Core API v5) - #79

Merged
mariolucasdev merged 1 commit into
feat/phpay-76from
feat/phpay-78
Sep 21, 2026
Merged

mariolucasdev merged 1 commit into
feat/phpay-76from
feat/phpay-78

Conversation

@mariolucasdev

Copy link
Copy Markdown
Collaborator

Closes #78

Parte da v2.0.0. Empilhado sobre #77 (PagBank).

Quinto gateway. O Pagar.me é descrito no mercado como o favorito técnico, e o SDK oficial em PHP é autogerado e pouco amigável — é onde o PHPay agrega mais.

⚠️ Correção de uma avaliação minha anterior

Eu havia afirmado que o Pagar.me seria o primeiro a encaixar nas cinco capacidades, por causa do endpoint /hooks. Estava errado. O /hooks lista as entregas de webhook já despachadas; o cadastro dos endpoints que as recebem é feito no dashboard. Não é a capacidade SupportsWebhooks, que nasceu do CRUD de endpoints do Asaas.

São três das cinco, como Mercado Pago e PagBank.

Capacidades

Capacidade Declara? Motivo
SupportsCustomers /customers com CRUD completo e cartões salvos
SupportsCharges /orders, /charges
SupportsSubscriptions /plans, /subscriptions
SupportsWebhooks /hooks lê entregas; cadastro no dashboard
SupportsPixKeys Pix é payment_method do pedido

O /hooks virou um extra fora do modelo

Ler e reenviar entregas é útil demais para descartar, mas declarar SupportsWebhooks por causa disso seria mentir — $phpay->webhook() devolveria algo com semântica diferente de todos os outros gateways.

A solução é o caminho que o modelo de capacidades abre: vive no gateway concreto, não na facade.

$gateway->webhookDeliveries()->setFilter(['size' => 10])->getAll();
$gateway->webhookDeliveries()->resend($hookId);

Quem segura PagarMeGateway alcança; quem tipa uma capacidade não. Tem teste garantindo que a facade não ganhou esse método.

Particularidades

  • Basic auth, com a secret key como usuário e senha vazia — diferente do Bearer dos outros. Há teste conferindo o header que o client monta.
  • Ambiente pelo prefixo da chave (sk_test_), host único. Mesmo modelo do Mercado Pago, então sem $sandbox.
  • Valores em centavos inteiros, como no PagBank.
  • Pix é payments[].payment_method com pix: {expires_in}; copia-e-cola em charges[0].last_transaction.qr_code.
  • Cancelamento é DELETE /charges/{id} com valor no corpo para estorno parcial. O delete() do trait não manda corpo, então uso request().

Recursos

  • ChargesetCustomer/setCustomerId, setItems/addItem, setPix, setBoleto, setPayments, create, find, getAll, findCharge, getStatus, getPixCode, capture, cancel
  • Customercreate, find, update, getAll, cards, setFilter
  • SubscriptioncreatePlan, findPlan, getAllPlans, destroyPlan, create (com ou sem plano), find, getAll, cancel
  • WebhookDeliverygetAll, find, resend (fora das capacidades)

Cliente e assinatura aceitam o recurso embutido ou por id — passar um array com id troca customer por customer_id, para não criar cadastro duplicado.

Verificação

151 testes (391 asserções), PHPStan nível 9 limpo, Pint limpo. Endpoints, autenticação, o caminho do QR Code e o cancelamento por DELETE foram conferidos na documentação oficial.

Quinto gateway da biblioteca. Declara três das cinco capacidades:

  SupportsCustomers     /customers  (CRUD completo, com cartões salvos)
  SupportsCharges       /orders, /charges
  SupportsSubscriptions /plans, /subscriptions

Correção de uma avaliação anterior: o Pagar.me NÃO encaixa nas cinco. Eu tinha
afirmado que sim por causa do endpoint /hooks, mas ele lista as entregas de
webhook já despachadas — o cadastro dos endpoints que as recebem é feito no
dashboard. Não é a capacidade SupportsWebhooks, que nasceu do CRUD de endpoints
do Asaas.

Particularidades:

- Autenticação Basic, com a secret key como usuário e senha vazia, diferente do
  Bearer dos outros gateways.
- Ambiente pelo prefixo da chave (sk_test_), não por host: teste e produção
  compartilham api.pagar.me/core/v5. Mesmo modelo do Mercado Pago, então o
  construtor não recebe $sandbox.
- Valores em centavos inteiros, como no PagBank.
- Pix é payments[].payment_method com um objeto pix: {expires_in}; o
  copia-e-cola volta em charges[0].last_transaction.qr_code.
- Cancelamento é DELETE /charges/{id}, com o valor no corpo para estorno
  parcial — o delete() do trait não manda corpo, então usa request().

O /hooks vira o recurso webhookDeliveries(), exposto só no gateway concreto e
fora do modelo de capacidades. É o caminho que o modelo abre para o que um
gateway oferece sozinho: quem segura PagarMeGateway alcança, quem tipa uma
capacidade não. Um teste garante que a facade não ganhou esse método.

Cliente e assinatura aceitam o recurso embutido ou por id — passar um array com
`id` troca customer por customer_id, para não criar cadastro duplicado.

151 testes no total.
@mariolucasdev
mariolucasdev merged commit 45de0e3 into feat/phpay-76 Sep 21, 2026
6 checks passed
@mariolucasdev
mariolucasdev deleted the feat/phpay-78 branch September 21, 2026 00:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant