Homepage > Journal > Die Integration von Stripe-Zahlungen in Django
Journal

Die Integration von Stripe-Zahlungen in Django

Wie gefällt Ihnen das:

"Django Stripe", "Stripe-Integration", "Stripe-API" und "Django Stripe-Integration" sind Begriffe, die in letzter Zeit im Google-Browser auftauchen.

Da uns das Thema des Django-Frameworks vertraut ist — wir haben bereits in den Artikeln "WordPress vs. Django" und "Anwendungen entwickelt in Django" darüber geschrieben — haben wir uns dieses Mal entschlossen, seine Möglichkeiten aus einer praktischeren Perspektive zu zeigen.

Das Thema "Zahlungen im Internet" hat Buchformat. Als Kunden wissen wir das sehr gut. Namen wie PayPal, PayU, Przelewy24, Blik, DotPay, TPay, Apple Pay und Google Pay funktionieren im öffentlichen Bewusstsein.

Die Marke Stripe hat sich in die Riege der Betreiber, Plattformen, Gateways und Zahlungsabwickler eingereiht. Sie ist als einer der weltweit größten und etabliertesten Payments Service Provider (PSP) anerkannt.

Die Liste der von Stripe unterstützten Marken umfasst u. a. Amazon, Google, Spotify und Uber.

Wenn wir über Gateways, Zahlungskartenbetreiber und Zahlungsabwickler sprechen, stellen sich Fragen zur Nutzung solcher Dienste, zu den technologischen und softwaretechnischen Herausforderungen, die eine solche Integration mit sich bringt, und zu Methoden für eine schnelle und effiziente Integration.

Und hier kommen wir zum Anfang, nämlich der Integration von Stripe-Zahlungen in Django. Schauen wir uns also an, wie man das Stripe-Zahlungsgateway in eine Webanwendung (z. B. einen Online-Shop oder eine B2B-Plattform) integriert.

Wir laden Sie also ein, den Artikel zu lesen!

Was ist eine Stripe-Zahlung?

Beginnen wir mit den grundlegendsten Fragen: Was ist Stripe? Was ist eine Stripe-Zahlung?

Stripe ist eine Plattform für die Abwicklung von Online-Zahlungen. Es unterstützt auch Kreditkarten.

Er ist einfach ein Vermittler zwischen dem Kunden (z. B. eines Online-Shops) und dem Verkäufer, zwischen der Bank des Käufers und der des Verkäufers.

Handelt es sich um ein weiteres Einfallstor, wie so viele, auf dem US-Markt? Nicht unbedingt, aber wir werden gleich auf die Einzelheiten eingehen.

Stripe bietet einen Service, der beiden Parteien eine schnelle, einfache und vor allem sichere Transaktion garantiert.

Als Zahlungsdienstleister bietet Stripe mehrere Zahlungsmethoden an — einschließlich aufgeschobener Zahlungen oder wiederkehrender Rechnungen.

Der Abschluss einer bestimmten Transaktion ist natürlich mit einer Zahlung verbunden.

Die Reichweite von Stripe hebt das Unternehmen vom Rest der Konkurrenz ab.

Die in den USA ansässige Marke bietet Unterstützung für mehr als 130 Währungen und ist damit eine optimale Lösung für Unternehmen, die ihre Produkte auf internationalen Märkten verkaufen.

Stripe ist ideal für Unternehmen, für die das Anbieten von Zahlungen in Fremdwährungen ein wichtiger Bestandteil des Wettbewerbs ist. Für diejenigen, für die der Währungsumtausch eine tägliche Praxis, eine Notwendigkeit und eine tägliche Sorge um die Kosten des Währungsumtauschs ist.

Zahlungen in Stripe

Was die Kosten für die Währungsumrechnung betrifft, so gilt Stripe als sehr wettbewerbsfähige und attraktive Lösung.

Stripe bietet Zahlungsabwicklung in verschiedenen Geschäftsmodellen, einschließlich:

  • E-Commerce (B2C)
  • Plattform B2B
  • Virtuelle Brieftasche
  • Spendensammler
  • Unterstützung von Non-Profit-Organisationen
  • Software as a Service (SaaS)

