# Integração Frontend - Split de Pagamentos (Mercado Pago) Este guia descreve como o frontend deve consumir os novos endpoints do BFF para criar preferências de pagamento com **split** no Mercado Pago, permitindo distribuir automaticamente os valores entre múltiplos recebedores. ## Visão Geral O fluxo de split utiliza a rota pública do BFF para criar uma preferência com regras de repasse. O frontend obtém a `init_point` (ou `sandbox_init_point`) e redireciona o usuário para o checkout do Mercado Pago. Após o pagamento, o Mercado Pago se encarrega de transferir os valores conforme as regras de split enviadas. ### Endpoint principal ``` POST /mercadopago/split/preference ``` - **Autenticação**: não requer token (mesma política do endpoint público atual de preferência). - **Objetivo**: criar uma preferência com o campo `transfers` configurado. - **Resposta**: `201 Created` com payload `MercadoPagoPreferenceResponse` contendo `id`, `init_point`, `sandbox_init_point` e demais metadados. ## Payload esperado ```json { "purpose": "wallet_purchase", "external_reference": "pedido-123", "notification_url": "https://bff.saveinmed.com.br/mercadopago/webhook", "items": [ { "id": "consulta-xyz", "title": "Consulta de especialidade", "quantity": 1, "unit_price": 120.0, "currency_id": "BRL" } ], "payer": { "email": "paciente@example.com", "name": "Paciente", "surname": "Teste" }, "back_urls": { "success": "https://app.saveinmed.com.br/pagamentos/sucesso", "failure": "https://app.saveinmed.com.br/pagamentos/erro", "pending": "https://app.saveinmed.com.br/pagamentos/pendente" }, "transfers": [ { "collector_id": 11223344, "amount": 20.0, "description": "Comissão da clínica" }, { "collector_id": 99887766, "percentage": 50.0, "description": "Participação do especialista" } ], "marketplace_fee": 5.0, "metadata": { "pedidoId": "123", "tipo": "consulta" } } ``` ### Campos importantes - `purpose`: deve permanecer como `wallet_purchase` (o backend já força este valor por padrão). - `transfers`: lista com as regras de split. - Cada item aceita **apenas um** dos campos `amount` (valor absoluto) ou `percentage` (percentual do total), além do `collector_id` do recebedor. - `marketplace_fee` (opcional): taxa em reais destinada ao marketplace SaveinMed. - `metadata` (opcional): dados auxiliares que serão devolvidos nos webhooks. ## Fluxo recomendado no frontend 1. **Montagem do payload**: coletar os itens, dados do pagador e regras de split (definidas conforme negócio) e montar o corpo seguindo o formato acima. 2. **Chamada HTTP**: enviar `POST` para `/mercadopago/split/preference` com `Content-Type: application/json`. 3. **Tratamento de resposta**: - Em caso de sucesso (`201`), redirecionar o usuário para `init_point` (produção) ou `sandbox_init_point` (sandbox). - Em caso de erro (`400`), exibir feedback ao usuário com base na mensagem `detail` retornada. 4. **Monitoramento**: os webhooks continuarão chegando na rota `/mercadopago/webhook`. Utilize `external_reference`/`metadata` para reconciliar o pagamento no frontend após confirmação. ## Validações aplicadas pelo backend - Ao menos uma regra em `transfers` é obrigatória. - Cada regra precisa de `collector_id` e **exatamente um** entre `amount` ou `percentage`. - O backend adiciona expiração padrão de 24 horas e garante `purpose = wallet_purchase`. ## Considerações adicionais - Para ambiente de sandbox, utilize contas de teste do Mercado Pago e confira se o `collector_id` corresponde aos usuários secundários habilitados para split. - Guarde o `id` da preferência para possíveis consultas posteriores (`GET /mercadopago/payment/{payment_id}` após webhook). - Ajuste as URLs de redirecionamento (`back_urls`) conforme fluxo de UX desejado. Qualquer dúvida adicional sobre os campos suportados pode ser sanada consultando a [documentação oficial do Mercado Pago - Split de Pagamentos](https://www.mercadopago.com.br/developers/pt/docs/marketplace/split-payouts/introduction).