python/examples/webhook_receiver.py
Stefan Schmidt-Egermann fa81aba944
feat: initial python content (v0.1.0)
- Installierbares Package mit pyproject.toml
- Client-Klasse mit Sync, Async (mit Polling), Webhook, Verify, Download
- Typisierte Exception-Hierarchie
- Webhook-Signatur-Verifikation (HMAC-SHA-256)
- Pytest-Suite + Quickstart und Webhook-Receiver-Beispiel
2026-04-25 12:26:03 +02:00

60 lines
1.6 KiB
Python

"""Webhook-Empfänger für hightrusted CAPTURE — minimaler Flask-Server.
Voraussetzung:
pip install hightrusted-capture flask
Lauf:
export HIGHTRUSTED_WEBHOOK_SECRET=wh_secret_...
python examples/webhook_receiver.py
Capture mit Webhook anlegen:
client.capture_webhook(
url="https://example.com",
webhook_url="https://your-domain.tld/webhooks/capture",
reference="case-001",
)
"""
import json
import os
from flask import Flask, request
from hightrusted_capture import verify_webhook_signature
WEBHOOK_SECRET = os.environ["HIGHTRUSTED_WEBHOOK_SECRET"]
app = Flask(__name__)
@app.post("/webhooks/capture")
def capture_webhook():
body = request.get_data() # raw bytes — wichtig für HMAC!
signature = request.headers.get("X-Hightrusted-Signature", "")
if not verify_webhook_signature(body, signature, WEBHOOK_SECRET):
app.logger.warning("Webhook signature mismatch")
return {"error": "invalid_signature"}, 401
payload = json.loads(body)
event = payload["event"]
capture = payload["capture"]
if event == "capture.ready":
capture_id = capture["id"]
verify_url = capture["verify_url"]
reference = capture.get("reference", "")
app.logger.info(
"Capture %s ready (ref=%s, verify=%s)",
capture_id, reference, verify_url,
)
# → hier: PDF herunterladen, ins Archiv legen, Mandant benachrichtigen, ...
elif event == "capture.failed":
app.logger.error("Capture failed: %s", payload.get("error"))
return {"ok": True}, 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)