Darüber hinaus unterstützt die API für Zahlungen von Stripe die meisten universellen Zahlungssysteme, nämlich:

  • Alipay
  • Apple Pay
  • Google Pay
  • WeChat Pay

Stripe in Polen

Stripe, das seit 2019 in Polen verfügbar ist, bietet polnischen Kunden Zahlungsabwicklung und eine Reihe von Funktionen, die die Buchhaltung und Rechnungsstellung automatisieren, beschleunigen und vereinfachen.

Mit Stripe ist es auch möglich, Zahlungen über mobile Geräte und POS-Systeme (Point of Sale) vorzunehmen.

Stripe unterscheidet sich von seinen Mitbewerbern auch dadurch, dass es besondere Sicherheitsmerkmale bietet und große Sorgfalt darauf verwendet, die Sicherheit der Transaktionen zu gewährleisten, die auf globaler Ebene viel anfälliger für Cyberangriffe sind als auf nationaler Ebene.

Stripe stützt sich bei den Sicherheitsmaßnahmen vor allem auf Folgendes:

  • AVS – Address Verification Service
  • SSL-Verschlüsselung
  • CVV/CVV2-Kontrolle
  • Erfüllung der PCI DSS-Normen (Payment Card Industry Data Security Standard)

Die Adressprüfung dient dazu, die vom Kunden angegebene Adresse mit der von der Bank angegebenen Adresse zu vergleichen.

Stripe erfüllt außerdem die strengen Standards des Payment Card Industry Security Standards Council.

Organisation der Kreditkartenbetreiber, die seit 2014 Standards für die Cybersicherheit, insbesondere für die Sicherheit von Finanztransaktionen, entwickelt, standardisiert und durchsetzt. Um genau zu sein, hat Stripe die höchste Sicherheitsstufe für die Zahlungsabwicklung erhalten (PCI Service Provider Level 1).

Django Stripe - Sicherheit

Stripe hat auch eigene Tools zur Betrugserkennung (Stripe Radar) eingeführt, die durch maschinelles Lernen die Glaubwürdigkeit und Ehrlichkeit einer Person, die eine Transaktion abschließt, bewerten können.

Stripe Radar ist ein integraler Bestandteil der Plattform und erfordert keine Installation oder zusätzliche Konfiguration. Es ist eine Lösung, die standardmäßig angeboten wird.

Stripe-Verfügbarkeit in Deutschland, Österreich und der Schweiz

Stripe ist in 46 Ländern verfügbar. Dazu gehören die USA, Deutschland, Österreich und die Schweiz.

Alle unterstützten Länder haben Zugang zu den Kernfunktionalitäten. Einige Funktionen sind jedoch auf bestimmte Regionen beschränkt oder nur in einer Betaversion verfügbar.

So ist beispielsweise die Vollversion des Stripe-Terminal-Dienstes zur Annahme von persönlichen Zahlungen nur in Deutschland und den USA verfügbar. Die Betaversion ist für Österreich und die Schweiz verfügbar (die vollständige Liste finden Sie Terminal hier).

Instant Payouts for Connect marketplaces and platforms sind jedoch nur in den USA, Kanada, Singapur und dem Vereinigten Königreich verfügbar.

Einige Funktionen sind nur für geladene Gäste zugänglich, wie z. B. die zusätzliche Identitätsprüfung.

Wenn wir uns also für Stripe entscheiden, sollten wir die Dokumentation sorgfältig lesen, denn dort finden sich alle Informationen über die Verfügbarkeit aller Produkte des Unternehmens. Dadurch können wir die gesamte Palette der Optionen sehen, auf die wir zugreifen und die wir nutzen können.

Stripe-Integration in den USA

Als direkter und erfolgreicher Konkurrent von PayPal ist Stripe ein Werkzeug, das immer mehr Marktanteile gewinnt.

Wie bereits erwähnt, ist das Unternehmen in mehreren Dutzend Ländern vertreten und bietet außerdem Währungsumrechnungsdienste zu sehr attraktiven Konditionen an.

Was den amerikanischen Markt betrifft, so bietet Srtipe einen besonderen Vorteil für Kunden des Stripe-Atlas-Programms, das es uns ermöglicht, auch in den Vereinigten Staaten ein Unternehmen zu gründen.

