You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio返回<Redirect>后Webhook验证失效如何处理?

Twilio 场景请求校验失败修复方案

核心问题根因

你遇到的校验失败是Redirect场景下的典型问题,由两个常见配置错误导致:

  • Laravel的$request->toArray()方法会自动合并URL查询参数与POST请求体参数,而Twilio的签名规则明确要求:URL自带的查询参数仅参与URL部分的签名计算,不会被二次纳入请求体参数的计算环节。你Redirect的URL携带了Enqueue=1查询参数,这部分参数被额外加入校验数据导致签名不匹配。
  • 若你的应用使用了反向代理(Nginx、CDN等)但未正确配置Laravel受信任代理,$request->fullUrl()获取到的协议、域名可能和你<Redirect>标签中填写的实际URL不一致,也会触发签名校验失败。

修复步骤

1. 修改Twilio校验中间件的参数获取逻辑

将中间件中获取请求数据的逻辑从获取全部参数,改为仅获取POST请求体参数,排除URL查询参数的干扰:

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Response;
use Twilio\Security\RequestValidator;

class TwilioRequestValidator
{
    public function handle($request, Closure $next)
    {
        $requestValidator = new RequestValidator(env('TWILIO_TOKEN'));
        // 仅获取POST请求体参数,不合并URL查询参数
        $requestData = $request->request->all();

        if (array_key_exists('bodySHA256', $requestData)) {
            $requestData = $request->getContent();
        }
        $isValid = false;

        if ($request->hasHeader('X-Twilio-Signature')) {
            $isValid = $requestValidator->validate(
                $request->header('X-Twilio-Signature'),
                $request->fullUrl(),
                $requestData
            );
        }

        if ($isValid) {
            return $next($request);
        } else {
            return new Response('Invalid Request', 403);
        }
    }
}

2. 配置受信任代理(存在反向代理场景时需要)

在app/Http/Middleware/TrustProxies.php中配置你的代理IP段,确保$request->fullUrl()能返回和<Redirect>标签中完全一致的URL(包含正确的https协议、域名、路径、查询参数)。

3. 可选校验

如果修改后仍有问题,可临时在中间件中打印校验用的三个核心参数:X-Twilio-Signature请求头、$request->fullUrl()返回值、$requestData数组,逐一核对和Twilio签名生成规则的匹配性即可定位问题。

内容的提问来源于stack exchange,提问作者james_bond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:27:02