Skip to content

feat: Adicionar PIX aos meios de pagamento #74

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open
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
15 changes: 15 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# EditorConfig is awesome: https://editorconfig.org/

# top-most EditorConfig file
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = true

[*.php]
indent_size = 4
24 changes: 24 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
version: 2
updates:
- package-ecosystem: 'github-actions'
directory: '/'
commit-message:
prefix: 'chore'
schedule:
interval: 'monthly'
open-pull-requests-limit: 10
labels: ['dependencies']

- package-ecosystem: 'composer'
directory: '/'
commit-message:
prefix: 'chore'
schedule:
interval: 'monthly'
open-pull-requests-limit: 10
groups:
all-dependencies:
patterns: ['*']
update-types: ['minor', 'patch', 'major']
labels: ['dependencies']
versioning-strategy: 'increase'
58 changes: 58 additions & 0 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Run lint and tests
on:
pull_request:
types:
- opened
- reopened
- ready_for_review
workflow_dispatch:

env:
PHP_VERSION: 8.3
PHP_EXTENSIONS: mbstring
PHP_TOOLS: composer:v2, phpunit:11
REDE_PV: ${{ secrets.REDE_PV }}
REDE_TOKEN: ${{ secrets.REDE_TOKEN }}
REDE_DEBUG: ${{ vars.REDE_DEBUG }}

permissions:
id-token: write
contents: read

jobs:
run-tests:
if: ${{ !github.event.pull_request.draft }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install PHP ${{ env.PHP_VERSION }}
uses: shivammathur/setup-php@v2
with:
coverage: none
php-version: ${{ env.PHP_VERSION }}
extensions: ${{ env.PHP_EXTENSIONS }}
tools: ${{ env.PHP_TOOLS }}

- name: Get Composer Cache Directory
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-

- name: Install dependencies
run: composer update --no-interaction --no-progress

- name: Static analysis
run: composer phpstan

- name: PHP Coding Standards Fixer
run: composer format:check

- name: Run PHPUnit
run: composer phpunit
15 changes: 12 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
/vendor/*
/config/app.php
/tmp/*
/.env
/test.php
/teste.php
error_log
.phpunit.cache/*
.vscode/settings.json
.php-cs-fixer.cache
cghooks.lock
.idea
vendor/*
composer.lock

.phpunit.result.cache
.php-cs-fixer.cache
env.test.php
28 changes: 28 additions & 0 deletions .php-cs-fixer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php
/**
* @see https://cs.symfony.com/doc/rules/index.html
* @see https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/f65e6a20c9ef30f2fc93d8c3e1bf6aa3bd910192/src/RuleSet/Sets/PSR12Set.php
* @see https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/f65e6a20c9ef30f2fc93d8c3e1bf6aa3bd910192/src/RuleSet/Sets/SymfonySet.php
*/
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->name('*.php')
->ignoreDotFiles(true)
->ignoreVCS(true);

return (new PhpCsFixer\Config())
->setParallelConfig(\PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect())
->setRiskyAllowed(false)
->setRules([
'@PSR12' => true, // Aplicar o padrão PSR-12
'@Symfony' => true, // Aplicar o padrão Symfony
'fully_qualified_strict_types' => false, // Garantir namespaces completos
'array_syntax' => ['syntax' => 'short'], // Usar a sintaxe curta para arrays []
'binary_operator_spaces' => ['default' => 'single_space'],
'concat_space' => ['spacing' => 'one'],
'increment_style' => ['style' => 'post'],
'class_attributes_separation' => true,
])
->setIndent(' ')
->setLineEnding("\n")
->setFinder($finder);
17 changes: 17 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"recommendations": [
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"streetsidesoftware.code-spell-checker",
"streetsidesoftware.code-spell-checker-portuguese",
"usernamehw.errorlens",
"eamodio.gitlens",
"seatonjiang.gitmoji-vscode",
"devsense.phptools-vscode",
"phproberto.vscode-php-getters-setters",
"mehedidracula.php-namespace-resolver",
"junstyle.php-cs-fixer",
],
"unwantedRecommendations": []
}
35 changes: 35 additions & 0 deletions .vscode/settings.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"files.eol": "\n",
"eslint.run": "onSave",
"editor.tabSize": 2,
"php-cs-fixer.executablePath": "${workspaceFolder}/vendor/bin/php-cs-fixer",
"[php]": {
"editor.defaultFormatter": "junstyle.php-cs-fixer",
"editor.formatOnSave": false,
"editor.tabSize": 4,
"editor.insertSpaces": true,
"editor.trimAutoWhitespace": true,
"editor.bracketPairColorization.enabled": true
},
"php.format.codeStyle": "PSR-12",
"php.debug.port": 9000,
"editor.rulers": [
150
],
"files.insertFinalNewline": true,
"javascript.suggest.autoImports": true,
"typescript.suggest.autoImports": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.organizeImports": "explicit"
},
"eslint.format.enable": true,
"scss.validate": false,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[json]": {
"editor.defaultFormatter": "vscode.json-language-features"
},
"[jsonc]": {
"editor.defaultFormatter": "vscode.json-language-features"
}
}
107 changes: 62 additions & 45 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,77 +2,70 @@

