Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2ad75f5
WIP: set 3DS together with aintfraud
willian-hf-rodrigues Feb 4, 2026
261b703
WIP
willian-hf-rodrigues Feb 4, 2026
abd082d
WIP
willian-hf-rodrigues Feb 4, 2026
712ece8
WIP
willian-hf-rodrigues Feb 4, 2026
c5ed9f2
fix: update get quantity item cart
willian-hf-rodrigues Feb 4, 2026
e21c86a
WIP
willian-hf-rodrigues Feb 9, 2026
0a29671
WIP
willian-hf-rodrigues Feb 9, 2026
b28788b
WIP
willian-hf-rodrigues Feb 9, 2026
20fdcef
WIP
willian-hf-rodrigues Feb 9, 2026
5e7c943
WIP
willian-hf-rodrigues Feb 9, 2026
eefd013
WIP
willian-hf-rodrigues Feb 10, 2026
e7991ab
clean: remove spaces unused into code
willian-hf-rodrigues Feb 20, 2026
5d12cce
text: change refs to 3DS 2.0
willian-hf-rodrigues Feb 26, 2026
a37acd1
clean: remove logs into code
willian-hf-rodrigues Feb 26, 2026
e1aaab9
Merge pull request #117 from devellop-labs/hotfix/3DS-antifraud-together
willian-hf-rodrigues Feb 26, 2026
68157cb
Add code review instructions for WordPress/WooCommerce
willian-hf-rodrigues Feb 26, 2026
9e2fd7f
Merge pull request #118 from devellop-labs/agent-cr-copilot
willian-hf-rodrigues Feb 26, 2026
80b20fb
fix: update regex recognition flag credit & debit card
willian-hf-rodrigues Mar 2, 2026
2ee0007
Update assets/js/braspag.js
willian-hf-rodrigues Mar 2, 2026
4016125
Update assets/js/braspag.js
willian-hf-rodrigues Mar 2, 2026
b5a3573
Merge pull request #119 from devellop-labs/hotfix/error-recognition-flag
willian-hf-rodrigues Mar 2, 2026
3ede049
Update version number to 2.3.5.41
willian-hf-rodrigues Mar 4, 2026
6c5e248
Update Braspag Plugin version and 3DS authentication details
willian-hf-rodrigues Mar 4, 2026
65ab913
Update 3DS authentication version to 2.2
willian-hf-rodrigues Mar 4, 2026
8074c34
Update changelog for version 2.3.5.41
willian-hf-rodrigues Mar 4, 2026
ad0ff65
Merge branch 'staging' into docs-version-chancelog
willian-hf-rodrigues Mar 4, 2026
53f26f1
Merge pull request #126 from devellop-labs/docs-version-chancelog
willian-hf-rodrigues Mar 4, 2026
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
148 changes: 148 additions & 0 deletions .github/instructions/*.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
---
applyTo: "**/*.php,**/*.inc,**/*.phtml"
excludeAgent: "coding-agent"
---

# Copilot Code Review Instructions (WordPress + WooCommerce + PHP 8)

Você é um revisor de PRs para um repositório de plugins WordPress/WooCommerce em PHP 8.
Seu objetivo é encontrar problemas reais (bugs, segurança, performance, compatibilidade e padrões do ecossistema) e sugerir correções com alta chance de aprovação.

## Prioridades (ordem)
1) Segurança e integridade de dados
2) Bugs funcionais / regressões
3) Performance e escalabilidade (DB, hooks, requests, assets)
4) Padrões WordPress/WooCommerce (plugin conventions, APIs, hooks)
5) Qualidade de código (clareza, manutenção, testes, legibilidade)

## Como escrever seus comentários
- Classifique cada ponto como: **[BLOCKER] [HIGH] [MED] [LOW]**
- Sempre cite o **arquivo + trecho** (função/método/linha aproximada) e explique o impacto.
- Quando possível, inclua **patch sugerido** (trecho de código) e uma alternativa simples.
- Evite bikeshedding: estilo só importa se afetar segurança, compatibilidade, DX ou manutenção.
- Se um ponto depende do “contexto do produto”, faça a pergunta, mas ainda assim proponha um padrão seguro.

---

# 1) Padrões WordPress (Plugin)
## 1.1 Segurança (obrigatório)
### Entrada → Validar + Sanitizar
- Nunca confie em `$_GET`, `$_POST`, `$_REQUEST`, `$_COOKIE`, headers, payload REST, dados de DB ou APIs externas.
- **Valide tipo/forma** (ex.: `is_string`, `is_numeric`, `absint`, whitelist) e **sanitize** antes de salvar/usar.
- Lembre do `wp_unslash()` ao ler `$_POST/$_GET` em contextos onde o WP aplicou slashes.

