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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:08