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

无法用AWS Lambda验证Twilio接收短信Webhook的问题

解决Lambda+ApiGateway集成Twilio时的签名验证失败问题

问题核心原因

  1. POST参数解码不匹配:parse_qs会自动将URL编码的参数值解码(比如把+转为空格),但Twilio生成签名时使用的是原始URL编码后的参数值,导致验证时拼接的字符串不一致。
  2. URL一致性问题:代码中配置的URL与Twilio控制台的Webhook URL存在差异(如结尾斜杠、协议、路径拼写错误),会直接导致签名验证失败。

解决方案

1. 正确处理POST参数(保留原始编码)

不要用parse_qs解析POST体,手动拆分原始字符串以保留参数的原始编码状态:

from twilio.request_validator import RequestValidator

def lambda_handler(event, context):
    # 替换为你的Twilio Auth Token
    auth_token = 'your-twilio-auth-token'
    validator = RequestValidator(auth_token)
    
    # 获取ApiGateway传递的原始POST请求体
    raw_body = event['body']
    post_params = {}
    
    # 手动拆分POST参数,不做URL解码
    for param_pair in raw_body.split('&'):
        if '=' in param_pair:
            key, value = param_pair.split('=', 1)
            post_params[key] = value
    
    # 必须与Twilio控制台配置的Webhook URL完全一致(包括https、域名、路径,无多余斜杠)
    webhook_url = 'https://your-api-gateway-url.execute-api.region.amazonaws.com/stage/webhook-path'
    twilio_signature = event['headers'].get('X-Twilio-Signature')
    
    is_valid = validator.validate(webhook_url, post_params, twilio_signature)
    
    if is_valid:
        # 验证通过,执行短信处理逻辑
        return {'statusCode': 200, 'body': 'Valid request'}
    else:
        return {'statusCode': 403, 'body': 'Invalid signature'}

2. 确保URL完全匹配

  • 登录Twilio控制台,复制Webhook配置的完整URL(包含https://、域名、完整路径,注意结尾是否有斜杠)。
  • 代码中的webhook_url必须与该URL完全一致,不能有任何大小写、斜杠、协议类型的差异。

3. 额外检查项

  • 确认ApiGateway的Lambda代理集成配置正确:开启「Use Lambda Proxy integration」,且未添加任何请求体转换规则。
  • 检查参数完整性:手动拆分参数时,注意处理空值或异常格式的参数对(比如无=的参数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:05:31