web-dev-qa-db-ja.com

Paypalの返却URLの後にinitアクションフックが遅くなりますか?

initアクションフックで実行するprocess_ipnメソッドがあります。 Paypalがマーチャントに戻った後に解雇されたようです。この方法では、Paypalのcompletedpendingfailedなどの支払い状況を確認できます。そして、それをデータベースに保存してください。

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

PayPalのマーチャントへのリターンからログインページに戻り、リターンURLにuser_idform_idを追加しました。支払い状況に応じてメッセージを上書きするためにlogin_messageフィルタを使用しました。

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' ) );
        }
    }

マーチャントに戻るとログインページに戻ります。ログインページが表示された後にステータスが更新されるのが遅すぎるという問題。そのため、支払い後すぐにマーチャントに戻るをクリックするとPayment Failedが表示されます。支払い後数分待ってから商人に戻っても、問題ありません。

$user_idはPaypalからの戻りURLから取得され有効であることに注意してください。

解決策は何ですか?

ありがとうございます。

5
Sanzeeb Aryal

私があなたの質問を理解するならば、あなたがあなたがトランザクションが「完了した」と知っているWordPressとあなたのサイトに戻っているユーザーの間で述べる競争条件は問題です。

潜在的な解決策に関して、この競合状態があなたが避けることができる何かよりもむしろ本当の可能性として受け入れられるようにあなたがこれに近づいている方法を変えることについてはどうですか?あなたは可能なペイパルステータスの1つが「保留中」であると述べていますか...

私がPaypalで仕事をしてから何年も経ちましたが、IPNフィードは時々かなり遅れることを思い出します。

あなたがajaxを使っているとしましょう:あなたは条件付きのボックスでログインページを見せることができます、あるいはあなたはログインにリダイレクトするインタースティシャル 'トランザクション処理'ページを使うことができます。あなたのプロセスはあなたの顧客に感謝し、ズキズキするアニメーションを見せて、そしてあなたが取引を処理している/ Paypalからの支払い確認を待っていると説明することができました。

あなたのページはWordPressをポーリングし続けることができ、ユーザーのメタstatusが "完了"したときにユーザーを更新してログインフォームを表示することができ、 "失敗"した場合はそれに応じて対処できます。

ユーザーのmetaでPaypalの "pending"ステータスを設定しているかどうかはわかりませんが、この場合のトリガーとして簡単な方法は、Paypalからのリクエストでuser_idform_idの存在を確認することです。

あなたのサイトに戻る前にIPNが素早く更新されたりユーザーが一時停止したりした場合、 '支払い成功'ケースはあなたが望むように既にシームレスに働くことができました。

私はajaxが最良の方法だと思います。 2、3秒ごとに継続的なポーリングを行っていると大量のリクエストが生成されているように思われるかもしれませんが、一度に何人ものユーザーがトランザクションの結果を見つけるのを待っていることでしょう。もしそうなら、おめでとう、あなたはたくさんのお金を稼いでいる:)

WordPressにはHeartbeat APIもありますが、これをポーリングできる最も速いのは15秒です。 Webソケットも別のアプローチですが、おそらくやり過ぎであり、独自の複雑さが発生します。

これが実装例をカバーするチュートリアルです: https://premium.wpmudev.org/blog/using-ajax-with-wordpress/

参考文献については、 https://developer.wordpress.org/plugins/javascript/ajax/ を参照してください。

JavaScriptを数秒ごとに継続的にチェックさせるには、setInterval()setTimeout()のリファレンスを参照してください。 https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval そして常に: https ://www.w3schools.com/js/js_timing.asp

がんばろう!

2
firxworx

sleep()関数は実行を遅らせるために使うことができます。

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

今、通知は「支払い完了」です。今すぐログイン支払いに成功しました。実行がPaypalの遅れたプロセスに応答して遅れるからです。しかし 私はもっと本物の答えが必要だと思います。

0
Sanzeeb Aryal

WordPressのもう一つの方法はWP_Cronスケジューリングを使うことです。あなたのログインフックの下で動作するwp_schedule_event()wp_unschedule_event()の機能を考えてみましょう。ユーザーがページを要求するたびに、Cronはリモートステータスをチェックし、成功時にデータベースを更新します。最後のケースでは、イベントのスケジュールを解除してユーザーに適切なメッセージまたはページを表示できます。

解決策の長所:*クライアントはajaxリクエストを繰り返し送信しません*既存の関数を別のフックに割り当て、さらに簡単なロジックを追加するだけで、JSを知る必要がありません。 *ネイティブWordpress機能の使用

解決策の短所:*ウェブサイトに大量のトラフィックがある場合は、Wordpressの代わりに別のCRONライブラリを使用することを検討してください。

リンク: https://codex.wordpress.org/Function_Reference/wp_schedule_eventhttps://code.tutsplus.com/articles/insights-into-wp-cron-an-introduction-to-scheduling-tasksワードプレス - wp-23119

0
Paul Burilichev