Skip to content

PHPAY-85: adicionar o gateway Rede (e.Rede v2) - #86

Merged
mariolucasdev merged 2 commits into
developfrom
feat/phpay-85
Sep 21, 2026
Merged

mariolucasdev merged 2 commits into
developfrom
feat/phpay-85

Conversation

@mariolucasdev

Copy link
Copy Markdown
Collaborator

Closes #85

Sétimo gateway, e a segunda adquirente. A Rede lidera o mercado por volume transacionado (18%), à frente de Cielo e PagBank.

Capacidades: 1 de 5

Apenas SupportsCharges. É a forma mais estreita da biblioteca, ao lado do Efí, e é a esperada para uma adquirente.

Não declarei SupportsSubscriptions de propósito. A transação tem um campo subscription, mas ele é uma flag para a adquirente marcar uma cobrança recorrente — não um recurso que se liste, altere ou cancele. Declarar seria o mesmo erro que eu quase cometi com o /hooks do Pagar.me: API parecida, semântica diferente.

Duas particularidades, ambas novas

1. Host de OAuth separado, com caminho de token por ambiente

Sandbox Produção
API sandbox-erede.useredecloud.com.br/v2/ api.userede.com.br/erede/v2/
OAuth rl7-sandbox-api.useredecloud.com.br/ api.userede.com.br/
Token oauth2/token redelabs/oauth2/token

Repare que o caminho do token muda entre ambientes — não é só o domínio. Isso ficou em RedeEnvironment, fora do trait, para o gateway ler a configuração sem puxar os verbos HTTP que não usa.

2. O token expira — e este é o primeiro gateway assim

O Efí autoriza sob demanda mas nunca renova, porque o token dele não vence em uso normal. Aqui a resposta traz expires_in, então um processo longo precisa renegociar.

Resources/Authorization guarda o token com validade e renegocia sozinho, com margem de 30 segundos para o token nunca vencer entre ser entregue e ser usado:

$gateway = new RedeGateway(REDE_PV, REDE_TOKEN);   // nenhuma chamada de rede aqui

$gateway->authorization()->hasValidToken();
$gateway->authorization()->forget();

O Charge pede um token a cada chamada e injeta como Bearer por requisição, em vez de fixar no header do client — é o que faz a renovação ser invisível para quem usa. Há testes cobrindo o reaproveitamento, a renegociação após expirar, e o descarte manual.

⚠️ Confiança menor que nos gateways anteriores

Preciso ser explícito: nos seis anteriores eu conferi endpoints na documentação oficial. Aqui não deu.

O portal da Rede publica a documentação apenas em PDF. As URLs, os caminhos de token e o fluxo de OAuth vieram de um SDK PHP de terceiros em funcionamento (filipegar/eRede) — evidência razoável, já que é código que roda, mas não é a fonte oficial.

Bem evidenciado: URLs, caminhos de token, grant client_credentials, e os endpoints POST transactions, PUT transactions/{tid}, POST transactions/{tid}/refunds, GET transactions/{tid}.

Não confirmado: os nomes exatos de todos os campos do payload, e se a v2 suporta Pix. Por isso o escopo ficou em cartão, que é o núcleo de uma adquirente, e a checagem contra o sandbox importa mais aqui do que nos outros gateways.

Recursos

  • ChargesetReference, setCard, setPayment, setSoftDescriptor, create, find, findByReference, getStatus, capture, refund
  • Authorizationtoken, hasValidToken, forget

Verificação

171 testes (459 asserções) nesta branch — a Cielo está no #84, ainda não mergeada. PHPStan nível 9 limpo, Pint limpo.

Sétimo gateway, e a segunda adquirente. A Rede lidera o mercado por volume
transacionado (18%), à frente de Cielo e PagBank.

Declara UMA das cinco capacidades: SupportsCharges. É a forma mais estreita da
biblioteca, ao lado do Efí, e é a esperada para uma adquirente. Não declarei
SupportsSubscriptions de propósito: a transação tem um campo `subscription`,
mas ele é uma flag para a adquirente, não um recurso que se liste, altere ou
cancele.

Duas particularidades, ambas novas:

1. O host de autorização é separado do host de API, e o caminho do token muda
por ambiente — oauth2/token no sandbox, redelabs/oauth2/token em produção.
Isso ficou em RedeEnvironment, fora do trait, para o gateway poder ler a
configuração sem puxar os verbos HTTP que não usa.

2. O token expira. É o primeiro gateway com ciclo de vida de credencial: o Efí
autoriza sob demanda mas nunca renova, porque o token dele não vence em uso
normal. Aqui a resposta traz expires_in, então Resources/Authorization guarda
o token com validade e renegocia sozinho, com margem de 30 segundos para o
token nunca vencer entre ser entregue e ser usado. O gateway expõe
authorization() para um processo longo inspecionar ou descartar o que está em
mãos.

O Charge pede um token a cada chamada e injeta como Bearer por requisição, em
vez de fixar no header do client — é o que permite a renovação ser invisível
para quem usa.

CONFIANÇA MENOR QUE NOS GATEWAYS ANTERIORES. O portal da Rede publica a
documentação apenas em PDF, então as URLs, os caminhos de token e o fluxo de
OAuth vieram de um SDK PHP de terceiros em funcionamento (filipegar/eRede),
não da documentação oficial. Os endpoints estão bem evidenciados; os nomes
exatos de alguns campos do payload e o suporte a Pix na v2, não. Por isso o
escopo ficou em cartão, que é o núcleo de uma adquirente.

171 testes nesta branch (a Cielo está no #84, ainda não mergeada). Os da Rede
cobrem o reaproveitamento do token, a renegociação quando expira, o basic auth
da negociação, o Bearer por requisição, e o roteamento entre os dois hosts.
Conflitos resolvidos em quatro arquivos. Todos eram aditivos — os dois lados
precisavam coexistir, não um substituir o outro:

- .gitignore e composer.json: as entradas da Cielo e da Rede entram juntas.
- README.md: as tabelas de capacidades, de unidade monetária, de ambientes e a
  de cobertura do roadmap ganham as duas colunas; as seções de gateway ficam na
  ordem do documento, Cielo antes de Rede.
- tests/Pest.php: os quatro helpers de mock, dois de cada gateway.

Duas coisas que precisaram de correção além do merge:

1. O tests/Pest.php tinha conflitos entrelaçados dentro de corpos de função, e
resolver "mantendo os dois lados" cortou chaves — o arquivo virou parse error.
Reescrevi os quatro helpers inteiros em vez de remendar.

2. O CLAUDE.md não tinha as anotações da Rede. Esta branch saiu do develop
antes da Cielo entrar, então os replace() que eu havia escrito procuravam
âncoras com texto da Cielo que ainda não existia: viraram no-op silencioso, e
eu tinha imprimido "atualizado" sem verificar. Agora as anotações estão lá, e
a escrita é conferida em disco.

199 testes com os dois gateways juntos.
@mariolucasdev
mariolucasdev merged commit 7140e30 into develop Sep 21, 2026
6 checks passed
@mariolucasdev
mariolucasdev deleted the feat/phpay-85 branch September 21, 2026 01:39
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.

Adicionar o gateway Rede (e.Rede v2)

1 participant