Ein Hauptsitz in den Vereinigten Staaten ist für viele Organisationen ein sehr bequemes, schnelles, legales und formal korrektes Instrument, um schnell als vollwertige und legale Einheit auf dem US-Markt tätig zu werden.

Dank seiner kompakten, gebündelten Natur, einer Reihe von Funktionen (eine vollständige Liste der Funktionen finden Sie hier) und Lösungen, die innerhalb von Stripe Atlas verfügbar sind, können die Kosten für den Eintritt in einen neuen Markt gesenkt werden.

Darüber hinaus bietet Stripe in der Betaversion einige Funktionen an, die nur für die USA gelten, darunter Cross-Border Payouts und Crypto Payouts. Beide Funktionen ermöglichen es Plattformen in den USA, Auszahlungen an angeschlossene Konten vorzunehmen. Der Unterschied besteht darin, dass Cross-Border Payouts für Express- und Custom-Konten verfügbar sind, während Crypto Payouts nur für Express-Konten verfügbar sind.

Warum sollten wir Stripe verwenden?

Ein Maß für die Qualität der von Stripe angebotenen Dienstleistungen, Produkte, Programme und Lösungen ist die Qualität:

  • Schneller und einfacher Integrationsprozess — der Registrierungs- und Verifizierungsprozess ist ziemlich schnell und erfordert nicht die Erfüllung sehr restriktiver Kriterien.
  • Das integrierte System, in dem verschiedene Formen der Zahlungsabwicklung möglich sind.
  • Flexibilität und Anpassungsfähigkeit der Stripe-APIs an individuelle Bedürfnisse.
  • Umfangreiche Bibliotheken, die Entwicklern Funktionalitäten zusammen mit der Dokumentation zur Verfügung stellen.
  • Erweiterte Berichtswerkzeuge.

Die Online-Zahlungsarten von Stripe

Die Besonderheit von Stripe ist seine API, die eine schnelle, relativ einfache Implementierung von Zahlungen auf einer Website, einer mobilen App oder einer anderen Software ermöglicht.

Eine breite Palette von Optionen ermöglicht es den Benutzern, die für ihr Stripe-Geschäftsmodell am besten geeignete Option zu wählen.

Derzeit bietet Stripe drei Arten von Online-Zahlungen an:

  • Stripe Payment Links — damit ist es möglich, eine völlig unabhängige Zahlungsseite zu erstellen und sie auf jedem beliebigen Kanal verfügbar zu machen (auf einer Unterseite der Website, in sozialen Medien usw.). Diese Option ermöglicht es uns, eine Zahlung für ein Produkt in einer Währung zu erstellen, ohne eine API-Integration zu schreiben.
  • Stripe Checkout
  • Stripe Elements
  • Abonnements

Stripe Checkout

Stripe Checkout ist eine Low-Code-Zahlungsintegration, die für Benutzer empfohlen wird, die keine Zahlungen auf ihrer eigenen Website vornehmen müssen und keine Einwände gegen die Durchführung des Zahlungsvorgangs auf einer speziellen Stripe-Kassenseite haben.

Stripe Checkout wurde geschaffen, um Zahlungsdienste für Unternehmen ohne Programmierkenntnisse zugänglicher zu machen, die die Implementierung selbst vornehmen möchten.

Stripe Checkout wurde entwickelt, um den Zahlungsvorgang so reibungslos und nahtlos wie möglich zu gestalten.

Die Funktionalität unterstützt den Benutzer bei der Dateneingabe und erkennt Fehler in Echtzeit.

Außerdem bietet der Stripe Checkout:

  • Automatische Adressvervollständigung
  • 1-Klick-Zahlung
  • Kartenvalidierung in Echtzeit
  • Beschreibende Fehlermeldungen
  • Identifikation des Betreibers der Kredit-/Debitkarte

Stripe Checkout ermöglicht es uns, eine von Stripe gehostete Zahlungsseite ohne Programmierkenntnisse und ohne Code zu erstellen.

Um Zahlungen auf der Website zu implementieren, müssen wir nur die Zahlungen konfigurieren und den entsprechenden Codeschnipsel in das Content-Management-System (CMS) unserer Website kopieren und einfügen. Sie folgt einem ähnlichen Prinzip wie das Einfügen von Code für analytische Systeme.

