Automatisches Streitfall-Antwortsystem für Stripe mit Beweis-PDFs
Von Wikiprompt, der freien Prompt-Enzyklopädie
Automatisches Streitfall-Antwortsystem für Stripe mit Beweis-PDFs Eine vollständige Bauspezifikation für ein automatisiertes Stripe-Rückbuchungsstreit-System: automatische Webhook-Übermittlung, Beweis-PDFs mit Produktscreenshots, ein CLI-Sync-Worker und ein Mini-Admin-Dashboard.
Zugehörige Medien
Prompt-InhaltSpeichern
🌐
Erstellen Sie ein automatisches Streitfall-Antwortsystem für Stripe, das:
1. Gemeinsame Beweissammlung (app/dispute_evidence.php)
Erstellen Sie eine gemeinsame Datei mit Funktionen, die sowohl vom Webhook als auch vom Sync-Worker verwendet werden. Dies vermeidet die Duplizierung von Beweislogik.
Wichtige Funktionen:
- getDisputeUserPlan($user, $stripe) - zieht den Abonnementplan des Benutzers aus der Stripe-API (Quelle der Wahrheit, da das lokale DB-Planfeld bei Kündigung gelöscht wird). Fällt auf lokale DB-Felder zurück, wenn der Stripe-Aufruf fehlschlägt. Mappt Produkt-IDs auf Plannamen und enthält Preis/Intervall und Stornierungsstatus.
- collectDisputeEvidence($stripe, $user, $email, $charge, $photosDb) - sammelt alle Text- und Dateibeweise, gibt ein Array zurück, das zur Übermittlung an Stripe bereit ist.
- generateServiceDocPdf($stripe, $user, $email, $photos_done, $recent_photos, $total_amount_paid) - generiert ein PDF mit Kundeninformationen, Nutzungsübersicht, Tabelle der letzten Aktivitäten und bis zu 6 tatsächlichen Produktbildern (auf JPEG mit 500px Breite / Qualität 75 verkleinert, um unter Stripe's 5MB-Datei-Upload-Limit zu bleiben). Gibt sowohl die Stripe-Datei-ID als auch die rohen PDF-Daten zurück.
Wichtig: Ziehen Sie total_amount_paid aus der Stripe-Charges-API (Summe erfolgreicher, nicht erstatteter Gebühren), anstatt der lokalen DB zu vertrauen, die null/veraltet sein kann.
2. Webhook-Handler (in stripe_webhook.php)
Fangen Sie charge.dispute.created-Ereignisse ab. Wenn ein Streitfall eingeht:
- Holen Sie die Streitfall-, Gebühren- und Kundenobjekte von Stripe
- Suchen Sie den Benutzer in der lokalen Datenbank nach stripe_customer_id
- Speichern Sie den Streitfall in einer Streitfall-SQLite-Datenbank (Felder: dispute_id, charge_id, payment_intent_id, stripe_customer_id, user_id, email, amount, currency, reason, status, epoch_created, epoch_evidence_submitted, evidence_json, stripe_response, epoch_resolved, outcome)
- Rufen Sie collectDisputeEvidence() auf, um alle Beweise zu sammeln (Text + Datei-Uploads)
- Übermitteln Sie Beweise an Stripe über $stripe->disputes->update($dispute_id, ['evidence' => $evidence])
- Senden Sie eine Telegram-Benachrichtigung, dass ein neuer Streitfall eingegangen ist und Beweise automatisch übermittelt wurden
Fangen Sie auch charge.dispute.updated- und charge.dispute.closed-Ereignisse ab, um Streitfall-Ergebnisse (gewonnen/verloren) in der Datenbank zu verfolgen und Telegram-Benachrichtigungen mit dem Ergebnis zu senden.
3. Beweisfelder, die an Stripe übermittelt werden
TEXT-Felder (schreiben Sie Zeichenfolgen direkt):
- product_description - beschreiben Sie, was das Produkt/die Dienstleistung ist
- customer_name / customer_email_address - aus dem Stripe-Kundenobjekt
- access_activity_log - detailliertes Nutzungsprotokoll: Anmeldedatum, Anzahl der erledigten Elemente/Aktionen, letztes Aktivitätsdatum, Abonnementplan (von Stripe), Plattform, Gesamtbetrag bezahlt (von Stripe), letzte Aktivität mit Zeitstempeln
- uncategorized_text - das Argument "warum wir gewinnen sollten": Kunde hat sich auf X angemeldet, hat den Dienst aktiv genutzt, indem er Y Dinge getan hat, Gesamtbetrag bezahlt, Dienst wurde digital/sofort geliefert, Kunde hat uns vor dem Streitfall nie für eine Rückerstattung kontaktiert
- refund_policy_disclosure / cancellation_policy_disclosure - wann Richtlinien präsentiert wurden (während des Checkouts, immer zugänglich unter /legal)
- refund_refusal_explanation / cancellation_rebuttal - Nutzungsnachweis und fehlender vorheriger Kontakt
- service_date - Datum der Gebühr (Y-m-d-Format)
DATEI-UPLOAD-Felder (laden Sie die Datei zuerst zu Stripe hoch über $stripe->files->create(['purpose'=>'dispute_evidence', 'file'=>fopen($path,'r')]), übergeben Sie dann die zurückgegebene file_xxxxx-ID):
- receipt - ziehen Sie das Rechnungs-PDF direkt von Stripe ($stripe->invoices->retrieve($charge->invoice)->invoice_pdf), laden Sie es herunter und laden Sie es als Streitfall-Beweis hoch
- service_documentation - generieren Sie ein PDF mit: Kundeninformationsabschnitt, Dienstnutzungsübersicht, Tabelle der letzten Aktivitäten und bis zu 6 tatsächlichen Produktbildern/Screenshots, die der Kunde erhalten hat. Verkleinern Sie Bilder vor dem Einbetten (500px Breite, JPEG-Qualität 75), um unter Stripe's 5MB-Limit zu bleiben.
Speichern Sie auch beide PDFs in Ihrem Dateispeicher (z.B. Cloudflare R2, S3) mit gehashten Dateinamen, damit sie nicht erraten werden können, aber vom Admin-Dashboard aus sichtbar sind. Speichern Sie die Speicher-URLs in evidence_json als _receipt_r2_url und _service_doc_r2_url.
4. CLI-Sync-Worker (workers/syncDisputes.php)
Ein Skript, das ALLE vorhandenen Streitfälle aus der Stripe-API zieht (paginiert mit $stripe->disputes->all(['limit' => 100]) und starting_after für Paginierung), sie in der lokalen Streitfall-Datenbank speichert und für alle, die noch den Status needs_response oder warning_needs_response haben und noch keine Beweise übermittelt haben, automatisch Beweise mit der gemeinsamen Funktion collectDisputeEvidence() übermittelt. Dies ist notwendig, da der Webhook nur zukünftige Streitfälle erfasst, nicht vorhandene. Nur über CLI ausführen (php workers/syncDisputes.php). Speichert eine JSON-Cache-Datei mit Synchronisationsergebnissen, damit das Dashboard die letzte Synchronisationszeit anzeigen kann.
5. Mini-Dashboard (disputes.php mit ?key=-Authentifizierung)
Eine einfache HTML-Seite, geschützt durch den ?key=-Abfrageparameter, die anzeigt:
- Statistikboxen: Gesamtstreitfälle, ausstehend, gewonnen, verloren, Streitfälle in den letzten 30 Tagen (Betrag + Anzahl), Streitfälle in den letzten 12 Monaten (Betrag + Anzahl), Gesamtbetrag $ angefochten
- Ein Hinweis, der den CLI-Sync-Befehl und die letzte Sync-Zeit aus dem Cache zeigt
- Ein Testformular, in dem Sie eine stripe_customer_id eingeben, um eine Vorschau zu erhalten, welche Beweise übermittelt würden (ohne tatsächlich zu übermitteln)
- Eine Tabelle aller Streitfälle: Datum, E-Mail, Betrag, Grund, Status (farbige Badges), Beweisübermittlungsstatus, Links sowohl zur Detailansicht als auch zum Stripe-Dashboard
Detailansicht (action=view&id=dispute_id): zeigt alle Streitfall-Informationen, Link zu Stripe und einen "Beweise neu generieren"-Button, PDF-Dateilinks, Stripe-Datei-Upload-IDs, alle Textbeweisfelder.
Beweise neu generieren (action=regen&id=dispute_id): generiert die Quittungs- und Servicedokumentations-PDFs neu und lädt sie in den Dateispeicher hoch, aktualisiert evidence_json mit neuen PDF-URLs. Verwenden Sie fastcgi_finish_request(), um die HTTP-Antwort sofort zu senden (zurück zur Detailseite mit Hinweis "wird im Hintergrund neu generiert"), und generieren Sie dann die PDFs im Hintergrund weiter, um Frontend-Timeouts zu verhindern.
Fügen Sie eine Nginx-Rewrite für die Seite hinzu (z.B. rewrite ^/disputes/?$ /disputes.php). Stellen Sie sicher, dass sie in der richtigen Nginx-Konfigurationsdatei ist (prüfen Sie, auf welche der Symlink in sites-enabled tatsächlich zeigt).
6. Telegram-Benachrichtigungen
- Neuer Streitfall: "{site name} - Neuer Streitfall von {email} für ${amount} ({reason}). Beweise automatisch an Stripe übermittelt. {stripe_dashboard_link}"
- Beweise fehlgeschlagen: "{site name} - Neuer Streitfall von {email} für ${amount} ({reason}). Beweisübermittlung FEHLGESCHLAGEN: {error}"
- Streitfall gewonnen/verloren mit dem Ergebnis und Link
- DB-Berechtigungsfehler: "{site name} - STREITFALL-DB-FEHLER: {error} - überprüfen Sie die Berechtigungen auf data/disputes.db"
7. Stellen Sie sicher, dass diese Stripe-Webhook-Ereignisse im Stripe-Dashboard aktiviert sind: charge.dispute.created, charge.dispute.updated, charge.dispute.closed
8. Datenbankberechtigungen
Die Datei disputes.db muss vom Webserver-Benutzer (z.B. www-data) beschreibbar sein. Wenn Sie sie von CLI als root erstellen, korrigieren Sie den Besitzer, um sie an Ihre anderen DB-Dateien anzupassen. PHP-FPM läuft als anderer Benutzer als root.
9. Abhängigkeiten
- FPDF (setasign/fpdf) für PDF-Generierung, installiert über composer require setasign/fpdf
- GD-Erweiterung für Bildverkleinerung (normalerweise bereits installiert)
- Stripe-PHP-SDK (bereits installiert, wenn Sie Stripe-Webhooks haben)
- AWS-S3-SDK für R2/S3-Uploads (bereits installiert, wenn Sie Cloudflare R2 verwenden)
Melde dich an, um den vollständigen Prompt zu sehen
Weiter mit:
Mit der Anmeldung akzeptierst du unsere Nutzungsbedingungen und Datenschutz
Verwendung
Dieser Prompt ist für die Verwendung mit coding gedacht. Kopiere den Inhalt oben und füge ihn in dein bevorzugtes KI-Tool ein.
Für beste Ergebnisse passe die Platzhalter (eckige Klammern oder Großbuchstaben) an deine Anforderungen an.
Referenzen
- Kategorie: coding-Prompts
- Quelle: https://x.com/levelsio/status/2041132289065631988
Diskussion
0 Kommentare