当前位置:首页 > 云服务器 > 正文

PHP如何接入短信功能?短信接口配置教程

在PHP项目中接入短信功能,通常需要以下步骤,这里以阿里云短信服务为例(其他服务商如西西云、容联云等流程类似):


准备工作

  1. 选择短信服务商

    常见服务商:阿里云、西西云、容联云通讯、云片网等(需企业资质认证)。

  2. 注册账号并认证

    完成企业实名认证(个人开发者部分功能受限)。

  3. 获取API密钥
    • 阿里云:AccessKey ID 和 AccessKey Secret
    • 西西云:SecretId 和 SecretKey
  4. 申请短信签名与模板
    • 签名:如 【公司名】(需审核)
    • 模板:如 您的验证码是:${code},5分钟内有效!(需审核)


PHP集成示例(阿里云SDK)

方法1:使用官方SDK(推荐)

  1. 安装SDK

    composer require alibabacloud/sdk
  2. 发送短信代码

    <?php use AlibabaCloudClientAlibabaCloud; use AlibabaCloudClientExceptionClientException; use AlibabaCloudClientExceptionServerException; // 配置AccessKey $accessKeyId = 'your_access_key_id'; $accessKeySecret = 'your_access_key_secret'; // 初始化客户端 AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret) ->regionId('cn-hangzhou') // 默认杭州区域 ->asDefaultClient(); try { $result = AlibabaCloud::rpc() ->product('Dysmsapi') ->version('2017-05-25') ->action('SendSms') ->method('POST') ->host('dysmsapi.aliyuncs.com') ->options([ 'query' => [ 'PhoneNumbers' => '13800138000', // 手机号 'SignName' => '短信签名', // 审核通过的签名 'TemplateCode' => 'SMS_12345678', // 审核通过的模板CODE 'TemplateParam' => json_encode(['code' => '1234']), // 模板变量 ], ]) ->request(); // 打印结果 print_r($result->toArray()); } catch (ClientException $e) { echo $e->getErrorMessage() . PHP_EOL; } catch (ServerException $e) { echo $e->getErrorMessage() . PHP_EOL; }


方法2:原生HTTP请求(无SDK)

<?php function sendSms($phone, $code) { $accessKeyId = 'your_access_key_id'; $accessKeySecret = 'your_access_key_secret'; $signName = '短信签名'; $templateCode = 'SMS_12345678'; $params = [ "AccessKeyId" => $accessKeyId, "Action" => "SendSms", "Format" => "JSON", "PhoneNumbers" => $phone, "RegionId" => "cn-hangzhou", "SignName" => $signName, "SignatureMethod" => "HMAC-SHA1", "SignatureNonce" => uniqid(), "SignatureVersion" => "1.0", "TemplateCode" => $templateCode, "TemplateParam" => json_encode(["code" => $code]), "Timestamp" => gmdate("Y-m-dTH:i:sZ"), "Version" => "2017-05-25" ]; // 生成签名 ksort($params); $query = ''; foreach ($params as $k => $v) { $query .= "&" . rawurlencode($k) . "=" . rawurlencode($v); } $stringToSign = "GET&%2F&" . rawurlencode(substr($query, 1)); $signature = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&", true)); // 构造请求URL $url = "http://dysmsapi.aliyuncs.com/?Signature=" . rawurlencode($signature) . $query; // 发送请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); } // 使用示例 $result = sendSms('13800138000', '123456'); print_r($result);


关键注意事项

  1. 安全防护

    • 验证码短信需设置有效期(通常5分钟)
    • 限制单手机号发送频率(如60秒内只能发1次)
    • 使用Redis记录发送状态防止刷接口
  2. 错误处理

    检查返回结果中的 Code 字段:

    PHP如何接入短信功能?短信接口配置教程 第1张

    • OK:发送成功
    • isv.BUSINESS_LIMIT_CONTROL:触发限流
    • 其他错误码参考阿里云文档
    • 生产环境建议

      • 使用队列异步发送短信,避免阻塞主流程
      • 敏感信息(如AccessKey)存储到环境变量中
      • 其他服务商快速接入

        西西云示例(使用SDK)

        use QcloudSmsSmsSingleSender; $appid = 1400000000; // SDK AppID $appkey = "your_app_key"; $phone = "13800138000"; $templateId = 12345; // 模板ID $ssender = new SmsSingleSender($appid, $appkey); $params = ["1234", "5"]; // 模板参数 $result = $ssender->sendWithParam("86", $phone, $templateId, $params); echo $result;


        常见问题解决

        1. 签名审核失败

          PHP如何接入短信功能?短信接口配置教程 第2张

          • 原因:名称与公司资质不符、包含敏感词
          • 解决:使用营业执照上的全称或简称
        2. 发送频率限制

          • 阿里云默认限制:同一手机号1条/分钟,5条/小时
          • 调整方式:在控制台申请短信频率提升
          • 本地调试方案

            • 使用虚拟短信服务(如云短信
            • 开发环境屏蔽真实短信发送(记录到日志)
            • 通过以上步骤,即可在PHP项目中快速接入短信功能,建议优先使用服务商官方SDK,并注意安全防护和错误处理机制。

              PHP如何接入短信功能?短信接口配置教程 第3张

0