Stripe Checkout verwaltet den gesamten Zahlungsvorgang, ohne dass ein Formular auf der Website erstellt werden muss.

Stripe Checkout hat seine Grenzen, bietet aber auch viele praktische Funktionen. Es unterstützt unter anderem die Verwendung von Werbecodes und verschiedenen Sprachversionen.

Wenn Sie mehr über Stripe Checkout lesen möchten und wie man es integriert, um Einmalzahlungen zu akzeptieren, empfehlen wir Ihnen den Artikel "Integrate Stripe Payments with Django By Building a Digital Products Selling App".

Stripe Elements

Nehmen wir an, dass Zahlungen aus verschiedenen Gründen ohne Umleitung auf die Website eines externen Anbieters getätigt werden sollen. In diesem Fall sollten wir Stripe Elements wählen, mit dem wir unsere eigenen Zahlungsformulare unter Verwendung von benutzerdefinierten Komponenten für die Benutzerschnittstelle erstellen können.

Mit Stripe Elements können wir zwar das Aussehen der Zahlungsformulare anpassen, aber es erfordert auch eine gewisse Kodierung unsererseits. Wer diese Option nutzt, kann verschiedene Produkte zu unterschiedlichen Preisen verkaufen.

Abonnements (wiederkehrende Zahlungen) in Stripe

Neben einzelnen Transaktionen bietet Stripe auch wiederkehrende Zahlungen an, die vor allem für SaaS- und PaaS-Dienste genutzt werden.

Mit Stripe können wir in unserer Anwendung ganz einfach ein auf Abonnementgebühren basierendes Geschäftsmodell implementieren.

Dies geschieht ohne die Notwendigkeit einer komplexen Schnittstelle und Logik, die für den Benutzer notwendig ist, um wiederkehrende Zahlungen bequem zu handhaben.

Anhand dieses Beispiels für die Unterstützung von Abonnements möchten wir zeigen, wie Sie Ihr Abenteuer mit Stripe in Anwendungen, die auf dem Django-Framework basieren, einfach und angenehm beginnen können.

Zahlungsintegration in Django

Wiederkehrende Zahlungen sind per definitionem komplizierter als einmalige Transaktionen. Sie sind von Natur aus asynchron, und was asynchron ist, erfordert normalerweise mehr Arbeit und ist schwieriger zu testen und später zu warten.

Im weiteren Verlauf dieses Artikels zeigen wir, wie man ein Abonnementmodell in einer Django-basierten Anwendung implementiert, und erläutern die Grundlagen des Stripe-Workflows.

Wir werden hier nicht die Grundlagen von Django behandeln, wie z.B. die Erstellung von Views, Routing oder Konfiguration. Wir gehen davon aus, dass Sie ein Python-Entwickler sind und mehr als eine Anwendung in Django erstellt haben. Konzentrieren wir uns also auf die interessante Sache — Stripe.

Haftungsausschluss:

Der unten gezeigte Code darf nicht in der Produktionsversion einer Anwendung verwendet werden.

In diesem Codeschnipsel sind keine Fehler- und Ausnahmebehandlung enthalten, und wir passen die Sicherheitsanforderungen nicht an, die oft individuell sind.

Wir haben auch viele Szenarien und Anwendungsfälle von geringerer Bedeutung ausgelassen. Die Aufgabe, die wir uns bei der Vorbereitung des folgenden Codes gestellt haben, besteht darin, die allgemeinen Prinzipien der Integration von Stripe in eine Django-Anwendung zu zeigen.

Unser Team würde einen solchen Code niemals in der Produktionsversion einer Anwendung verwenden.

Vorbereitung

Wir können an einer bestehenden Django-Anwendung arbeiten oder ein neues Projekt erstellen — für die Integration müssen wir keine komplizierten Änderungen an der Architektur vornehmen oder Abhängigkeiten installieren, die die Anwendung beeinträchtigen würden.

Das Einzige, was wir zu unserer virtuellen Umgebung hinzufügen müssen, ist die offizielle `stripe`-Bibliothek für Python:

pip install stripe

