当前位置:首页 > 虚拟主机 > 正文

PHP发送短信代码怎么写?附完整实现步骤和注意事项

在PHP中实现短信发送功能通常需要借助第三方短信服务提供商的API接口,常见的如阿里云短信、腾讯云短信、Twilio等,以下是使用PHP发送短信的详细代码示例和实现步骤,涵盖API请求、参数处理、错误处理等关键环节。

PHP发送短信代码怎么写?附完整实现步骤和注意事项 第1张

PHP发送短信代码怎么写?附完整实现步骤和注意事项 第2张

准备工作

  1. 选择短信服务商:注册账号并获取API Key、Secret Key及签名模板,以阿里云短信为例,需创建短信签名和短信模板,获取模板CODE。
  2. 安装依赖:若使用Composer管理依赖,可安装官方SDK(如aliyuncs/aliyunphpsdkcore)或使用cURL直接调用API。

代码实现(以阿里云短信为例)

使用cURL直接调用API

<?php /** * 阿里云短信发送示例 * @param string $phone 手机号 * @param string $templateCode 模板ID * @param array $templateParam 模板参数(如验证码) * @return array */ function sendSmsByAliyun($phone, $templateCode, $templateParam = []) { // 配置参数 $accessKeyId = 'LTAI4G...'; // 替换为你的AccessKeyId $accessKeySecret = '5K8v4...'; // 替换为你的AccessKeySecret $signName = '我的签名'; // 短信签名 $regionId = 'cnhangzhou'; // 地区ID // 请求参数 $params = [ 'PhoneNumbers' => $phone, 'SignName' => $signName, 'TemplateCode' => $templateCode, 'TemplateParam' => json_encode($templateParam), 'RegionId' => $regionId, 'Timestamp' => gmdate('YmdTH:i:sZ'), 'SignatureMethod' => 'HMACSHA1', 'SignatureVersion' => '1.0', 'SignatureNonce' => uniqid(), 'AccessKeyId' => $accessKeyId, ]; // 生成签名 $stringToSign = "GET&" . urlencode('/') . "&" . urlencode(http_build_query($params)); $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . "&", true)); $params['Signature'] = $signature; // 发送请求 $url = 'https://dysmsapi.aliyuncs.com/?' . http_build_query($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); curl_close($ch); // 解析响应 $result = json_decode($response, true); if (isset($result['Code']) && $result['Code'] === 'OK') { return ['success' => true, 'message' => '发送成功']; } else { return ['success' => false, 'message' => $result['Message'] ?? '发送失败']; } } // 调用示例 $phone = '13800138000'; $templateCode = 'SMS_123456789'; $templateParam = ['code' => '123456']; $result = sendSmsByAliyun($phone, $templateCode, $templateParam); print_r($result); ?>

使用Composer安装SDK

composer require aliyuncs/aliyunphpsdkcore aliyuncs/dysmsapiphpsdkgateway <?php require_once 'vendor/autoload.php'; use DysmsapiIntPopRequestV20170525SendSmsRequest; use AlibabaCloudClientAlibabaCloud; use AlibabaCloudClientExceptionClientException; use AlibabaCloudClientExceptionServerException; function sendSmsBySDK($phone, $templateCode, $templateParam) { try { AlibabaCloud::accessKeyClient('LTAI4G...', '5K8v4...') >regionId('cnhangzhou') >asDefaultClient(); $request = new SendSmsRequest(); $request>setPhoneNumbers($phone); $request>setSignName('我的签名'); $request>setTemplateCode($templateCode); $request>setTemplateParam(json_encode($templateParam)); $result = $request>client()>get($request>product()); return ['success' => true, 'message' => json_decode($result>getBody(), true)]; } catch (ClientException $e) { return ['success' => false, 'message' => $e>getErrorMessage()]; } catch (ServerException $e) { return ['success' => false, 'message' => $e>getErrorMessage()]; } } // 调用示例 $result = sendSmsBySDK('13800138000', 'SMS_123456789', ['code' => '123456']); print_r($result); ?>

关键参数说明

参数名 类型 必填 说明
PhoneNumbers string 目标手机号,支持逗号分隔的多个号码
SignName string 短信签名(需提前审核通过)
TemplateCode string 短信模板ID
TemplateParam string 模板变量JSON字符串,如{"code":"123456"}
Signature string 基于AccessKeySecret生成的签名

错误处理与日志记录

实际开发中需增加异常处理和日志记录,

PHP发送短信代码怎么写?附完整实现步骤和注意事项 第3张

if (!$result['success']) { error_log("短信发送失败: " . $result['message'], 3, '/var/log/sms_error.log'); throw new Exception($result['message']); }

安全注意事项

  1. 敏感信息保护:AccessKeySecret等密钥应通过环境变量或配置文件管理,避免硬编码。
  2. 频率限制:控制同一手机号的发送频率,防止被恶意调用。
  3. HTTPS加密:确保API请求使用HTTPS协议。

相关问答FAQs

Q1: 短信发送失败,返回”签名不匹配”错误如何解决?

A1: 检查SignName参数是否与阿里云控制台审核通过的签名完全一致,注意中英文符号差异,若签名未审核通过,需先提交审核。

Q2: 如何实现短信发送的异步处理?

A2: 可使用消息队列(如RabbitMQ、Redis)将发送请求加入队列,后台工作进程异步调用短信API。

// 生产者代码 $queue = new RedisQueue(); $queue>push('sms_queue', ['phone' => $phone, 'templateCode' => $code, 'param' => $param]); // 消费者代码(后台脚本) $queue = new RedisQueue(); while (true) { $task = $queue>pop('sms_queue'); if ($task) { sendSmsByAliyun($task['phone'], $task['templateCode'], $task['param']); } sleep(1); }

0