Panoramica #
Verificare gli eventi che Wooshpay invia agli endpoint webhook.
Intestazione della firma Wooshpay #
Il Wooshpay-Firma L'intestazione inclusa in ogni evento firmato contiene un timestamp e una firma.
Il timestamp è preceduto da t=e ogni firma è preceduta da v1.
Ad esempio:
Wooshpay-Signature:t=1492774577,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4Chiave segreta del webhook #
Wooshpay genera un unico chiave segreta per ogni webhook. whsec_
Prima di verificare le firme, è necessario recuperare il segreto del webhook da webhook.secret nell'oggetto webhook.
Verifica delle firme #
Confrontando i valori di firma nell'intestazione al firma previstaÈ possibile verificare che i messaggi siano stati inviati da Wooshpay e non da terzi.
Per verificare la firma passo per passo, potete seguire la guida qui sotto:
Passo 1: Estrarre il timestamp e le firme dall'header #
Dividere l'intestazione, utilizzando l'opzione , come separatore, per ottenere un elenco di elementi. Quindi dividere ogni elemento, utilizzando l'opzione = come separatore, per ottenere una coppia di prefisso e valore.
Il valore del prefisso t corrisponde al timestamp e v1 corrisponde alla firma. Tutti gli altri elementi possono essere scartati.
Ad esempio:
t=1687845304,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4Fase 2: Preparare il carico_firmato stringa #
Il carico_firmato viene creata concatenando le stringhe:
- Il timestamp (come stringa)
- Il personaggio .
- Il payload JSON effettivo (il corpo della richiesta)
Ad esempio:
1687845304+.+Carico utile JSON
1687845304.{
  "id": "evt_1NNUrjL6kclEVx6Mb1x5dKJ3",
  "oggetto": "event",
  "api_version": "2022-11-15",
  "creato": 1687845303,
  "dati": {
    "oggetto": {
      "id": "prod_O9oUVgsSaordCT",
      "oggetto": "product",
      "active": true,
      "livemode": true,
      "nome": "test",
      "tipo": "service",
  "livemode": true,
  "pending_webhooks": 1,
  "tipo": "product.created"
}Fase 3: Determinazione della firma prevista #
Calcolo di un HMAC con la funzione di hash SHA256.
- Usare il segreto del webhook dell'endpoint come parametro chiave, che si può ottenere da webhook.secretnell'oggetto webhook
- Utilizzare il carico_firmatocome stringa messaggio che avete già preparato al punto 2.
Attraverso il chiave + messaggio, è possibile calcolare una stringa HMAC, che è firma prevista
Ad esempio:
 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="+firma";
    }
    /**
     * 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;
    }Fase 4: Confronto delle firme #
Confrontare il firma nell'intestazione al firma prevista.
Per una corrispondenza di uguaglianza, calcolare la differenza tra i valori di data e ora attuali e il timestamp ricevutoPoi decidete se la differenza rientra nella vostra tolleranza.
Per proteggersi dagli attacchi temporali, è possibile utilizzare un confronto di stringhe a tempo costante per confrontare la firma prevista con ciascuna delle firme ricevute.
