PHP如何实现短信发送功能?代码示例与配置指南
- 虚拟主机
- 2025-12-19
- 7
PHP发送短信是许多Web应用中常见的功能需求,例如用户验证码、订单通知、营销推广等场景,实现这一功能通常需要借助第三方短信服务提供商的API接口,通过HTTP请求或SDK集成来完成,以下将详细介绍PHP发送短信的实现步骤、核心代码、注意事项及常见问题解决方案。
准备工作:选择短信服务提供商
在开始编写代码前,需先选择合适的短信服务提供商,国内常见的平台包括阿里云短信服务、腾讯云短信、容联云通讯、Twilio(国际)等,选择时需考虑以下因素:
- 接口稳定性:确保服务商提供高可用性的API。
- 发送成功率:优质的通道保障短信到达率。
- 价格:根据发送量选择合适的套餐。
- 支持功能:如模板短信、变量替换、状态报告等。
- 开发支持:是否提供PHP SDK或详细的API文档。
以阿里云短信服务为例,注册账号后获取以下关键信息:

- AccessKey ID 和 AccessKey Secret(用于身份验证)
- 短信签名(如“【您的公司名称】”)
- 短信模板(需审核通过,如“您的验证码是${code},5分钟内有效”)
核心实现步骤
安装依赖(可选)
若服务商提供PHP SDK,可通过Composer安装,以阿里云短信SDK为例:
composer require alibabacloud/dysmsapi20170525
配置参数
在PHP脚本中配置必要参数,建议使用环境变量或配置文件管理敏感信息:

发送短信代码实现
使用官方SDK(推荐)
use AlibabaCloudClientAlibabaCloud; use AlibabaCloudClientExceptionClientException; use AlibabaCloudClientExceptionServerException; use AlibabaCloudDysmsapiV20170525Dysmsapi; // 初始化SDK AlibabaCloud::accessKeyClient($config['access_key_id'], $config['access_key_secret']) >regionId('cnhangzhou') // 根据实际区域修改 >asDefaultClient(); try { $result = Dysmsapi::v20170525() >query() >setPhoneNumbers($config['phone_numbers']) >setSignName($config['sign_name']) >setTemplateCode($config['template_code']) >setTemplateParam($config['template_param']) >request(); // 处理响应 $response = $result>toArray(); if ($response['Code'] === 'OK') { echo "发送成功,请求ID:" . $response['RequestId']; } else { echo "发送失败:" . $response['Message']; } } catch (ClientException $e) { echo "客户端异常:" . $e>getErrorMessage(); } catch (ServerException $e) { echo "服务端异常:" . $e>getErrorMessage(); }
使用cURL直接调用API
$url = 'https://dysmsapi.aliyuncs.com/'; $params = [ 'Action' => 'SendSms', 'PhoneNumbers' => $config['phone_numbers'], 'SignName' => $config['sign_name'], 'TemplateCode' => $config['template_code'], 'TemplateParam' => $config['template_param'], 'Version' => '20170525', 'AccessKeyId' => $config['access_key_id'], 'Timestamp' => gmdate('YmdTH:i:sZ'), 'SignatureMethod' => 'HMACSHA1', 'SignatureVersion'=> '1.0', 'SignatureNonce' => uniqid(), 'Signature' => '', // 需计算签名 ]; // 计算签名(示例逻辑,具体需参考官方文档) $stringToSign = 'GET&' . urlencode('/') . '&' . urlencode(http_build_query($params)); $signature = base64_encode(hash_hmac('sha1', $stringToSign, $config['access_key_secret'] . '&', true)); $params['Signature'] = $signature; // 发送HTTP请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); // 解析响应 $result = json_decode($response, true); print_r($result);
发送状态监控
可通过服务商提供的“发送状态查询API”或回调接口(如阿里云的SmsUp)获取短信发送状态,用于记录日志或触发后续业务逻辑。

注意事项
- 频率限制:避免短时间内频繁发送同一手机号,可能被运营商拦截。
- 模板规范:严格遵循服务商的模板要求,变量需用包裹。
- 异常处理:网络超时、参数错误等需捕获异常并记录日志。
- 成本控制:开发测试时可使用测试账号或沙箱环境,避免产生费用。
- 国际短信:需确认服务商是否支持目标国家/地区,并添加国际区号。
常见问题对比表
| 问题场景 | 可能原因 | 解决方案 |
|---|---|---|
| 短信发送失败,提示InvalidTemplateParam | 模板变量缺失或格式错误 | 检查模板参数是否与定义一致,确保JSON格式正确 |
相关问答FAQs
Q1: 如何解决短信发送延迟问题?
A1: 延迟可能由网络拥堵、服务商处理速度慢或目标运营商网络问题导致,建议:① 选择高可用性服务商;② 优化代码逻辑,使用异步发送(如队列任务);③ 避免高峰期集中发送。
Q2: 短信签名被驳回怎么办?
A2: 首先查看驳回原因,通常涉及签名内容不规范(如未经授权的品牌名、敏感词汇等),需修改签名内容后重新提交审核,确保符合服务商规范(如需包含公司全称、且需提供营业执照等资质文件)。