在PayPal的返回URL之后,init动作钩子运行得很晚吗?

时间:2018-08-02 作者:Sanzeeb Aryal

我有process_ipn 在上运行的方法init 行动挂钩。看起来它是在贝宝返回商户后被解雇的。在这种方法下,我可以找到付款状态,如completed, pending, failed 来自贝宝。然后,将其保存到数据库中。

update_user_meta( $user_id, \'status\', \'completed\' );
我正在从PayPal返回商户并添加user_idform_id 返回url。我用了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 如果我在付款后立即单击return to merchant(返回给商户),则会显示。如果我在付款后等待几分钟,然后返回商户,就可以了。

请注意$user_id 从PayPal的返回url获取,并且有效。

解决方案是什么?

谢谢

3 个回复
SO网友:firxworx

如果我理解你的问题,你所描述的WordPress知道交易“完成”和用户返回你的站点之间的竞争条件就是问题所在。

关于一个潜在的解决方案,如何改变你处理这一问题的方式,使这种比赛条件被接受为一种真正的可能性,而不是你可以避免的事情?您确实提到贝宝可能的状态之一是“待定”。。。

我已经多年没有与贝宝合作了,但我记得IPN feed有时会滞后很长一段时间。

假设您使用ajax:您可以使用一个条件框显示登录页面,或者您可以使用一个中间的“事务处理”页面重定向到登录。您的流程可以感谢您的客户,显示跳动动画,并解释您正在处理交易/等待贝宝的付款确认。

您的页面可以在用户的元status 如果“完成”,您可以更新用户并向他们显示登录表单,如果“失败”,您可以相应地进行处理。

我不确定您是否在用户元中设置了Paypal“挂起”状态,但不管怎样,触发这种情况的一种简单方法是检查user_idform_id 在贝宝的请求中。

在IPN快速更新和/或用户在返回站点之前暂停的情况下,“支付成功”案例可以按照您的意愿无缝工作:无需显示任何心跳或类似的内容。

我认为ajax是最好的方法。每隔几秒钟进行一次连续的民意调查听起来可能会产生很多请求,但我怀疑在任何时候都会有大量用户等待了解他们的事务结果。如果你做到了,恭喜你,你赚了很多钱:)

WordPress也有心跳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

祝你好运

SO网友:Sanzeeb Aryal

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的延迟流程导致执行延迟。然而I think I need more genuine answer.

SO网友:Paul Burilichev

另一种原生Wordpress方法是使用WP\\u Cron调度。考虑wp_schedule_event()wp_unschedule_event() 函数,它在您的登录挂钩下运行。每次用户询问页面时,Cron都会检查远程状态,并在成功时更新数据库。在最后一种情况下,您可以取消活动计划,并向用户显示适当的消息或页面。

该解决方案的优点:*客户端不会重复发送ajax请求*无需了解JS,只需将现有函数分配给另一个挂钩,并添加一些更简单的逻辑。*使用本机Wordpress功能

该解决方案的缺点:*如果您的网站流量很大,请考虑使用另一个CRON库,而不是Wordpress

链接: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

结束

相关推荐

Wp-login.php注册/丢失按钮的密码链接?

如何设置wp登录的样式。php注册/丢失密码链接到按钮,以简化移动UI?在哪里可以找到将ahref附加到提交的HTML?那个按钮的样式是哪个CSS文件?无需更改对操作的调用,只需将文本链接更改为按钮即可!任何帮助或指导都将不胜感激!