Der nächste Schritt besteht darin, ein Stripe-Konto zu erstellen. Der Registrierungsprozess selbst ist unkompliziert und erfordert keine zusätzlichen Kommentare, zumal wir kein Produktionskonto einrichten und eine zusätzliche Unternehmensüberprüfung nicht erforderlich ist.

Stattdessen müssen wir nach der Registrierung folgende Schritte durchführen, um mit der Stripe-API arbeiten zu können (in der offiziellen Dokumentation finden Sie dazu keine Informationen, und wir möchten Ihnen die Zeit ersparen, nach den Fehlerursachen zu suchen):

  • Geben Sie dem Unternehmen einen Namen, indem Sie auf die obere linke Ecke neben der Schaltfläche Konto aktivieren klicken.
  • Füllen Sie die Links zu den Nutzungsbedingungen und der Datenschutzerklärung in unseren Kontoeinstellungen aus (Einstellungen > Abrechnung > Kundenportal).

Für weitere Tests benötigen wir auch das Stripe CLI-Tool, das die Arbeit in einer lokalen Umgebung sehr viel angenehmer macht. Wie? Das können Sie in diesem Artikel herausfinden: https://stripe.com/docs/stripe-cli

Als nächstes müssen wir den Einstellungen unserer Django-Anwendung zwei Parameter hinzufügen, die für die Kommunikation mit der Stripe-API erforderlich sind. Die Benennung der Einstelltasten ist nicht zwingend erforderlich und sollte als Anregung betrachtet werden:

STRIPE_API_KEY = ********
STRIPE_HOOKS_SECRET = ********

Wir können den Wert für "STRIPE_API_KEY" erhalten, indem wir im Stripe-Dashboard zu Developers > API keys gehen und den Wert des geheimen Schlüssels kopieren. Wir werden `STRIPE_HOOKS_SECRET` später ausfüllen, und in diesem Stadium können wir es auf eine leere Zeichenkette setzen.

Der letzte Schritt besteht darin, Testdaten in unserem Stripe-Konto zu erstellen. Dazu können Sie einen einfachen Django CLI-Befehl verwenden, der ein Produkt und drei Abonnementpakete erstellt:

import stripe
from django.conf import settings
from django.core.management import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
        stripe.api_key = settings.STRIPE_API_KEY
        product = stripe.Product.create(name='Awesome Service')
        for i in range(1, 4):
            stripe.Price.create(
                product=product['id'],
                currency='usd',
                unit_amount=i * 1000,
                recurring={'interval': 'month'},
                lookup_key=f'service_{i}',
                nickname=f'Service level {i}',
            )

Sie können Testdaten auch über das Stripe-Verwaltungspanel erstellen. Leider können wir im Panel keinen `lookup_key`-Wert für einzelne Preispakete angeben, was zu einigen Implementierungsproblemen führt, da die Identifizierung in Abfragen auf der price package ID basieren muss, was Stripe nicht empfiehlt.

Wir haben die Umgebung vorbereitet und können nun mit der eigentlichen Integration beginnen.

Ansicht der Paketauswahl

Zunächst erstellen wir eine einfache Ansicht, die es dem Benutzer ermöglicht, das Preispaket für unser Abonnement auszuwählen und den Zahlungsvorgang zu starten.

In der Ansicht laden wir alle Preisoptionen für das erste aktive Produkt in unserem Stripe-Konto herunter:

def index(request):
    active_products = stripe.Product.list(active=True)
    prices = stripe.Price.list(product=active_products['data'][0]['id'])
    return render(request, 'subscriptions/index.html', {
        'prices': prices['data'],
    })
Die Ansichtsvorlage ist ebenfalls sehr einfach — wir zeigen ein Optionsfeld an, mit dem der Benutzer ein Abonnementpaket auswählen kann:
{% extends 'base.html' %}
{% block body %}
  <h1>Checkout page</h1>
  <form action="{% url 'create-checkout-session' %}" method="post">
    {% csrf_token %}
    {% for obj in prices %}
      {% widthratio obj.unit_amount 100 1 as price %}
      <label>
        <input type="radio" name="lookup_key" value="{{ obj.lookup_key }}" {% if forloop.first %}checked{% endif %}>
        {{ obj.nickname }} for {{ price|floatformat:2 }} {{ obj.currency|upper }} per {{ obj.recurring.interval }}
      </label><br>
    {% endfor %}
    <p>
      <button>Checkout</button>
    </p>
  </form>
{% endblock %}

