Paypal Integration in Flask-Anwendung

8

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:

  1. Ich kann keine Möglichkeit finden, einige Callbacks mit pyhtonrestsdk zu definieren. Wie man es macht?

  2. 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

  3. nicht aufrufen konnte
  4. 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.

    
Alex G.P. 16.12.2015, 23:28
quelle

1 Antwort

2

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:

%Vor%

Endlich habe ich folgenden Workflow:

  1. 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).

  2. 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).

  3. 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)

  4. zurück
  5. 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 .

  6. 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}): ).

  7. Wenn die finalisierte Zahlung den Status in approved ändert.

  8. ....

  9. 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.

    
Alex G.P. 22.12.2015, 13:08
quelle

Tags und Links