创建GoToWebinar Webhook遇400错误:无效callbackUrl问题求助
我之前配置GoToWebinar Webhook时也踩过类似的坑,结合官方文档和你的情况,帮你排查几个核心问题:
1. 回调路由的请求方法不匹配
你当前的路由是GET方法,但GoToWebinar在验证回调URL有效性时,会发送POST请求进行测试(官方文档明确说明Webhook的回调事件和初始验证都使用POST方法)。你的GET路由无法接收这个验证请求,自然返回不了200状态码,导致报错。
修复方案:
修改路由,允许POST请求(或者同时支持GET和POST,兼容可能的预验证):
// 同时支持GET和POST请求 Route::match(['get', 'post'], 'g2w/webhook', function(Request $request) { return response()->json(['success'=>true], 200); }); // 或者仅支持POST(更符合官方规范) Route::post('g2w/webhook', function(Request $request) { return response()->json(['success'=>true], 200); });
2. 回调URL的结尾斜杠不统一
你提交的callbackUrl是https://website.com/g2w/webhook/(带结尾斜杠),但路由定义的是g2w/webhook(不带斜杠)。部分框架会对这种情况返回301重定向,GoToWebinar收到重定向响应后,会判定回调URL无效。
修复方案:
统一URL格式,要么去掉callbackUrl的结尾斜杠,要么在路由中加上斜杠:
// 如果保留带斜杠的URL,路由改成这样 Route::post('g2w/webhook/', function(Request $request) { return response()->json(['success'=>true], 200); });
或者直接把创建Webhook请求里的callbackUrl改为https://website.com/g2w/webhook。
3. 安全中间件拦截了请求
Laravel默认的VerifyCsrfToken中间件会拦截未携带CSRF令牌的POST请求,而GoToWebinar的验证请求不会携带这个令牌,导致请求被拦截,无法返回200。
修复方案:
把回调路由加入CSRF验证例外列表:
在app/Http/Middleware/VerifyCsrfToken.php文件中,修改$except数组:
protected $except = [ 'g2w/webhook', 'g2w/webhook/', // 可选,覆盖两种URL格式 ];
另外,还要检查服务器防火墙、WAF或者CDN是否拦截了来自GoToWebinar的请求,确保公网可以正常访问你的回调URL。
4. 验证回调URL的公网可访问性
确保你的回调URL是公网可访问的(不能是本地开发环境)。如果是本地测试,可以用ngrok之类的工具把本地服务暴露到公网,然后用Postman模拟POST请求测试,确认能正常返回200 OK。
按照上面的步骤调整后,再重新发送创建Webhook的请求,应该就能解决这个400错误了。
内容的提问来源于stack exchange,提问作者Yassin Mokni