### Saída → Escapar sempre (escape late)
- Qualquer dado vindo de usuário/DB/API deve ser escapado na saída:
- HTML: `esc_html()`
- Atributo: `esc_attr()`
- URL: `esc_url()`
- HTML permitido: `wp_kses()` / `wp_kses_post()`
- JS inline: `esc_js()` (e preferir evitar inline)
- Strings traduzíveis também devem ser escapadas (ex.: `esc_html__()` / `esc_attr__()`).

### Nonce + Capability (CSRF e autorização)
- Para qualquer ação que altera estado (CRUD, settings, AJAX, admin-post, endpoints):
- **Nonce**: `check_admin_referer()` / `check_ajax_referer()` / `wp_verify_nonce()`
- **Capability**: `current_user_can()` (nonce não é autorização)
- Em REST API: exigir `permission_callback` correto e validar payload.

### SQL / DB
- Proibido concatenar input em SQL.
- Sempre usar `$wpdb->prepare()` com placeholders (`%d %f %s` e `%i` quando aplicável).
- Cuidado com LIKE: usar `$wpdb->esc_like()` e passar o wildcard via argumento.
- Não aceitar “partes da query” vindas do usuário (tabela/coluna/order by) sem whitelist.

### Arquivos / Includes
- Evitar includes dinâmicos com input.
- Validar caminhos, usar paths conhecidos do plugin, negar traversal.
- Se lidar com upload: validar mime/extensão, usar APIs WP.

## 1.2 Convenções de plugin
- Prefixar funções, hooks, constants, option keys, meta keys, transient keys com o prefixo do plugin.
- Evitar colisões de nomes (especialmente funções globais).
- Hooks: declarar callback e depois registrar `add_action/add_filter` (padrão comum do ecossistema).
- Não criar “god class”: preferir classes coesas e responsabilidades claras.
- Admin pages/Settings: usar Settings API quando fizer sentido; validar/sanitizar tudo.

## 1.3 Padrão de código (WPCS)
- Seguir WordPress Coding Standards para PHP:
- visibilidade sempre explícita
- evitar shorthand tags
- práticas seguras (não é só estilo)
- Se o repo usa PHPCS/WPCS, a review deve exigir que o PR **não quebre** esses checks.

---

# 2) Padrões WooCommerce (Plugin)
## 2.1 CRUD e compatibilidade
- Preferir **CRUD objects** do WooCommerce para entidades (orders/products/customers) em vez de manipular post/meta direto quando existir API.
- Evitar bypass de camada de dados (especialmente em Orders) porque pode quebrar compatibilidade e caches internos.
- Para Orders/HPOS e caching: evitar mexer direto em tabelas/meta sem usar a API adequada.

## 2.2 Segurança específica Woo
- Em endpoints/admin actions que mudam dados de pedido:
- capability + nonce
- validação de IDs (absint) e ownership quando aplicável
- Não expor dados sensíveis (order notes privadas, tokens, PII) em responses, logs ou HTML.

## 2.3 Performance específica Woo
- Não carregar assets do plugin em todas as páginas. Enfileirar scripts/styles **condicionalmente**.
- Evitar queries em loops e N+1:
- buscar em batch quando possível
- limitar campos e resultados
- Ser compatível com caching (não limpar caches de forma agressiva sem motivo).

---

# 3) PHP 8 (boas práticas)
## 3.1 Segurança
- Senhas: usar `password_hash()` e `password_verify()` (nada de hash caseiro).
- SQL: prepared statements (quando fora do WPDB) e nunca interpolar variável.
- Validar tipos e tratar exceções:
- PHP 8 levanta mais TypeError/ValueError em situações antes “silenciosas”.
- Não vazar dados sensíveis em logs/exceptions (PII, tokens).

## 3.2 Qualidade e compatibilidade
- Declarar tipos onde fizer sentido, sem “quebrar” convenções WP (muitos plugins ainda são flexíveis).
- Evitar `@` (error suppression).
- Cuidado com `json_decode()` (checar erro, tipo retornado).
- Em arrays/strings, evitar notices/warnings com checks explícitos.

---

# 4) Checklist do Review (use como roteiro)
## [BLOCKER] Segurança
- Falta de escape/sanitize/validate em qualquer caminho de input/output?
- Falta de nonce/capability em ações mutáveis?
- SQL injection possível (query montada, placeholders errados, ORDER BY sem whitelist)?
- XSS possível (echo de dados sem escaper correto)?
- SSRF/file inclusion/path traversal?
- Vazamento de PII/tokens em HTML/logs/responses?

## [HIGH] Performance / Escala
- Hooks pesados em `init`, `wp_loaded`, `the_content`, `woocommerce_*` sem cache?
- Queries em loop / N+1 / sem índices / sem LIMIT?
- Assets carregando em todas as páginas?
- Chamadas remotas sem timeout/retry/backoff ou sem cache?

