Pagsmile ES
  • Introducción
  • Referencia
  • API Payin
    • Ambientes
    • Checkout "todo-en-uno"
      • Página Checkout (General)
      • Página Checkout (E-com)
    • Integración Directa
      • Brasil
        • Tarjeta de Crédito
        • Pix
        • Lottery
        • Boleto
        • Depósito Express
        • Wallet
      • México
        • SPEI
        • CoDi
        • OXXO
        • OXXOPay
        • Efectivo
        • Wallet
      • Colombia
        • PSE
        • Efecty
        • SuRed
        • Gana
        • Baloto
        • Wallet
      • Chile
        • Khipu
        • Transferencia Bancaria
        • Wallet
      • Perú
        • PagoEfectivo
        • Transferencia Bancaria
        • Efectivo
      • Ecuador
        • Transferencia Bancaria
        • Efectivo
      • Guatemala
        • Transferencia Bancaria
        • Efectivo
      • Costa Rica
        • Transferencia Bancaria
        • Efectivo
      • Panamá
        • Efectivo
      • El Salvador
        • Efectivo
      • Rusia
        • Wallet
      • Saudi Arabia
        • Tarjeta de Crédito
      • Kuwait
        • Tarjeta de Crédito
      • Qatar
        • Tarjeta de Crédito
      • Omán
        • Tarjeta de Crédito
      • Emiratos Árabes Unidos
        • Tarjeta de Crédito
      • Bahrain
        • Tarjeta de Crédito
    • Notificaciones
      • Security
    • Pagos Recurrentes
    • Detalle de Pago
    • Reembolso
    • Plug-in & Herramientas
      • Pagsmile JavaScript
      • Pagsmile SDK
      • Registro de lista de Bancos Disponibles
      • Verificación de Detalle de Cuotas
    • Data
      • Método de Pago
      • Data para pruebas (Sandbox)
      • Estado de Payin
      • Lista de Bancos
        • Bancos en Chile
        • Bancos en Peru
        • Bancos en Ecuador
        • Bancos en Panama
        • Bancos en Costa Rica
        • Bancos en El Salvador
        • Bancos en Guatemala
      • Logos de los métodos
    • Código API
  • Payout API
    • Ambientes
    • Seguridad
    • Enviar un payout
      • Pagsmile Wallet
        • Ejemplo WebView
        • Authorización H5
        • Autorización Nativa de APP
        • Enviar Bonificaciones
      • PayPal
        • Países Disponibles
      • Brasil
        • Pix
        • Transferencia Bancaria
      • Mexico
        • SPEI
      • Chile
        • Wallet
        • Transferencia Bancaria
      • Colombia
        • Wallet
        • Transferencia Bancaria
      • Peru
        • Transferencia Bancaria
        • Regiones en Peru
      • Ecuador
        • Transferencia Bancaria
    • Notificaciones
    • Simulación de Payout
    • Página Checkout
    • Balance de cuenta
    • Status de Payout
    • Lista de Payout
    • Detalle de Payout
    • Métodos de Pago
    • Data para pruebas
    • Códigos de Banco
      • Bancos en Brasil
      • Bancos en Chile
      • Bancos en Colombia
      • Bancos en Ecuador
      • Bancos en Mexico
      • Bancos en Peru
    • Código API
  • OTHER
    • Changelog
Powered by GitBook
On this page
  • Firma
  • Verificando firmas manualmente
  • Ejemplo de códigos de verificación en Java
  1. API Payin
  2. Notificaciones

Security

Pagsmile incluye una firma en el encabezado Pagsmile-Signature de cada evento. Esto le permite verificar que el evento fue enviado por Pagsmile en lugar de un tercero. Puede verificar la firma en

Firma

Verificando firmas manualmente

El contenido aproximado del encabezado Pagsmile-Signature es el siguiente (aquí con salto de línea para facilitar la visualización, el contenido real está todo en una línea):

Pagsmile-Signature:
t=1577808000,
v2=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd

El encabezado Pagsmile-Signature contiene una marca de tiempo y una firma. La marca de tiempo está prefijada por t=, seguida de una marca de tiempo UNIX; la firma tiene el prefijo v2=, seguido del contenido de la firma.

La notificación enviada utiliza el siguiente formato:

Content-Type: application/json
Method: POST
Header: Pagsmile-Signature
Body:
  {
    "trade_no":"",
  	"out_trade_no":"",
  	"out_request_no":"",
  	"app_id":"",
  	"trade_status":"",
  	"amount":"",
  	"method":"",
  	"currency":"",
    "timestamp":""
  }

Step 1 : Extract the timestamp and signatures from the header

Divida el encabezado usando el carácter [,] como separador, para obtener una lista de elementos. Luego, divida cada elemento utilizando el carácter [=] como separador, para obtener un par de prefijos y valores.

El valor del prefijo [t] corresponde a la marca de tiempo y [v2] corresponde a la firma. Puede descartar todos los demás elementos.

Paso 2 : Prepare el RequestBody string original

Obtén todo el contenido en RequestBody. Por favor, preste atención aquí. No utilice la estructura autoconstruida del programa para formatear y/o serializar el contenido de RequestBody. Si tiene requisitos similares, hágalo después de obtener los datos originales para su verificación para evitar la clasificación innecesaria de campos y la adición de caracteres que afectan la firma.

Paso 3 : Determine la firma esperada

Calcule un HMAC con la función hash SHA256. Utilice secretKey get del merchant dashboard como clave (salt) y use el string RequestBody original como mensaje.

Paso 4 : Compare las firmas

Compare la firma en el encabezado con la firma esperada. Para un match de igualdad, calcule la diferencia entre la marca de tiempo actual y la marca de tiempo recibida y, a continuación, decida si la diferencia está dentro de su tolerancia.

Ejemplo de códigos de verificación en Java

String content = JSON.toJSONString(notify); 
String sign = SignHelper.macSha256(content, privateKey());

import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 
import java.nio.charset.StandardCharsets; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 
import java.util.*;

/** 
 * 
 */ 
@Slf4j 
public final class SignHelper{

 /**
  * HMAC with SHA-256
  *
  * @param content 
  * @param salt
  * @return
  */
 public static String macSha256(String content, String salt) {
    StringBuilder result = new StringBuilder();
    try {

        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
        byte[] hash = mac.doFinal(content.getBytes(StandardCharsets.UTF_8));
        for (byte b : hash) {
            result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        }

    } catch (NoSuchAlgorithmException | InvalidKeyException e) {
        e.printStackTrace();
    }
    return result.toString();
 }
}

}

PreviousNotificacionesNextPagos Recurrentes

Last updated 2 years ago