Webhook-Signaturen prüfen
July 30, 2026
Prüfen Sie die Echtheit von FlowAlp Pay Webhooks: HMAC-SHA256-Signaturprüfung in PHP, ApiSignature-Muster und Credential-Test per SignatureCheck.
Ein Webhook-Endpoint ist eine Tür in Ihr Bestellsystem — jedes eingehende Event muss beweisen, dass es wirklich von FlowAlp Pay stammt. Zwei Mechanismen greifen ineinander: der Signatur-Header auf dem Webhook selbst und die serverseitige Validierung gegen die Merchant API.
So funktioniert die Webhook-Signatur
Jeder Webhook trägt den HTTP-Header X-Webhook-Signature. Sein Wert ist ein HMAC-SHA256 über den rohen Request-Body mit Ihrem Signing Key, kodiert als Hexadezimal in Kleinbuchstaben. Drei Details sind entscheidend:
- Signierte Daten: der rohe, unveränderte Request-Body — serialisieren Sie das geparste JSON vor dem Hashen niemals neu.
- Schlüssel-Kodierung: der Signing Key wird als einfacher UTF-8-String verwendet, nicht zuerst Base64-dekodiert.
- Signatur-Kodierung: das Ergebnis ist Hex in Kleinbuchstaben — nicht Base64.
Der Signing Key gehört zu Ihrer Webhook-Konfiguration im Dashboard unter https://pay.flowalp.com. Zeigen Ihre Webhook-Einstellungen keinen Signing Key an, raten Sie keine Header-Namen oder Schlüssel: Nutzen Sie die unten beschriebene API-seitige Validierung und klären Sie die Verfügbarkeit der Signatur für Ihren Account vor dem Go-live mit dem FlowAlp Support.
<?php
// Reject any webhook whose signature does not match
$rawBody = file_get_contents('php://input');
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$signingKey = getenv('FLOWALP_WEBHOOK_SIGNING_KEY');
// Lowercase hex HMAC-SHA256 of the raw body; the key is a plain UTF-8 string
$expected = hash_hmac('sha256', $rawBody, $signingKey);
if (!hash_equals($expected, $received)) {
http_response_code(401); // non-2xx: the delivery counts as failed
exit('invalid signature');
}
http_response_code(200);
// Queue the event for asynchronous, idempotent processingVerwenden Sie hash_equals() (bzw. den Konstantzeit-Vergleich Ihrer Sprache) gegen Timing-Angriffe und beantworten Sie unsignierte oder ungültige Zustellungen mit einem Nicht-2xx-Status wie 401 — verarbeiten Sie sie niemals.
Nicht mit ApiSignature verwechseln
Die Merchant API kennt einen zweiten, davon unabhängigen HMAC: den Authentifizierungsmodus ApiSignature für ausgehende API-Anfragen. Halten Sie beide auseinander:
| Aspekt | Webhook-Signatur | ApiSignature |
|---|---|---|
| Was signiert wird | Roher POST-Body des eingehenden Webhooks | URL-kodierte, alphabetisch sortierte Request-Parameter (alle ausser instance) |
| Schlüssel | Webhook Signing Key | Ihr API Secret |
| Kodierung | Hexadezimal, Kleinbuchstaben | Base64 |
| Transportweg | X-Webhook-Signature-Header, eingehend | ApiSignature-Parameter, ausgehend |
<?php
function flowalpApiSignature(array $params, string $apiSecret): string
{
ksort($params);
$query = http_build_query($params, '', '&');
return base64_encode(hash_hmac('sha256', $query, $apiSecret, true));
}Die genauen Kodierungsregeln für ApiSignature finden Sie in der Merchant-API-Authentifizierung.
Credentials mit SignatureCheck validieren
Die Ressource SignatureCheck prüft Instanzname, API Secret und — im Signaturmodus — Ihre HMAC-Implementierung, ohne etwas zu erzeugen. Rufen Sie sie beim Setup und aus Health-Checks auf:
https://api.pay.flowalp.com/v1.16/SignatureCheck/v1.14 · v1.15 · v1.16<?php
use FlowAlpPay\FlowAlpPay;
use FlowAlpPay\Models\Request\SignatureCheck;
$client = new FlowAlpPay(
getenv('FLOWALP_TENANT'),
getenv('FLOWALP_API_SECRET'),
FlowAlpPay::DEFAULT_COMMUNICATION_HANDLER,
'pay.flowalp.com',
'1.16'
);
try {
$client->getOne(new SignatureCheck());
// Credentials are valid
} catch (\FlowAlpPay\FlowAlpPayException $e) {
// Wrong instance name or API secret
}Details und Fehlermeldungen stehen auf der SignatureCheck-Referenzseite; das Client-Setup erklärt der PHP-SDK-Guide.
Verteidigung in der Tiefe
- Lehnen Sie unsignierte oder ungültige Webhooks mit Nicht-2xx ab und alarmieren Sie bei wiederholten Fehlschlägen.
- Verarbeiten Sie verifizierte Events idempotent — Deduplizierung über Transaktions-ID plus Status.
- Rufen Sie bei geldrelevanten Statuswechseln die Transaktion zusätzlich über die API ab, bevor Sie erfüllen.
- Persistieren Sie das Prüfergebnis neben dem rohen Payload für Audits.
Nächster Schritt: Gehen Sie die Webhook-Payloads durch, die Ihr Handler unterstützen muss, und danach die Go-live-Checkliste.