Ich bin etwas falsch verstanden Paypal Flow-Event nach dem Lesen Ссылка . Ich möchte Express-Checkout- und Kreditkartenzahlungen in meine Website integrieren. Ich verwende Flask
und paypalrestsdk
ohne Flask-Erweiterungen.
Hier sind Auszüge aus meiner App:
%Vor% Es funktioniert gut, nachdem der Benutzer auf den Button payment
erfolgreich (mit dem Status created
) auf die Genehmigungsseite umgeleitet wurde. Dort klickt er auf "Bestätigen" ... Und ich kehrte nie zu meiner Anwendung zurück, als ich return_url angab! I.e. Anwendung könnte nie informiert werden, dass Käufer Zahlung genehmigt und es sollte in meiner eigenen Datenbank aktualisiert werden und neue Lizenz sollte an diese Person gesendet werden.
Probleme:
Ich kann keine Möglichkeit finden, einige Callbacks mit pyhtonrestsdk
zu definieren. Wie man es macht?
Auch wenn ich Callback hinzufüge (ich habe versucht, Express Checkout mit reinem JavaScript-Button-Code einzubetten) mit data-callback
wurde meine Anwendung nicht aufgerufen. Ich vermute, weil der Remote-Server http://127.0.0.1/payment/paypal/success
Der Benutzer konnte das Fenster sofort mit PayPal schließen, nachdem er auf "Confirm" geklickt hatte, so dass ich der Browser-Umleitung nicht vertrauen konnte, dass es später irgendwie ausgeführt wurde.
Schließlich vermute ich, dass ich den PayPal-Workflow nicht klar verstehe, aber ich konnte keine weiteren Informationen über das Event auf dem Entwicklerportal finden.
Wie immer versteckt sich der Teufel im Detail. Mein Hauptproblem war folgendes: Paypal leitet mich nicht zu meiner Anwendung weiter, aber ich fand heraus, dass es mich (nach der Bestätigung) zu einer URL umleitet, die aussieht wie https://sandbox.paypal.com/
mit der Abfragezeichenfolge die gewünschten Parameter enthält. I.e. redirect_urls
funktioniert wie erwartet, leitet mich einfach zum falschen Host um.
Danach habe ich mich daran erinnert, dass url_for
relative Links generiert. Also nur hinzugefügt Keyword _external=True
Ich wurde zu meiner Anwendung mit allen erforderlichen Argumenten umgeleitet und Zahlung erfolgreich bestätigt und ausgeführt.
i.e. Korrekt redirect_urls
block sieht wie folgt aus:
Endlich habe ich folgenden Workflow:
Eröffnet /
( index
), die Schaltfläche Pay with PayPal
hat Es ist Bild-Schaltfläche in Form. Neben diesem Knopf Formular enthält versteckte Felder mit Betrag, Produktname und Menge (eigentlich, wenn es keine gute Idee ist, weil wir dem Benutzer nicht trauen können, also speichere ich nur product_license_type_id
, das in DB gespeichert ist und alle erforderlichen Informationen über das Produkt enthält).
Nachdem Sie POST
form auf '/ payment / paypal' (paypal_create) geklickt haben, erstellen Sie das Objekt Payment
mit dem Füllen aller Felder. Wenn der Aufruf payment.create
erfolgreich abgeschlossen wurde, erstellt er auch einen Datensatz in meiner eigenen Datenbank mit payment_id
und state
(diese Felder beziehen sich auf den Paypal-Workflow, natürlich speichere ich tatsächlich einige andere Felder meiner App).
Sobald die Zahlung auf der PayPal-Seite erstellt wurde, suchen Sie in der Antwort nach der Liste payment.links
. Wir wollen einen mit rel == 'approval_url'
und method == 'REDIRECT'
und geben flask.redirect(found_link)
Beim PayPal-Website-Käufer sollte er auf "Genehmigen" klicken, die Lieferadresse überprüfen und danach wird er sofort zu redirect_urls.return_url
mit folgenden Parametern im Abfrage-String weitergeleitet: PayerID
, paymentId
, token
.
Nach der Umleitung sollten Sie diese Parameter aus der Abfragezeichenfolge abrufen (beachten Sie dabei, dass die Groß- und Kleinschreibung beachtet wird!), die Zahlung mit der PayPal API ( payment = paypalrestsdk.Payment.find(payment_id)
) finden und abschließen ( payment.execute({"payer_id": payer_id}):
).
Wenn die finalisierte Zahlung den Status in approved
ändert.
....
Gewinn!
UPD : Sie müssen in Ihren Kontoeinstellungen nicht "AutoRedirect" aktivieren und dieser Ansatz eignet sich für die Integration eines Kontos in mehrere Websites.
Tags und Links javascript paypal flask