Das Formular zur Paketauswahl wird an die Ansicht `create-checkout-session` gesendet, die im nächsten Schritt vorgestellt wird. Wir werden die Ansicht auf der Grundlage der Daten des Preispakets direkt von der Stripe-API anzeigen, wobei der Preis in Cent angegeben wird, sodass wir eine einfache Umrechnung vornehmen müssen.

Django-Templates bieten keine Möglichkeit, Divisionen in Templates durchzuführen. Um zu vermeiden, dass wir ein eigenes Tag schreiben, verwenden wir das eingebaute Tag `{% withration %}`, das der Division der Anzahl der Cents durch 100 entspricht.

Wenn wir die Adresse der Ansicht in den Browser eingeben, sollten wir das folgende Ergebnis erhalten:

Ansicht der Transaktionseinleitung

Das ausgewählte price package (genauer gesagt, der `lookup_key` des ausgewählten Pakets) wird per POST an diese Ansicht übergeben.

Wir rufen die Paket-ID ab, öffnen dann eine Stripe-Kassensitzung und leiten den Benutzer an die daraus resultierende URL weiter, wo der Benutzer auf eine von Stripe gehostete Zahlungsseite weitergeleitet wird und eine Zahlung außerhalb unseres Systems vornimmt.

def create_checkout_session(request):
    prices = stripe.Price.list(
        lookup_keys=[request.POST['lookup_key']],
        expand=['data.product']
    )
    success_url = request.build_absolute_uri(reverse('success')) + '?session_id={CHECKOUT_SESSION_ID}'
    cancel_url = request.build_absolute_uri(reverse('cancel'))
    checkout_session = stripe.checkout.Session.create(
        payment_method_types=['card'],
        line_items=[{'price': prices.data[0].id, 'quantity': 1}],
        mode='subscription',
        success_url=success_url,
        cancel_url=cancel_url,
    )
    return redirect(checkout_session.url)

Die Methode `stripe.checkout.Session.create` sollte in unserem Fall die folgenden Parameter erhalten:

  • `payment_method_types` — Liste der dem Benutzer zur Verfügung stehenden Zahlungsmittel
  • `line_items` — eine Sammlung von Preislistenpositionen, die in der Zahlung enthalten sein werden
  • `mode` — Zahlungsart, wir sind an wiederkehrenden Zahlungen interessiert
  • `success_url`— eine URL, an die der Benutzer nach erfolgreicher Zahlung weitergeleitet wird, achten Sie darauf, den Platzhalter `{CHECKOUT_SESSION_ID}` einzuschließen, der auf der Stripe-Seite durch den Sitzungsschlüssel ersetzt wird, der für den Erhalt von Transaktions- und Benutzerdaten benötigt wird.
  • `cancel_url` — URL, zu der der Benutzer umgeleitet wird, wenn die Zahlung fehlschlägt; aus irgendeinem Grund kann sie die gleiche sein wie `success_url`.

Nach erfolgreicher Zahlung in Stripe wird der Benutzer über die in der `success_url` angegebene Adresse zu unserer Anwendung zurückgeleitet. Die unter dieser Adresse verfügbare Ansicht werden wir im nächsten Schritt untersuchen.

Die Ansicht der erfolgreichen Zahlung

Die Ansicht "Erfolgreiche Zahlung" ist eine Erfolgsseite, die der Benutzer nach einer erfolgreichen Zahlung sieht, wenn er den Parameter `session_id` im Query-String erhält (entsprechend der Vorlage, die wir im vorherigen Schritt übergeben haben).

Dies ist genau der Punkt, an dem wir die `customer ID` von Stripe mit unserem Benutzer in Django verknüpfen können — sie wird benötigt, um die Abonnement-Ereignisse des Benutzers und die Generierung der `portal session` zu empfangen, worüber wir als nächstes sprechen werden.

Um die Dinge zu vereinfachen, speichern wir die `customer ID` nicht, sondern übergeben sie an die Vorlage, wo wir dem Benutzer erlauben, mit der Abonnementverwaltung in Stripe fortzufahren.

