我正在尝试将我的应用程序与 Twilio 集成以提供短信服务。 我希望每次收到短信时都能收到通知。
这就是我所做的
1-我定义了带有代理集成的 lambda 和 ApiGateway
2-我将端点 url 添加到 Twilio 控制台中的 Webhook 设置
一旦我向 Twilio 号码发送短信,lambda 确实会被触发,并且我能够处理该消息。
但是,当我尝试使用 Twilio 验证器来验证时,即使我不断收到事件无效的信息
这是处理帖子请求验证的代码片段
validator = RequestValidator(<'auth token'>)
post_body_dict = {key: value[0] for key, value in parse_qs(body).items()}
url = <'url as defined in Twilio's console'>
sig = event['headers'].get("X-Twilio-Signature")
is_valid = validator.validate(url, params, sig)
注释
1 - 请求正文作为查询参数字符串到达,即使它是 POST 请求 (param1=val1¶m2=val2...)
2 - 我还尝试在处理正文字符串时删除“+”(电话号码中的 + 前缀除外)
3 - 我也尝试过获取请求,但查询参数不是作为参数字符串而是作为解析的字典到达。
4 - 如果我没有使用 lambda,我只能验证请求,然后请求将来自发送者的原始查询参数字符串连接到 url,但我无法复制这是一个 lambda 环境。
我查看了 Twilio 的文档,但在我看来,当我使用 GET 请求时,即使从 api 网关到达,我也会丢失 lambda 中查询参数的原始顺序。关于帖子,我不知道为什么我无法使其发挥作用。
我尝试过的资源: 无法在 AWS Lambda 自定义授权方中验证 Twilio 请求, Twilio 请求验证对于语音通话始终失败(但适用于短信), twilio webhook:无法验证签名, https://www.twilio.com/docs/messaging/guides/webhook-request, twilio RequestValidator 无法在 python wsgi 中工作
还有其他一些。
在 Twilio 支持的帮助下,我能够解决这个问题(仅适用于 POST 请求,所以这是我将使用的)。 问题是,当获取 url 编码的帖子正文时,我将其转换为字典,但没有空值。
parsed_dict = parse_qs(event["body"])
result_dict = {key: value[0] for key, value in parsed_dict.items()}
我应该做的是
parsed_dict = parse_qs(event["body"], keep_blank_values=True)
result_dict = {key: value[0] for key, value in parsed_dict.items()}
然后验证器(url = url,params = result_dict,signiture = sig)工作了
关于 GET,我仍然不确定如何使其与 api gateway lambda 一起工作