如何在PHP应用中验证SignalWire LAML Webhook推送的SMS消息?
PHP实现SignalWire SMS Webhook验证
SignalWire的Webhook签名验证逻辑与Twilio兼容,核心是通过HMAC-SHA1算法,用你的Auth Token重新计算请求签名,与请求头中的签名对比,确认请求合法性。以下是完整的PHP实现方案:
前置准备
- 你的SignalWire项目Auth Token(在SignalWire控制台的项目设置中获取)
- 与SignalWire控制台配置完全一致的Webhook完整URL(包含协议、域名、路径、查询参数,比如
https://your-app.com/sms-webhook)
验证步骤与代码实现
<?php // 替换为你的SignalWire Auth Token $authToken = 'your_signalwire_auth_token'; // 替换为SignalWire控制台配置的完整Webhook URL $webhookUrl = 'https://your-app.com/sms-webhook'; // 提取请求头中的签名与时间戳 $requestSignature = $_SERVER['HTTP_X_SIGNALWIRE_SIGNATURE'] ?? ''; $requestTimestamp = $_SERVER['HTTP_X_SIGNALWIRE_TIMESTAMP'] ?? ''; // 1. 验证时间戳,防止重放攻击(拒绝5分钟前的请求) $currentTime = time(); if (abs($currentTime - $requestTimestamp) > 300) { http_response_code(403); exit('Invalid timestamp'); } // 2. 获取并排序POST参数(必须按key的ASCII顺序排序) $postData = $_POST; ksort($postData); // 3. 构建待签名的字符串 $paramString = http_build_query($postData, '', '&'); $signingString = $requestTimestamp . $webhookUrl . $paramString; // 4. 计算HMAC-SHA1签名并Base64编码 $calculatedSignature = base64_encode(hash_hmac('sha1', $signingString, $authToken, true)); // 5. 对比签名(移除请求头中的sha1=前缀) $expectedSignature = str_replace('sha1=', '', $requestSignature); if ($calculatedSignature !== $expectedSignature) { http_response_code(403); exit('Invalid request signature'); } // 签名验证通过,处理SMS消息逻辑 // 示例:获取短信内容 $smsBody = $_POST['Body'] ?? ''; // 这里添加你的业务代码 echo 'Request validated successfully'; ?>
关键注意事项
- URL一致性:
$webhookUrl必须与SignalWire控制台配置的完全一致,包括协议(http/https)、路径、查询参数,任何差异都会导致签名不匹配 - 参数完整性:不要修改或转义POST参数,必须使用原始的
$_POST数据,否则签名计算会出错 - HTTPS要求:建议使用HTTPS作为Webhook协议,避免请求内容和签名被中间人篡改
- 时间戳验证:虽然是可选步骤,但能有效防止攻击者重放旧的合法请求,提升安全性
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