def success(request):
    checkout_session = stripe.checkout.Session.retrieve(request.GET['session_id'])
    return render(request, 'subscriptions/success.html', {
        'customer': checkout_session.customer,
    })

Und hier ist der Code der Vorlage:

{% extends 'base.html' %}
{% block body %}
  <h1>Success!</h1>
  <form action="{% url 'create-portal-session' %}" method="post">
    {% csrf_token %}
    <input type="hidden" name="customer" value="{{ customer }}">
    <button>Manage your subscription</button>
  </form>
{% endblock %}

Der Übergang zur Abonnementverwaltung (Kundenportal) erfolgt durch Senden der `customer ID` an die Ansicht `create-portal-session`, die für die Weiterleitung des Benutzers zum Abonnementprofil in Stripe verantwortlich ist.

Ansicht der Einleitung des Übergangs zum Benutzerportal

Stripe bietet eine schnelle und bequeme Möglichkeit, Zahlungen zu empfangen, und ermöglicht es uns, ohne viel Arbeit, dem Benutzer eine bequeme und sehr leistungsfähige Benutzeroberfläche für die Verwaltung seines Abonnements, d.h. ein `customer portal`, zur Verfügung zu stellen.

Das Kundenportal ist eine völlig unabhängige und sichere Schnittstelle, die von Stripe gehostet wird. Um den Benutzer zum Portal umzuleiten, müssen wir eine URL mit der `customer ID` generieren, wofür auch die folgende Ansicht zuständig ist.

def create_portal_session(request):
    portal_session = stripe.billing_portal.Session.create(
        customer=request.POST['customer'],
        return_url=request.build_absolute_uri(reverse('subscriptions'))
    )
    return redirect(portal_session.url)

Asynchronität, auch bekannt als Webhooks

Der gesamte Code, den wir bisher geschrieben haben, ist nur für das erste Abonnement gedacht und behandelt nur die erste Belastung der Kundenkarte.

Stattdessen möchten wir den Benutzer auf einer wiederkehrenden Basis und ohne seine Beteiligung belasten — schließlich geht es bei Abonnementmodellen genau darum.

An dieser Stelle kommt Webhooks, das Ereignissystem, das Stripe Entwicklern zur Verfügung stellt, zur Hilfe.

Stripe generiert eine Vielzahl von Ereignissen im Zusammenhang mit der Zahlungsabwicklung, dem Abonnement, der Dokumentenerstellung und vielem mehr. Die Verteilung der Ereignisse erfolgt über das Webhook-Konzept.

Kurz gesagt: Wenn ein Ereignis eintritt, löst Stripe die in der Administrationsoberfläche angegebene URL aus, an die alle Ereignisdaten weitergeleitet werden.

Die Vorlage ist einfach und ermöglicht es uns, den asynchronen Fluss zu handhaben, der ein natürlicher Weg ist, um Abonnements und aufgeschobene Zahlungen zu verwalten.

Lassen Sie uns eine Ansicht erstellen, die Ereignisse von Stripe empfängt, d.h. unseren Webhook-Handler:

@csrf_exempt
def webhooks(request):
    event = stripe.Webhook.construct_event(
        payload=request.body,
        sig_header=request.headers['stripe-signature'],
        secret=settings.STRIPE_HOOKS_SECRET
    )
    data = event['data']
    event_type = event['type']
    data_object = data['object']
    if event_type == 'invoice.paid':
        print(f'Renew customer: {data_object["customer"]}')
    elif event_type == 'customer.subscription.deleted':
        print(f'Cancel subscription: {data_object["customer"]}')
    return JsonResponse({'status': 'success'})

Zunächst müssen wir den Wert des Schlüssels `STRIPE_HOOKS_SECRET` in der Konfiguration unserer Django-Anwendung eintragen, den wir zunächst auf eine leere Zeichenkette setzen.

Wir können den Wert dieses Schlüssels über das Stripe-Bedienfeld abrufen, aber dazu müssten wir den Zugang zur Anwendung für die Welt öffnen, was nicht immer bequem oder sicher ist.

Wie eingangs erwähnt, besteht die größte Herausforderung bei der Implementierung asynchroner Arbeitsabläufe im Testen in einer lokalen Umgebung. Stripe positioniert sich als entwicklerfreundliche Lösung mit einem hohen DX-Niveau.

