Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .cursorignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/dist/
build/
/logs/
/log/
/cache/
/.git/
/vendor/
/node_modules/
tests/config/env.test.php
tmp/
error_log
2 changes: 1 addition & 1 deletion .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
if: ${{ !github.event.pull_request.draft }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install PHP ${{ env.PHP_VERSION }}
uses: shivammathur/setup-php@v2
Expand Down
149 changes: 67 additions & 82 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

SDK de integração eRede

## ⚠️ Atualização Importante - Nova Autenticação

A partir de **janeiro de 2026**, a Rede implementou um novo método de autenticação baseado em **OAuth2** para aprimorar a segurança das transações.

**A versão 2.x deste SDK é compatível com o novo método de autenticação OAuth2**, garantindo uma transição suave e segura para os desenvolvedores.

Para mais detalhes sobre a nova autenticação e migração, consulte a [documentação oficial da e-Rede](https://developer.userede.com.br/e-rede).

## Funcionalidades

Este SDK possui as seguintes funcionalidades:
Expand All @@ -27,7 +35,7 @@ Se já possui um arquivo `composer.json`, basta adicionar a seguinte dependênci
```json
{
"require": {
"silbeckdevs/erede-php": "*"
"silbeckdevs/erede-php": "^2.0.0"
}
}
```
Expand Down Expand Up @@ -67,7 +75,13 @@ export REDE_DEBUG=0

Ou copie o arquivo `tests/config/env.test.php.example` para `tests/config/env.test.php` e adicione as suas credenciais

## Autorizando uma transação
## Configuração da loja

A configuração da loja é feita através da classe `Store`. Ela possui os seguintes parâmetros:

- `filiation`: Número de filiação do estabelecimento (ClientId na versão 2.x)
- `token`: Chave de Integração (ClientSecret na versão 2.x)
- `environment`: Ambiente da loja (Production ou Sandbox)

```php
<?php
Expand All @@ -77,6 +91,13 @@ $store = new Store('PV', 'TOKEN', Environment::production());
// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

$eRedeService = new \Rede\eRede($store);
```

## Autorizando uma transação

```php
<?php
// Transação que será autorizada
$transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
'5448280000000007',
Expand All @@ -87,7 +108,7 @@ $transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
);

// Autoriza a transação
$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '00') {
printf("Transação autorizada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -98,12 +119,6 @@ Por padrão, a transação é capturada automaticamente; caso seja necessário a

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Transação que será autorizada
$transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
'5448280000000007',
Expand All @@ -114,7 +129,7 @@ $transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
)->capture(false);

// Autoriza a transação
$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '00') {
printf("Transação autorizada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -126,12 +141,6 @@ if ($transaction->getReturnCode() == '00') {

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Transação que será autorizada
$transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
'5448280000000007',
Expand All @@ -145,7 +154,7 @@ $transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
$transaction->setInstallments(3);

// Autoriza a transação
$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '00') {
printf("Transação autorizada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -156,12 +165,6 @@ if ($transaction->getReturnCode() == '00') {

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Transação que será autorizada
$transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
'5448280000000007',
Expand All @@ -172,7 +175,7 @@ $transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
)->additional(1234, 56);

// Autoriza a transação
$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '00') {
printf("Transação autorizada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -183,12 +186,6 @@ if ($transaction->getReturnCode() == '00') {

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Transação que será autorizada
$transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
'5448280000000007',
Expand All @@ -207,7 +204,7 @@ $transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
);

// Autoriza a transação
$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '00') {
printf("Transação autorizada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -219,12 +216,6 @@ if ($transaction->getReturnCode() == '00') {

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Transação que será autorizada
$transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
'5448280000000007',
Expand All @@ -235,7 +226,7 @@ $transaction = (new Transaction(20.99, 'pedido' . time()))->creditCard(
)->iata('code123', '250');

// Autoriza a transação
$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '00') {
printf("Transação autorizada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -246,14 +237,8 @@ if ($transaction->getReturnCode() == '00') {

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Transação que será capturada
$transaction = (new eRede($store))->capture((new Transaction(20.99))->setTid('TID123'));
$transaction = $eRedeService->capture((new Transaction(20.99))->setTid('TID123'));

if ($transaction->getReturnCode() == '00') {
printf("Transação capturada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -264,14 +249,8 @@ if ($transaction->getReturnCode() == '00') {

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Transação que será cancelada
$transaction = (new eRede($store))->cancel((new Transaction(20.99))->setTid('TID123'));
$transaction = $eRedeService->cancel((new Transaction(20.99))->setTid('TID123'));

if ($transaction->getReturnCode() == '359') {
printf("Transação cancelada com sucesso; tid=%s\n", $transaction->getTid());
Expand All @@ -282,13 +261,8 @@ if ($transaction->getReturnCode() == '359') {

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

$transaction = (new eRede($store))->get('TID123');
// Consulta a transação pelo ID
$transaction = $eRedeService->get('TID123');

printf("O status atual da autorização é %s\n", $transaction->getAuthorization()->getStatus());
```
Expand All @@ -297,13 +271,8 @@ printf("O status atual da autorização é %s\n", $transaction->getAuthorization

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

$transaction = (new eRede($store))->getByReference('pedido123');
// Consulta a transação pela referência
$transaction = $eRedeService->getByReference('pedido123');

printf("O status atual da autorização é %s\n", $transaction->getAuthorization()->getStatus());
```
Expand All @@ -312,13 +281,8 @@ printf("O status atual da autorização é %s\n", $transaction->getAuthorization

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

$transaction = (new eRede($store))->getRefunds('TID123');
// Consulta os cancelamentos de uma transação
$transaction = $eRedeService->getRefunds('TID123');

printf("O status atual da autorização é %s\n", $transaction->getAuthorization()->getStatus());
```
Expand All @@ -327,12 +291,6 @@ printf("O status atual da autorização é %s\n", $transaction->getAuthorization

```php
<?php
// Configuração da loja em modo produção
$store = new Store('PV', 'TOKEN', Environment::production());

// Configuração da loja em modo sandbox
// $store = new \Rede\Store('PV', 'TOKEN', \Rede\Environment::sandbox());

// Configura a transação que será autorizada após a autenticação
$transaction = (new Transaction(25, 'pedido' . time()))->debitCard(
'5277696455399733',
Expand All @@ -357,7 +315,7 @@ $transaction->threeDSecure(
$transaction->addUrl('https://redirecturl.com/3ds/success', Url::THREE_D_SECURE_SUCCESS);
$transaction->addUrl('https://redirecturl.com/3ds/failure', Url::THREE_D_SECURE_FAILURE);

$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '220') {
printf("Redirecione o cliente para \"%s\" para autenticação\n", $transaction->getThreeDSecure()->getUrl());
Expand All @@ -371,7 +329,7 @@ if ($transaction->getReturnCode() == '220') {
// Configura a transação para o PIX e passa a data de expiração
$transaction = (new Transaction(200.99, 'pedido' . time()))->createQrCode(new \DateTimeImmutable('+ 1 hour'));

$transaction = (new eRede($store))->create($transaction);
$transaction = $eRedeService->create($transaction);

if ($transaction->getReturnCode() == '00') {
printf(
Expand All @@ -383,6 +341,33 @@ if ($transaction->getReturnCode() == '00') {

## Observações

- Ao criar uma transação com `$transaction = (new eRede($store))->create($transaction)` não vai retornar o campo `authorization`, para retornar o campo é preciso fazer uma consulta `$transaction = (new eRede($store))->get('TID123')`
- Ao criar uma transação com `$transaction = $eRedeService->create($transaction)` não vai retornar o campo `authorization`, para retornar o campo é preciso fazer uma consulta `$transaction = $eRedeService->get('TID123')`
- O campo `$transaction->getAuthorizationCode()` não está retornando nada, use `$transaction->getBrand()?->getAuthorizationCode()` ou `$transaction->getAuthorization()?->getBrand()?->getAuthorizationCode()`
- Caso precise acessar o JSON original do response utilize `$transaction?->getHttpResponse()->getBody()`

### Gerenciamento de Token OAuth2

O token de autenticação OAuth2 possui um **tempo de expiração** de 24 minutos. Para otimizar o desempenho e evitar requisições desnecessárias, é recomendado **salvar e reutilizar o token** enquanto ele estiver válido.

**Exemplo de implementação:**

```php
<?php
$store = new Store('PV', 'TOKEN', Environment::production());
$eRedeService = new eRede($store);

// Faça suas requisições...

// Salve o token para reutilização e salve em um local seguro
$cachedToken = json_encode($eRedeService->getOAuthToken());

// Para reutilizar o token, basta decodificar o JSON e setar no store
$store->setOAuthToken((new OAuthToken())->populate(json_decode($cachedToken)));
$eRedeService = new eRede($store);
```

**Recomendações:**

- Armazene o token em cache (Redis, Memcached) ou banco de dados para ambientes de produção
- Sempre verifique a expiração antes de reutilizar o token
- O SDK gerencia automaticamente a renovação quando o token expira
10 changes: 5 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "silbeckdevs/erede-php",
"version": "1.0.2",
"version": "2.0.0",
"description": "e.Rede integration SDK",
"minimum-stability": "stable",
"license": "MIT",
Expand All @@ -12,11 +12,11 @@
"psr/log": "*"
},
"require-dev": {
"phpunit/phpunit": "^12.1.6",
"phpstan/phpstan": "^1.12.27",
"kint-php/kint": "^6.0.1",
"phpunit/phpunit": "^12.4.5",
"phpstan/phpstan": "^1.12.32",
"kint-php/kint": "^6.1.0",
"monolog/monolog": "^3.9.0",
"friendsofphp/php-cs-fixer": "^3.75.0",
"friendsofphp/php-cs-fixer": "^3.91.2",
"brainmaestro/composer-git-hooks": "^3.0.0"
},
"autoload": {
Expand Down
Loading