## [MED] Padrões WP/Woo
- Uso incorreto de APIs WP/Woo (ex.: bypass de CRUD quando existe)?
- Prefixos ausentes (risco de conflito)?
- i18n: strings sem text domain / sem funções de tradução?

## [LOW] Manutenibilidade
- Código confuso, nomes ruins, duplicação, responsabilidades misturadas.
- Falta de testes onde o repo exige.
- Comentários desnecessários ou “clever code”.

---

# 5) Regras de ouro para sugestões
- Sugira sempre o caminho mais “WordPress way”:
- sanitize/escape com funções WP
- nonces e capabilities
- `$wpdb->prepare()`
- APIs Woo (CRUD) quando aplicável
- Se você não tiver certeza, **assuma o mais seguro** e peça ajuste do autor do PR.

Fim.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ _Funcionalidades_
- Checkout Card View
- Authorize Only
- Authorize and Capture
- Authentication 3DS 2.0
- Authentication 3DS 2.2 (Exceto cartões Elo e Amex)
- Anti Fraud
- Credit Card Token

Expand All @@ -122,7 +122,7 @@ _Funcionalidades_

_Funcionalidades_

- Authenticate 3DS 2.0
- Authenticate 3DS 2.2 (Exceto cartões Elo e Amex)
- Checkout Card View

