Visão geral #
Verifique os eventos que o Wooshpay envia para seus endpoints de webhook.
Cabeçalho da assinatura do Wooshpay #
O Wooshpay - Assinatura O cabeçalho incluído em cada evento assinado contém um registro de data e hora e uma assinatura.
O registro de data e hora é prefixado por t=e cada assinatura é prefixada por v1.
Por exemplo:
Wooshpay-Signature:t=1492774577,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4Chave secreta do webhook #
O Wooshpay gera um chave secreta para cada webhook. whsec_
Antes de verificar as assinaturas, você precisa recuperar o segredo do webhook em webhook.secret no objeto webhook.
Verificação de assinaturas #
Ao comparar o assinatura no cabeçalho para o assinatura esperadaVocê pode verificar se o mesmo foi enviado pela Wooshpay e não por terceiros.
Para verificar a assinatura passo a passo, você pode seguir o guia abaixo:
Etapa 1: Extrair o registro de data e hora e as assinaturas do cabeçalho #
Dividir o cabeçalho, usando o , como separador, para obter uma lista de elementos. Em seguida, divida cada elemento, usando o = como separador, para obter um par de prefixo e valor.
O valor do prefixo t corresponde ao registro de data e hora, e v1 corresponde à assinatura. Você pode descartar todos os outros elementos.
Por exemplo:
t=1687845304,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4Etapa 2: Prepare o signed_payload string #
O signed_payload é criada pela concatenação:
- O registro de data e hora (como uma cadeia de caracteres)
- O personagem .
- A carga útil real do JSON (o corpo da solicitação)
Por exemplo:
1687845304+.+Carga útil JSON
1687845304.{
  "id": "evt_1NNUrjL6kclEVx6Mb1x5dKJ3",
  "object": "event" (evento),
  "api_version": "2022-11-15",
  "created" (criado): 1687845303,
  "data": {
    "object": {
      "id": "prod_O9oUVgsSaordCT",
      "object": "product" (produto),
      "active": true,
      "livemode": true,
      "name": "test",
      "type" (tipo): "service" (serviço),
  "livemode": true,
  "pending_webhooks": 1,
  "type": "product.created"
}Etapa 3: Determinar a assinatura esperada #
Calcule um HMAC com a função hash SHA256.
- Use o segredo do webhook do ponto de extremidade como o chaveque você pode obter em webhook.secretno objeto webhook
- Use o signed_payloadcomo a string mensagem que você já preparou na etapa 2.
Por meio do chave + mensagemvocê pode calcular uma string HMAC, que é assinatura esperada
Por exemplo:
 public static void main(String[] args) {
        String webhookSecret = "whsec_261V2mfsXt1BsOjJbHaQOxnTzhWZKrUE";
        String timestamp = "1687845304";
        String requestBody = "{\"id\":\"evt_1NNUrjL6kclEVx6Mb1x5dKJ3\",\"object\":\"event\",\"api_version\":\"2022-11-15\",\"created\":1687845303,\"data\":{\"object\":{\"id\":\"prod_O9oUVgsSaordCT\",\"object\":\"product\",\"active\":true,\"livemode\":true,\"name\":\"test\",\"type\":\"service\",\"livemode\":true,\"pending_webhooks\":1,\"type\":\"product.created\"}";
        String signedPayload = timestamp+". "+requestBody;
        String signature = hmacSha256(webhookSecret,signedPayload);
        String WooshpaySignature = "t="+timestamp+",v1="+signature;
    }
    /**
     * HMAC-SHA256
     */
    public static String hmacSha256(String secret, String message) {
        String res;
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
            mac.init(secretKey);
            byte[] hash = mac.doFinal(message.getBytes());
            res = Hex.encodeHexString(hash);
        } catch (Exception e) {
            return null;
        }
        return res;
    }Etapa 4: Comparar as assinaturas #
Compare o assinatura no cabeçalho para o assinatura esperada.
Para uma correspondência de igualdade, calcule a diferença entre os valores carimbo de data/hora atual e o carimbo de data/hora recebidoe, em seguida, decida se a diferença está dentro de sua tolerância.
Para se proteger contra ataques de tempo, você pode usar uma comparação de cadeia de caracteres em tempo constante para comparar a assinatura esperada com cada uma das assinaturas recebidas.