SDK de integração eRede

# Funcionalidades
## Funcionalidades

Este SDK possui as seguintes funcionalidades:
* Autorização
* Captura
* Consultas
* Cancelamento
* 3DS2
* Zero dollar
* iata
* MCC dinâmico.

# Instalação
- Autorização
- Captura
- Consultas
- Cancelamento
- 3DS2
- Zero dollar
- iata
- MCC dinâmico.
- PIX

## Dependências

* PHP >= 8.1
- PHP >= 8.2

## Instalando o SDK

Se já possui um arquivo `composer.json`, basta adicionar a seguinte dependência ao seu projeto:

```json
{
"require": {
"developersrede/erede-php": "*"
"require": {
"silbeckdevs/erede-php": "*"
}
}
}

```

Com a dependência adicionada ao `composer.json`, basta executar:

```
```bash
composer install
```

Alternativamente, você pode executar diretamente em seu terminal:

```
composer require "developersrede/erede-php"
```bash
composer require "silbeckdevs/erede-php"
```

# Testes
## Comandos

- Rodar todos os testes e PHPStan `composer test`
- Rodar todos os testes `composer phpunit`
- Testes unitários `composer test:unit`
- Testes integração `composer test:e2e`
- PHPStan `composer phpstan`
- PHP-CS-Fixer verify `composer format:check`
- PHP-CS-Fixer fix `composer format:fix`

## Testes

O SDK utiliza PHPUnit com TestDox para os testes. Para executá-los em ambiente local, você precisa exportar
as variáveis de ambiente `REDE_PV` e `REDE_TOKEN` com suas credenciais da API. Feito isso, basta rodar:

```
```bash
export REDE_PV=1234
export REDE_TOKEN=5678

./tests
```

Os testes também podem ser executados através de um container com a configuração ideal para o projeto. Para isso, basta
fazer:

```
docker build . -t erede-docker
docker run -e REDE_PV='1234' -e REDE_TOKEN='5678' erede-docker
```
````
Caso necessário, o SDK possui a possibilidade de logs de depuração que podem ser utilizados ao executar os testes. Para isso,
basta exportar a variável de ambiente `REDE_DEBUG` com o valor 1:

```
export REDE_DEBUG=1
export REDE_DEBUG=0
```

# Utilizando
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

Expand Down Expand Up @@ -130,6 +123,7 @@ if ($transaction->getReturnCode() == '00') {
```

## Adiciona configuração de parcelamento

```php
<?php
// Configuração da loja em modo produção
Expand Down Expand Up @@ -351,13 +345,13 @@ $transaction = (new Transaction(25, 'pedido' . time()))->debitCard(
// Configura o 3dSecure para autenticação
$transaction->threeDSecure(
new Device(
ColorDepth: 1,
DeviceType3ds: 'BROWSER',
JavaEnabled: false,
Language: 'BR',
ScreenHeight: 500,
ScreenWidth: 500,
TimeZoneOffset: 3
colorDepth: 1,
deviceType3ds: 'BROWSER',
javaEnabled: false,
language: 'BR',
screenHeight: 500,
screenWidth: 500,
timeZoneOffset: 3
)
);
$transaction->addUrl('https://redirecturl.com/3ds/success', Url::THREE_D_SECURE_SUCCESS);
Expand All @@ -369,3 +363,26 @@ if ($transaction->getReturnCode() == '220') {
printf("Redirecione o cliente para \"%s\" para autenticação\n", $transaction->getThreeDSecure()->getUrl());
}
```

## Transação com PIX

```php
<?php
// 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);

if ($transaction->getReturnCode() == '00') {
printf(
"Transação criada com sucesso; tid=%s, qrCodeData=%s, qrCodeImage=%s\n",
$transaction->getTid(), $transaction->getQrCode()->getQrCodeData(), $transaction->getQrCode()->getQrCodeImage()
);
}
```

## 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')`
- 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()`
Loading