php发短信代码怎么写?有没有现成的示例参考?
- 虚拟主机
- 2025-12-19
- 5
在PHP中实现短信发送功能通常需要借助第三方短信服务商提供的API接口,以下是详细的实现步骤、代码示例及注意事项,涵盖主流服务商的接入方法、错误处理和最佳实践。

准备工作
- 选择短信服务商:国内常用阿里云、腾讯云、容联云等,国际服务有Twilio,需注册账号获取API Key、Secret及签名模板。
- 获取必要参数:
- AccessKeyID 和 AccessKeySecret(阿里云)
- AppID 和 AppKey(腾讯云)
- 短信签名(需审核通过)
- 模板ID(使用模板发送时)
阿里云短信发送示例
安装依赖
composer require aliyuncs/sdkphp
核心代码
<?php require_once 'vendor/autoload.php'; use AlibabaCloudClientAlibabaCloud; use AlibabaCloudClientExceptionClientException; use AlibabaCloudClientExceptionServerException; // 初始化 AlibabaCloud::accessKeyClient('你的AccessKeyID', '你的AccessKeySecret') >regionId('cnhangzhou') // 替换为你的区域 >asDefaultClient(); try { $result = AlibabaCloud::rpc() >product('Dysmsapi') >version('20170525') >action('SendSms') >method('POST') >host('dysmsapi.aliyuncs.com') >options([ 'query' => [ 'PhoneNumbers' => '13800138000', // 目标手机号 'SignName' => '你的签名', // 审核通过的签名 'TemplateCode' => 'SMS_12345678', // 模板ID 'TemplateParam' => json_encode(['code' => '123456', 'product' => '网站名称']) // 模板变量 ], ]) >request(); print_r($result>toArray()); } catch (ClientException $e) { echo "客户端异常: " . $e>getErrorMessage() . "n"; } catch (ServerException $e) { echo "服务端异常: " . $e>getErrorMessage() . "n"; } ?>
参数说明表
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| PhoneNumbers | string | 是 | 目标手机号,支持国际号码,需符合E.164格式 |
| SignName | string | 是 | 短信签名,需在阿里云控制台审核 |
| TemplateCode | string | 是 | 模板ID,需在控制台创建 |
| TemplateParam | string | 否 | JSON格式的模板变量,如{"code":"123456"} |
腾讯云短信发送示例
安装SDK
composer require qcloudsms/qcloudsms_php
核心代码
<?php require_once 'vendor/autoload.php'; use QcloudSmsSmsSingleSender; $appId = 1400000000; // 替换为你的AppID appKey = '9hr28yzio8v4y26h8i43w9z49y31qo7z'; // 替换为你的AppKey phoneNumbers = ['13800138000']; templateId = 123456; // 模板ID smsSign = '腾讯云'; // 签名名称 try { $ssender = new SmsSingleSender($appId, $appKey); $result = $ssender>sendWithParam("86", $phoneNumbers[0], $templateId, ["123456", "5"], $smsSign, "", "", ""); echo $result; } catch (Exception $e) { echo $e; } ?>
通用注意事项
- 频率限制:避免高频发送,可能触发服务商风控,审核**:签名和模板需符合当地法规,避免敏感词。
- 错误处理:服务商返回的错误码需妥善处理(如阿里云isv.INVALID_SIGNATURE)。
- HTTPS安全:所有API请求必须通过HTTPS协议。
完整流程优化建议
- 封装类:将API调用封装为可复用的类,支持多服务商切换。
- 日志记录:记录发送状态和错误信息,便于排查问题。
- 队列处理:使用Redis或RabbitMQ异步发送短信,避免阻塞主流程。
相关问答FAQs
Q1: 如何解决短信发送失败的问题?
A1: 首先检查服务商返回的错误码,常见问题包括:

- 签名未审核:确认签名状态为”通过”。
- 手机号格式错误:确保符合国际标准(如中国需带国家码+86)。
- 频率超限:降低发送频率或升级套餐。
可通过服务商控制台的发送日志定位具体原因。
Q2: 如何实现短信验证码的防刷机制?
A2: 可通过以下方式增强安全性:

- IP限制:同一IP每日发送次数上限(如10次)。
- 手机号限制:同一手机号60秒内仅允许发送一次。
- 图形验证码:高频触发时要求先输入图形码。
示例代码片段: $redis = new Redis(); $redis>connect('127.0.0.1', 6379); $key = 'sms_limit:'.$phone; if ($redis>get($key)) { die('发送过于频繁,请稍后再试'); } $redis>setex($key, 60, 1); // 60秒有效期