const expected='sha256='+crypto.createHmac('sha256',secret).update(rawBody).digest('hex');
expected = "sha256=" + hmac.new(secret, raw, hashlib.sha256).hexdigest()
mac := hmac.New(sha256.New, []byte(secret)); mac.Write(raw)
$expected = 'sha256=' . hash_hmac('sha256', $raw, $secret);
Use comparação constante (timingSafeEqual, compare_digest, hmac.Equal, hash_equals). Em produção: Idempotency-Key estável, assinatura do raw body, webhook_test sem ação, invoice_paid idempotente e alerta para 402 account_not_serviceable.