Im Arsenal der von Stripe bereitgestellten Bibliotheken und Werkzeuge finden wir alles, was unser tägliches Leben viel einfacher und die Arbeit vor Ort effizienter und angenehmer macht. Ein solches Werkzeug ist Stripe CLI, das wir bereits installiert haben sollten.

Zunächst müssen wir uns mit der Stripe-CLI anmelden, indem wir den Befehl `stripe login` ausführen. Nach der Anmeldung führen wir den folgenden Befehl aus, der alle Hook-Aufrufe an unsere lokale Anwendung weiterleitet, ohne dass wir unsere Umgebung für die Welt öffnen müssen:

stripe listen --forward-to <HOOKS_URL>

Nach der Ausführung des Befehls wird in der Konsole der Schlüssel angezeigt, den wir in unsere Konfiguration als `STRIPE_HOOKS_SECRET` eingeben müssen.

Von nun an werden alle Stripe-Ereignisse direkt in unserer Ansicht angezeigt.

Es gibt viele ausgelöste Ereignisse, aber um das allgemeine Prinzip der Integration im Beispielcode zu zeigen, unterstützen wir nur zwei Arten von Ereignissen:

  • `invoice.paid` — tritt zum Zeitpunkt der Abonnementverlängerung auf und enthält eine `customer ID`, damit wir die Gültigkeit des Benutzerkontos verlängern können.
  • `customer.subscription.deleted` —  tritt ein, wenn ein Benutzer ein Abonnement kündigt; die Daten eines solchen Ereignisses enthalten auch die `customer ID`.

Das ist die Quintessenz des Ganzen. Mit den vorgestellten Lösungen können wir problemlos einen vollständigen Abonnementdienst mit praktisch beliebiger Logik aufbauen.

Stripe-Zahlungsintegration in Django. Zusammenfassung

Stripe ist ein leistungsfähiges Tool, das es uns ermöglicht, die Verantwortung für die Zahlungsabwicklung auf den Betreiber zu übertragen.

Es bietet eine vollständige API, sodass wir jeden beliebigen Ablauf für die Abwicklung einmaliger und wiederkehrender Zahlungen erstellen können.

Gleichzeitig gibt Stripe den Entwicklern Toolkits an die Hand, mit denen sie die gängigsten Anwendungsfälle mit minimalem Aufwand bewältigen können, ohne den Weg für weitere Anpassungen der zu entwickelnden Software zu versperren.

Die Integration der von Stripe zur Verfügung gestellten offiziellen Bibliotheken ist intuitiv einfach, und die Dokumentation ist, obwohl sie im Vergleich zu konkurrierenden Lösungen an einigen Stellen veraltet ist, sehr umfassend und sinnvoll aufgebaut.

Ein guter DX macht den Entwicklern Lust, sich mit den Feinheiten der Integration zu befassen, und die Implementierungsprozesse werden weniger Fehler enthalten und schnell und effizient ablaufen.

Dank der breiten Palette an Werkzeugen eignet sich Stripe sowohl für kleine Projekte in der MVP-Phase, bei denen Kosten und Implementierungszeit entscheidend sind, als auch für große, ausgereifte Projekte mit komplexen Workflows und einer vollständig auf das Projekt zugeschnittenen Logik für die Zahlungsabwicklung.

Stripe lässt sich perfekt in Anwendungen integrieren, die mit Django geschrieben wurden und die unser Team täglich nutzt.

Haftungsausschluss

Die in diesem Artikel vorgestellten Preisbeispiele stellen kein Sonderangebot im Sinne des polnischen Zivilgesetzbuches dar.

Wie gefällt Ihnen das:
Journal / JPG / Jarek - avatar
Autor: Yaroslav Shatkevich
A programmer with 17 years of experience. Co-founder and CTO of The Story. Fascinated with planning programming works, author of numerous IT and DevOps specifications. Honored by Awwwards, awarded iF Design Award 2018. He works in Python, PHP, React and JavaScript technologies. He created over 90 web and mobile applications and dedicated systems.

Sind Sie an einer Zusammenarbeit mit uns interessiert? Werfen Sie einen Blick auf unser Portfolio