Action hook' parse_request'对Wordpress的单个GET请求触发两次

时间:2016-02-16 17:13:44

标签: php wordpress plugins 2checkout

我在Wordpress中收到GET请求时遇到问题。

我正在为(其中包括)2Checkout托管结帐编写付款插件。一旦客户提交表单,他就会被重定向到2Checkout,在那里他们可以完成付款请求。成功付款后,客户将被定向回我的wordpress网站,其付款详细信息为GET参数(http://example.org/success/?key1=value1&key2=value2..。)。

我的wordpress插件挂钩了' parse_request' hook来拦截这个请求,检查是否存在某个密钥以查看它是否是2Checkout回复,然后验证并将请求存储在表中。

此外,2Checkout还有一种名为“INS' - 即时商家通知。基本上这些是在后台发送的付款的单独POST请求消息 - 我也设置了这些消息并将它们指向我的wordpress网站,在那里它们被同一个钩子拦截到parse_request'并且还验证并存储在同一个表中。

当我测试付款时,我会按预期收到直接GET请求和INS请求,并将其存储在表中。但是,GET请求总是存储两次,因为处理请求的函数被调用两次以用于GET请求。这仅适用于GET请求 - INS POST请求仅出现一次并相应处理。

两者之间唯一不同的是,GET请求实际上重定向到一个页面,其中GET参数用于显示自定义的感谢消息。 POST请求在后台处理(不面向用户)。

我已经检查了2Checkout并测试了将重定向发送到requestb.in并且2Checkout仅发送一次GET请求。但不知怎的,它被我的插件处理了两次。

没有检查数据库中是否存在GET请求的现有条目(我认为这是一个丑陋的黑客,因为它没有解决问题),我不知道如何防止重复的GET请求。

因为我没有经验丰富的wordpress" flow"想通过google或堆栈溢出找不到任何答案,我正在寻找你可能提供的任何帮助。此外,如果有更好的方法可以做到这一点,而不是挂钩'parse_request',那么任何信息都会受到赞赏。

示例代码(简化显示原理):

class MyController {

    public function __construct() {
        $this->register_hooks();
    }

    private function register_hooks() {
        add_action('parse_request', array($this, 'handle_request'));
    }

    public function handle_request( $wp ) {
        if( !isset($_REQUEST['2Checkout_variable'] ) {
            return;
        }
        $request_handler = new MyPluginRequestHandler($_REQUEST);
        $request_handler->handle_request();
    }
}

1 个答案:

答案 0 :(得分:0)

因此,在与托管服务提供商进行了一些进一步的调试之后,很快就找到了原因(而且这不是Wordpress问题):

2Checkout帐户中设置的返回URL缺少尾随'/',导致服务器在请求到达时添加它,然后重新请求带有斜杠的页面 - 因此有2个GET请求。

离开这里以防其他人遇到这个问题。