#### Boleto
Expand Down
12 changes: 6 additions & 6 deletions assets/js/braspag.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var braspagDefaultCardRegexFormat = /(\d{1,4})/g;
var braspagCards = [
{
type: 'naranja-nevada',
typeTitle: 'Naranja e Nevada',
typeName: 'Naranja e Nevada',
patterns: [5895],
regex_include: '^(589562)',
regex_exclude: '',
Expand All @@ -16,9 +16,9 @@ var braspagCards = [
luhn: true
}, {
type: 'elo',
typeTitle: 'Elo',
patterns: [6363, 4389, 5041, 4514, 6362, 5067, 4576, 4011],
regex_include: '',
typeName: 'Elo',
patterns: [6363, 4389, 5041, 4514, 6362, 5067, 4576],
regex_include: '^(40117[89]|431274|438935|451416|457393|45763[12]|504175|506(699|7[0-6][0-9]|77[0-8])|509[0-9]{3}|636297|636368|6500(31|33|3[5-9]|4[0-9]|5[01])|6504(0[5-9]|[1-3][0-9])|650(48[5-9]|49[0-9]|5[0-2][0-9]|53[0-8])|650(54[1-9]|5[5-8][0-9]|59[0-8])|650(70[0-9]|71[0-8])|65072[0-7]|650(90[1-9]|91[0-9]|920)|651(65[2-9]|6[6-7][0-9])|6550[01][0-9]|655(02[1-9]|0[3-4][0-9]|05[0-8]))',
regex_exclude: '',
format: braspagDefaultCardRegexFormat,
length: [16],
Expand Down Expand Up @@ -98,8 +98,8 @@ var braspagCards = [
type: 'discover',
typeName: 'Discover',
patterns: [6011, 622, 64, 65],
regex_include: '',
regex_exclude: '',
regex_include: '^(6011|65|64[4-9]|622)',
regex_exclude: '^(6500(31|33|3[5-9]|4[0-9]|5[01])|6504(0[5-9]|[1-3][0-9])|650(48[5-9]|49[0-9]|5[0-2][0-9]|53[0-8])|650(54[1-9]|5[5-8][0-9]|59[0-8])|650(70[0-9]|71[0-8])|65072[0-7]|650(90[1-9]|91[0-9]|920)|651(65[2-9]|6[6-7][0-9])|6550[01][0-9]|655(02[1-9]|0[3-4][0-9]|05[0-8]))',
format: braspagDefaultCardRegexFormat,
length: [16],
cvcLength: [3],
Expand Down
10 changes: 10 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,13 @@

= 2.3.5.40 - 2026-01-28 =
* Hotfix when send hostname to 3DS in WP new version

= 2.3.5.41 - 2026-01-28 =
* Added default case for unhandled failure types.
* We changed the condition for providers other than Cielo.
* Added early return when appendMpi
* Updated the 3DS authentication version from 2.0 to 2.2
* Add into documentation indicating that Elo and Amex cards are not supported.
* Fixed a critical bug where the quantity of items in the cart was accessed as an object property instead of an array element.
* Enabled the execution of anti-fraud analysis simultaneously with 3DS authentication.
* Validation logic with handling of 3DS failure and error cases.
14 changes: 7 additions & 7 deletions includes/admin/braspag-creditcard-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,55 +106,55 @@
'options' => wc_get_order_statuses()
),
'auth3ds20' => array(
'title' => "<hr>" . __('Authentication 3DS 2.0 for Credit Card', 'woocommerce-braspag'),
'title' => "<hr>" . __('Authentication 3DS 2.2 for Credit Card', 'woocommerce-braspag'),
'type' => 'title',
'description' => '',
),
'auth3ds20_mpi_is_active' => array(
'title' => __('Enable', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 for Credit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 for Credit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_mastercard_notify_only' => array(
'title' => __('MasterCard Notify Only', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 MasterCard Notify Only for Credit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 MasterCard Notify Only for Credit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_error' => array(
'title' => __('Authorization On Error', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Error for Credit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Error for Credit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_failure' => array(
'title' => __('Authorization On Failure', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Failure for Credit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Failure for Credit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_unenrolled' => array(
'title' => __('Authorization On Unenrolled', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Unenrolled for Credit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Unenrolled for Credit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_unsupported_brand' => array(
'title' => __('Authorization On Unsupported Brand', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Unsupported Brand for Credit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Unsupported Brand for Credit Card.',
'default' => 'no',
'desc_tip' => true,
)
Expand Down
14 changes: 7 additions & 7 deletions includes/admin/braspag-debitcard-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,55 +70,55 @@
'desc_tip' => false,
),
'auth3ds20' => array(
'title' => "<hr>" . __('Authentication 3DS 2.0 for Debit Card', 'woocommerce-braspag'),
'title' => "<hr>" . __('Authentication 3DS 2.2 for Debit Card', 'woocommerce-braspag'),
'type' => 'title',
'description' => '',
),
'auth3ds20_mpi_is_active' => array(
'title' => __('Enable', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 for Debit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 for Debit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_mastercard_notify_only' => array(
'title' => __('MasterCard Notify Only', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 MasterCard Notify Only for Debit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 MasterCard Notify Only for Debit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_error' => array(
'title' => __('Authorization On Error', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Error for Debit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Error for Debit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_failure' => array(
'title' => __('Authorization On Failure', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Failure for Debit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Failure for Debit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_unenrolled' => array(
'title' => __('Authorization On Unenrolled', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Unenrolled for Debit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Unenrolled for Debit Card.',
'default' => 'no',
'desc_tip' => true,
),
'auth3ds20_mpi_authorize_on_unsupported_brand' => array(
'title' => __('Authorization On Unsupported Brand', 'woocommerce-braspag'),
'label' => __('Enable', 'woocommerce-braspag'),
'type' => 'checkbox',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.0 Authorization On Unsupported Brand for Debit Card.',
'description' => 'Choose whether you wish to enable Authentication 3ds 2.2 Authorization On Unsupported Brand for Debit Card.',
'default' => 'no',
'desc_tip' => true,
)
Expand Down
6 changes: 3 additions & 3 deletions includes/admin/braspag-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -300,21 +300,21 @@
'desc_tip' => true,
),
'auth3ds20' => array(
'title' => "<hr>" . __('Authentication 3DS 2.0', 'woocommerce-braspag'),
'title' => "<hr>" . __('Authentication 3DS 2.2', 'woocommerce-braspag'),
'type' => 'title',
'description' => '',
),
'auth3ds20_oauth_authentication_client_id' => array(
'title' => __('Client ID', 'woocommerce-braspag'),
'type' => 'text',
'description' => __('Get your Authentication 3DS 2.0 OAuth Client ID from Braspag Support.', 'woocommerce-braspag'),
'description' => __('Get your Authentication 3DS 2.2 OAuth Client ID from Braspag Support.', 'woocommerce-braspag'),
'default' => '',
'desc_tip' => true,
),
'auth3ds20_oauth_authentication_client_secret' => array(
'title' => __('Client Secret', 'woocommerce-braspag'),
'type' => 'text',
'description' => __('Get your Authentication 3DS 2.0 Client Secret from Braspag Support.', 'woocommerce-braspag'),
'description' => __('Get your Authentication 3DS 2.2 Client Secret from Braspag Support.', 'woocommerce-braspag'),
'default' => '',
'desc_tip' => true,
)
Expand Down
2 changes: 1 addition & 1 deletion includes/class-wc-gateway-braspag.php
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ public function get_braspag_auth3ds20_elements($fields)
<input type="hidden" class="bpmpi_currency" value="BRL"/>
<input type="hidden" class="bpmpi_ordernumber" value="' . (WC()->cart->get_cart_hash()) . '"/>
<input type="hidden" class="bpmpi_transaction_mode" value=""/>
<input type="hidden" class="bpmpi_merchant_url" value="' . wp_parse_url( home_url(), PHP_URL_HOST ) . '"/>
<input type="hidden" class="bpmpi_merchant_url" value="' . wp_parse_url(home_url(), PHP_URL_HOST) . '"/>
</div>

<div id="bpmpi_data_billto">
Expand Down
Loading