0

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

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

我的 wordpress 插件挂钩到 'parse_request' 挂钩以拦截此请求,检查是否存在某个键以查看它是否是 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“流程”方面没有那么有经验来解决这个问题,并且无法使用谷歌或堆栈溢出在任何地方找到答案,我正在寻找您可能提供的任何帮助。此外,如果有比挂钩到“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();
    }
}
4

1 回答 1

1

因此,在与托管服务提供商进行了进一步调试后,很快就确定了原因(这不是 Wordpress 本身的问题):

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

把这个留在这里,以防其他人遇到这个问题。

于 2016-02-18T16:10:15.287 回答