it-swarm.com.de

Init Action Hook läuft spät nach Paypal's Return URL?

Ich habe die Methode process_ipn, die auf dem Aktions-Hook init ausgeführt wird. Sieht so aus, als würde es ausgelöst, nachdem Paypal zum Händler zurückgekehrt ist. Unter dieser Methode konnte ich den Zahlungsstatus wie completed, pending, failed von Paypal herausfinden. Speichern Sie es in der Datenbank.

update_user_meta( $user_id, 'status', 'completed' );

Ich leite zurück zur Anmeldeseite von Paypals Rückgabe an den Händler mit hinzugefügtem user_id und form_id als Rückgabe-URL. Ich habe den login_message-Filter verwendet, um die Nachricht abhängig vom Zahlungsstatus zu überschreiben.

add_filter( 'login_message', array( $this,'custom_login_message' ) );

    public function custom_login_message() {

        $return =  base64_decode ( $_GET['wdb_return'] );
        $return = explode( '&', $return );
        $return = explode( '=', $return[1] );           
        $user_id = isset( $return[1] ) ? $return[1] : -1;

        if( 'completed' === get_user_meta( $user_id, 'status', true ) ) {
            return print_notice( __( 'Payment Completed. Now login.','wdp' ) );
        } else {
              return print_notice( __( 'Payment Failed','wdp' ) );
        }
    }

Die Rückkehr zum Händler führt zur Anmeldeseite zurück. Das Problem, dass der Status zu spät aktualisiert wird, nachdem die Anmeldeseite angezeigt wird. Payment Failed erscheint also, wenn ich sofort nach der Zahlung auf Zurück zum Händler klicke. Wenn ich ein paar Minuten nach der Zahlung gewartet habe und dann zum Händler zurückgekehrt bin, ist es in Ordnung.

Beachten Sie, dass $user_id von der Rückgabe-URL von Paypal abgerufen wird und gültig ist.

Was könnte die Lösung sein?

Vielen Dank!

5
Sanzeeb Aryal

Wenn ich Ihre Frage verstehe, ist die von Ihnen beschriebene Wettlaufsituation zwischen WordPress mit dem Wissen, dass die Transaktion "abgeschlossen" war und dem Benutzer, der zu Ihrer Site zurückkehrt, das Problem.

Was ist mit einer möglichen Lösung, wenn Sie Ihre Herangehensweise dahingehend ändern, dass diese Rennbedingung als echte Möglichkeit akzeptiert wird und nicht als etwas, das Sie vermeiden können? Sie erwähnen, dass einer der möglichen Paypal-Status "ausstehend" ist ...

Es ist Jahre her, seit ich mit Paypal gearbeitet habe, aber ich erinnere mich, dass der IPN-Feed manchmal eine ganze Weile verzögert sein kann.

Angenommen, Sie verwenden Ajax: Sie können die Anmeldeseite mit einem bedingten Kästchen anzeigen oder eine Interstitial-Seite für die Transaktionsverarbeitung verwenden, die zur Anmeldung umleitet. Ihr Vorgang könnte sich bei Ihrem Kunden bedanken, eine Throbber-Animation anzeigen und erklären, dass Sie die Transaktion abwickeln bzw. auf eine Zahlungsbestätigung von Paypal warten.

Ihre Seite kann weiterhin WordPress abrufen und wenn das Meta statusdes Benutzers "vollständig" ist, können Sie den Benutzer aktualisieren und ihm das Anmeldeformular anzeigen. Wenn es "fehlgeschlagen" ist, können Sie dementsprechend vorgehen.

Ich bin nicht sicher, ob Sie den Paypal-Status "ausstehend" in der Benutzermeta festlegen, aber eine einfache Möglichkeit, diesen Fall auszulösen, besteht darin, in der Anfrage von Paypal zu prüfen, ob der user_id und der form_id vorhanden sind.

In Fällen, in denen das IPN schnell aktualisiert wird und/oder der Benutzer vor der Rückkehr zu Ihrer Website eine Pause einlegt, kann der Fall "Zahlung erfolgreich" bereits nahtlos funktionieren, da keine Throbber oder ähnliches angezeigt werden müssen.

Ich denke Ajax ist der beste Ansatz. Eine fortlaufende Umfrage alle paar Sekunden mag so klingen, als würden Sie eine Menge Anfragen generieren, aber ich bezweifle, dass Sie Dutzende von Benutzern haben werden, die darauf warten, zu einem bestimmten Zeitpunkt ihr Transaktionsergebnis herauszufinden. Wenn du das tust, Glückwunsch, verdienst du viel Geld :)

WordPress hat auch eine Heartbeat-API, aber die schnellste, die abgefragt werden kann, sind 15 Sekunden. Web Sockets ist ein anderer Ansatz, aber wahrscheinlich übertrieben und bringt seine eigenen Komplexitäten mit sich.

Hier ist ein Tutorial, das eine Beispielimplementierung abdeckt: https://premium.wpmudev.org/blog/using-ajax-with-wordpress/

Als Referenz für Dokumente: https://developer.wordpress.org/plugins/javascript/ajax/

Informationen zur ständigen Überprüfung von JavaScript alle paar Sekunden finden Sie unter setInterval() und setTimeout() unter den folgenden Verweisen: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval und es gibt immer: https : //www.w3schools.com/js/js_timing.asp

Viel Glück!

2
firxworx

Mit der Funktion sleep() kann die Ausführung verzögert werden.

add_filter( 'login_message', array( $this,'custom_login_message' ) );

public function custom_login_message() {
        sleep(5);

        $return =  base64_decode ( $_GET['wdb_return'] );
        $return = explode( '&', $return );
        $return = explode( '=', $return[1] );           
        $user_id = isset( $return[1] ) ? $return[1] : -1;
        .
        .

Jetzt lautet der Hinweis "Zahlung abgeschlossen". Jetzt einloggen. ' bei erfolgreicher Zahlung. Weil die Ausführung aufgrund des verzögerten Prozesses von Paypal verzögert ist. Allerdings ich denke, ich brauche eine echtere Antwort.

0
Sanzeeb Aryal

Eine andere native Wordpress-Methode ist die Verwendung der WP_Cron-Zeitplanung. Betrachten Sie die Funktionen wp_schedule_event() und wp_unschedule_event(), die unter Ihren Anmelde-Hooks ausgeführt werden. Jedes Mal, wenn Benutzer die Seite aufrufen, überprüft der Cron den Remote-Status und aktualisiert Ihre Datenbank bei Erfolg. Im letzten Fall können Sie die Planung des Ereignisses aufheben und Ihrem Benutzer eine entsprechende Nachricht oder Seite anzeigen.

Vorteile der Lösung: * Der Client sendet nicht wiederholt Ajax-Anforderungen. * Sie müssen JS nicht kennen. Weisen Sie einfach Ihre vorhandene Funktion einem anderen Hook zu und fügen Sie ein paar einfachere Logik hinzu. * Verwendung von nativen Wordpress-Funktionen

Nachteile der Lösung: * Wenn Sie einen großen Datenverkehr auf der Website haben, ziehen Sie in Betracht, statt Wordpress eine andere CRON-Bibliothek zu verwenden

links: https://codex.wordpress.org/Function_Reference/wp_schedule_eventhttps://code.tutsplus.com/articles/insights-into-wp-cron-an-introduction-to-scheduling-tasks -in-WordPress - wp-23119

0
Paul Burilichev