无法用AWS Lambda验证Twilio接收短信Webhook的问题
解决Lambda+ApiGateway集成Twilio时的签名验证失败问题
问题核心原因
- POST参数解码不匹配:
parse_qs会自动将URL编码的参数值解码(比如把+转为空格),但Twilio生成签名时使用的是原始URL编码后的参数值,导致验证时拼接的字符串不一致。 - 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
相关产品推荐
相关产品推荐

