操作挂钩 'parse_request' 对 Wordpress 的单个 GET 请求触发两次
Action hook 'parse_request' fires twice for single GET request to Wordpress
我在 Wordpress 中接收 GET 请求时遇到问题。
我正在为(以及其他)2Checkout 托管结账编写支付插件。客户提交表格后,他将被重定向到 2Checkout,他们可以在那里完成付款请求。付款成功后,客户将被引导回我的 wordpress 网站,并将付款详细信息作为 GET 参数 (http://example.org/success/?key1=value1&key2=value2...)。
我的 wordpress 插件挂接到 'parse_request' 挂钩以拦截此请求,检查是否存在某个键以查看它是否是 2Checkout 回复,然后验证请求并将其存储在 table.
此外,2Checkout 有一个叫做 'INS' 的东西 - 即时商家通知。基本上,这些是在后台发送的单独的 POST 付款请求消息 - 我也设置了这些消息并将它们指向我的 wordpress 站点,在那里它们被 'parse_request' 的相同钩子拦截,并且验证并存储在相同的 table.
当我测试支付时,我收到了直接的 GET 请求和 INS 请求,并将它们存储在 table 中。但是,GET 请求总是存储两次,因为处理请求的函数会为 GET 请求调用两次。然而,这仅适用于 GET 请求 - INS POST 请求仅出现一次并进行相应处理。
两者之间唯一不同的是 GET 请求实际上重定向到一个页面,其中 GET 参数用于显示自定义感谢消息。 POST 请求在后台处理(不面向用户)。
我已经检查过 2Checkout 并测试了将重定向发送到 requestb.in 并且 2Checkout 只发送一次 GET 请求。然而不知何故,它被我的插件处理了两次。
没有检查数据库是否存在 GET 请求条目(我认为这是一个丑陋的 hack,因为它没有解决问题),我不知道如何防止重复的 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();
}
}
因此,在与托管服务提供商进一步调试后,很快就确定了原因(这不是 Wordpress 本身的问题):
2Checkout 帐户中设置的 return URL 缺少结尾的 '/',导致服务器在请求到达时添加它,然后重新请求带有结尾斜杠的页面- 因此有 2 个 GET 请求。
把这个留在这里以防其他人遇到这个问题。
我在 Wordpress 中接收 GET 请求时遇到问题。
我正在为(以及其他)2Checkout 托管结账编写支付插件。客户提交表格后,他将被重定向到 2Checkout,他们可以在那里完成付款请求。付款成功后,客户将被引导回我的 wordpress 网站,并将付款详细信息作为 GET 参数 (http://example.org/success/?key1=value1&key2=value2...)。
我的 wordpress 插件挂接到 'parse_request' 挂钩以拦截此请求,检查是否存在某个键以查看它是否是 2Checkout 回复,然后验证请求并将其存储在 table.
此外,2Checkout 有一个叫做 'INS' 的东西 - 即时商家通知。基本上,这些是在后台发送的单独的 POST 付款请求消息 - 我也设置了这些消息并将它们指向我的 wordpress 站点,在那里它们被 'parse_request' 的相同钩子拦截,并且验证并存储在相同的 table.
当我测试支付时,我收到了直接的 GET 请求和 INS 请求,并将它们存储在 table 中。但是,GET 请求总是存储两次,因为处理请求的函数会为 GET 请求调用两次。然而,这仅适用于 GET 请求 - INS POST 请求仅出现一次并进行相应处理。
两者之间唯一不同的是 GET 请求实际上重定向到一个页面,其中 GET 参数用于显示自定义感谢消息。 POST 请求在后台处理(不面向用户)。
我已经检查过 2Checkout 并测试了将重定向发送到 requestb.in 并且 2Checkout 只发送一次 GET 请求。然而不知何故,它被我的插件处理了两次。
没有检查数据库是否存在 GET 请求条目(我认为这是一个丑陋的 hack,因为它没有解决问题),我不知道如何防止重复的 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();
}
}
因此,在与托管服务提供商进一步调试后,很快就确定了原因(这不是 Wordpress 本身的问题):
2Checkout 帐户中设置的 return URL 缺少结尾的 '/',导致服务器在请求到达时添加它,然后重新请求带有结尾斜杠的页面- 因此有 2 个 GET 请求。
把这个留在这里以防其他人遇到这个问题。