Integridad de pagos y Pix
Cómo valida el SDK Pix, boleto, cripto y tarjeta en el checkout y cómo registrar destinatarios confiables.
Además de vigilar los scripts, el SDK comprueba que los datos de pago que ve el cliente sean los de tu tienda: el código Pix copia y pega, la línea digitable del boleto, la dirección cripto y el monto. Esta página explica cómo encuentra esos datos, qué se valida y cómo fijar los destinatarios confiables.
Cómo encuentra el SDK el pago
No hace falta ningún marcado especial. Después de iniciar, el SDK busca códigos de pago en la página:
- en selectores conocidos, como
[data-pix-code],#pix-code,.pix-copia-cola,[data-pix-qr],[data-crypto-address],#crypto-address,.wallet-address,[data-payment-value]y[data-qr-value]; - en todo el texto visible del
<body>que tenga entre 20 y 1.000 caracteres; - en los cambios de la página (por ejemplo, cuando el código Pix se inserta después de que el cliente elige Pix);
- cada 2 segundos, durante el primer minuto, como respaldo.
El código se reconoce por su formato: BRCode de Pix (estándar EMV), línea digitable de boleto (47 o 48 dígitos), direcciones Bitcoin y Ethereum, VPA de UPI y códigos QR EMV de otros países (PayNow, PromptPay, DuitNow, QR Ph, HK FPS, Transferencias 3.0, CoDi y billeteras QR).
El código debe estar en un texto de la página
El SDK lee texto, no el valor de los campos de formulario. Un Pix copia y pega que solo se muestra en
<input readonly value="000201…"> no se detecta, y lo mismo ocurre con un <textarea> completado por
JavaScript. Muestra el código como texto, por ejemplo <div id="pix-code">000201…</div>, o informa el destinatario
con Proteside.registerPaymentPayload().
<div class="pix">
<img src="/qrcode/pedido-1234.png" alt="Código QR Pix" />
<div id="pix-code">00020126580014br.gov.bcb.pix0136…6304ABCD</div>
<button type="button">Copiar código</button>
</div>Validación del pago
La primera lectura válida de cada método en la página se convierte en la referencia de esa carga. A partir de ahí:
- si el texto mostrado cambia a otro código que no coincide con la referencia, el SDK emite el evento de manipulación
del método (
PIX_TAMPERED,BOLETO_TAMPERED,CRYPTO_ADDRESS_SWAP,UPI_TAMPEREDoQR_TAMPERED); - si el contenido copiado al portapapeles es un código distinto de la referencia, el SDK emite
CLIPBOARD_HIJACK; - cuando la lectura es válida, el SDK emite
PAYMENT_VALIDATED, que alimenta la página Integridad de Pagos del dashboard.
PAYMENT_VALIDATED se envía en la primera detección, cuando el código cambia para el mismo destinatario (por ejemplo,
un QR regenerado) y, como máximo, cada 60 segundos mientras el cliente está en la página. El evento nunca lleva el
código ni la clave: solo el método, si el destinatario se verificó y la cantidad de campos.
Tarjeta
El SDK no lee datos de tarjeta. Considera validado un pago con tarjeta cuando:
- encuentra en la página el iframe de un proveedor de pagos conocido (Stripe, Adyen, Braintree, Mercado Pago, Pagar.me, PagBank, Iugu, Cielo y otros) y observa una respuesta exitosa a una solicitud de cobro; o
- encontró el iframe y, en un plazo de 10 minutos, el cliente llega a una página de confirmación con
obrigado,sucesso,thank-you,success,confirmacaouorder-completeen la ruta.
Para que el segundo caso funcione, el snippet también debe estar en la página de confirmación.
Destinatarios confiables (Pix Key Pinning)
Sin una lista de destinatarios, un código de pago manipulado desde la primera vez que se muestra se convertiría en la referencia, y nada parecería estar mal. La lista de destinatarios confiables resuelve esto: el SDK compara el destinatario de cada código con las claves que pertenecen a tu tienda.
Abre Protección del pago
En el dashboard, ve a Ajustes → Protección del pago, sección Destinatarios confiables. Solo los propietarios y administradores pueden registrarlos.
Ingresa el destinatario
Elige el Método (Pix, Bitcoin, Ethereum, UPI o Boleto (banco)), completa la Clave y, si quieres, una Etiqueta.
- Pix: CPF, CNPJ, correo electrónico, teléfono (
+55…) o clave aleatoria. - Boleto: el código del banco emisor (3 dígitos) o la línea digitable completa.
Haz clic en Agregar
El destinatario se guarda al instante y llega al SDK a través de la configuración remota. El dashboard guarda solo el hash SHA-256 y una máscara de la clave.
El SDK recibe solo los hashes. Para comparar, normaliza el destinatario leído en el checkout (correo en minúsculas, teléfono solo con dígitos, boleto por los 3 primeros dígitos) y calcula el mismo hash.
| Situación | Resultado |
|---|---|
| El destinatario del código está en la lista | El código se convierte en la referencia y PAYMENT_VALIDATED sale con el destinatario verificado. El dashboard muestra El destinatario coincide con la lista confiable. |
| El destinatario no está en la lista | El SDK emite el evento de manipulación del método con el motivo "destinatario no confiable" y no acepta el código como referencia. En modo Bloquear, el texto del código se reemplaza por ⚠︎. |
| Ningún destinatario registrado para el método | Sin verificación de destinatario. Solo aplica la comparación con la primera lectura. |
Límites de la neutralización en modo Bloquear
El SDK neutraliza solo el texto que leyó. La imagen del código QR, los campos <input value> y otras copias del
código en la página quedan como están, y un nuevo renderizado del checkout puede restaurar el texto. Trata la alerta
como un incidente aunque el modo Bloquear esté activado.
Limitaciones
- Pix dinámico. Un BRCode dinámico trae una URL de cobro en lugar de la clave del destinatario. Sin clave en el código, no hay verificación de destinatario; sigue aplicando la comparación con la primera lectura.
- Boleto de recaudación (línea de 48 dígitos, de concesionarias y tributos) no tiene código de banco y queda sin verificación de destinatario.
- Pix en un campo de formulario no se lee (consulta el aviso al principio de esta página).
- Billeteras QR y pagos instantáneos de otros países se reconocen y se validan, pero no admiten destinatarios registrados.
Monto esperado y destinatario de la sesión
Si tu checkout conoce el monto y la clave del pedido, infórmalos al SDK con
Proteside.expectPayment():
// Antes de mostrar el código Pix del pedido
Proteside.expectPayment({ method: 'pix', amount: '19,90', key: 'pix@mitienda.com' })amounthabilitaAMOUNT_TAMPERED: si el monto del código es distinto del esperado, el SDK alerta. Acepta19.9,'19,90'o'R$ 19,90', comparados con dos decimales.keyagrega un destinatario confiable solo para esta página. Solo el hash queda en memoria.
Llama a expectPayment antes de que el código aparezca en la página y solo después de que el SDK termine de
iniciar. Consulta cómo esperar al SDK.
Métodos de pago
En Protección del pago → Métodos de pago marcas los métodos que ofrece la tienda. En el navegador, esa lista solo
define lo que aparece en getStatus().paymentMethodsMonitored y cuándo el SDK deja de buscar códigos.
Desmarcar un método no desactiva la detección
La pantalla dice que desmarcar métodos reduce el ruido y que, sin ningún método marcado, la verificación quedará desactivada. En el código, el SDK reconoce y valida todos los métodos, estén marcados o no, y una lista vacía se trata como Pix y tarjeta.
Páginas de pago
Las páginas de pago (patrones de URL, con modo y métodos por página) se registran mediante la API, no desde el dashboard. Sirven para contar los pageviews de páginas de pago en el uso del plan y para los reportes de cumplimiento.
El modo y los métodos definidos por página no llegan al SDK. El SDK funciona igual en todas las páginas en las que esté el snippet, con el modo y los métodos de la tienda.
En el dashboard
La página Integridad de Pagos muestra una tarjeta por método con el estado SIN CONFIGURAR, ESPERANDO (todavía no se observó ningún pago), INTACTO o MANIPULADO, y la situación del destinatario. Consulta Integridad de pagos.