我在 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();
}
}