Merged
Conversation
Danielen Cestari Nunes (danielen-meli)
approved these changes
Nov 27, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implementação de Suporte a 3DS (3D Secure) em Orders
🔍 Processo de Descoberta e Implementação
Esta seção documenta o passo a passo completo para implementar novas features no SDK PHP, servindo como guia para futuras implementações.
1. Monitoramento de Mudanças
Neste caso: Foi anunciada a feature de 3DS (3D Secure) para Orders.
2. Verificação no Fury Spec Hub
O que fazer:
Neste caso:
Exemplo identificado: "POST /v1/orders - Online with 3DS"
Nós do JSON identificados:
{ "config": { "online": { "transaction_security": { "validation": "on_fraud_risk", "liability_shift": "required" } } } }3. Análise da Spec e Exemplos
O que analisar no swagger:
Neste caso:
Request: Campos adicionados em
config.online.transaction_securityResponse: Campo
transaction_securityadicionado empayment_method4. Verificação na SDK
Passos:
Neste caso:
src/MercadoPago/Resources/Order/OnlineConfig.php- não tinhatransaction_securitysrc/MercadoPago/Resources/Order/PaymentMethod.php- não tinhatransaction_securityexamples/Order/- não havia exemplo de 3DS5. Mapeamento para Estrutura do SDK PHP
5.1 Entendendo a Estrutura de Pastas
Diferença importante do SDK PHP:
Mapperpara deserialização5.2 Mapeamento JSON → Classes PHP
Regra geral:
Resources/Mapperpara mapeamento automáticoExemplo deste caso:
6. Como Funciona o Sistema de Serialização
6.1 O Trait
MapperO SDK PHP usa o trait
Mapperpara deserialização automática de JSON para objetos PHP:Como funciona:
Serializerpercorre os dados$mapda classeExemplo prático:
Quando o JSON contém:
{ "transaction_security": { "validation": "on_fraud_risk", "liability_shift": "required" } }O
Serializerautomaticamente:transaction_securityestá no$mapTransactionSecurity$validatione$liability_shift$transaction_security6.2 Tipos de Propriedades
Tipos permitidos:
?string- Strings opcionais?int- Inteiros opcionais?array- Arrays simples (lista)array|object|null- Objetos aninhados (requer mapeamento)?bool- BooleanosQuando usar
array|object|null:Mappertransforme o array JSON em objeto PHP7. Implementação das Classes
7.1 Classe TransactionSecurity
Arquivo:
src/MercadoPago/Resources/Order/TransactionSecurity.phpPontos importantes:
MercadoPago\Resources\Orderuse Mapperpara permitir deserializaçãourlapenas na resposta (não no request)getMap()retorna array vazio porque não tem objetos aninhados7.2 Atualização de OnlineConfig
Arquivo:
src/MercadoPago/Resources/Order/OnlineConfig.phpO que foi feito:
$transaction_security$mapMapperagora sabe como deserializar quando vier no JSON7.3 Atualização de PaymentMethod
Arquivo:
src/MercadoPago/Resources/Order/PaymentMethod.phpO que foi feito:
use Mapper(não tinha antes)$transaction_security$mapcom mapeamentogetMap()(obrigatório quando usaMapper)Importante: A mesma classe
TransactionSecurityé usada tanto no request (viaOnlineConfig) quanto na response (viaPaymentMethod). A diferença é que na response também vem o campourl.8. Criação de Exemplos
Arquivo:
examples/Order/CreateOrderWith3DS.phpO que incluir:
Estrutura padrão dos exemplos:
Exemplo completo com 3DS:
O exemplo criado mostra:
9. Estrutura Completa do SDK (Resumo)
Fluxo de uma chamada:
OrderClient->create($request)Mapper$order->transactions->payments[0]->payment_method->transaction_security->url10. Diferenças Importantes: Request vs Response
Request (Array Associativo):
Response (Objetos PHP):
Mapperfaz conversão automática de JSON para objetos🎯 Objetivo
Permitir que integradores implementem autenticação 3DS em suas transações através do SDK PHP, com:
validation)liability_shift)🔧 Alterações Técnicas
Arquivos Modificados
1.
src/MercadoPago/Resources/Order/OnlineConfig.php$transaction_securitydo tipoarray|object|null$mapparaTransactionSecurityconfig.online.transaction_securitydo request2.
src/MercadoPago/Resources/Order/PaymentMethod.phpuse Mapper(não tinha antes)$transaction_securitydo tipoarray|object|null$mapcom mapeamento paraTransactionSecuritygetMap()(obrigatório quando usaMapper)Novos Arquivos Criados
3.
src/MercadoPago/Resources/Order/TransactionSecurity.phpClasse para representar
transaction_securitytanto no request quanto na response.4.
examples/Order/CreateOrderWith3DS.phpExemplo completo mostrando:
status = "action_required"🔄 Fluxo de Integração
1. Request com 3DS
2. Processamento da Resposta
Sem Challenge:
Com Challenge:
3. Valores Disponíveis
Campo
validation:"on_fraud_risk": 3DS será exigido dependendo do risco da transação (recomendado)"always": Sempre executar 3DS"never": Nunca executar 3DS (padrão)Campo
liability_shift:"required": A responsabilidade financeira em caso de chargeback é da bandeira"preferred": Preferencial mas não obrigatório4. Status Possíveis
processedaccreditedfailedfailedaction_requiredpending_challengefailedcc_rejected_3ds_challenge*cancelledexpiredPara que seja possivel criar uma nova versão com os ajustes que fizemos, devemos fazer um bump da versão após mergearmos as nossas mudanças. Segue pr de exemplo #577