代码 阿里云发送短信php

2025-06-16 20:36:07 +0800 CST views 25

PHP 类:阿里云短信服务(不使用SDK)

以下是一个不使用阿里云官方SDK,直接通过HTTP请求发送短信的PHP类实现:

<?php

class AliyunSMS
{
    private $accessKeyId;
    private $accessKeySecret;
    private $signName;
    private $templateCode;
    private $regionId = 'cn-hangzhou';
    private $domain = 'dysmsapi.aliyuncs.com';
    private $version = '2017-05-25';
    private $action = 'SendSms';

    /**
     * 构造函数
     * 
     * @param string $accessKeyId     阿里云AccessKey ID
     * @param string $accessKeySecret 阿里云AccessKey Secret
     * @param string $signName        短信签名名称
     * @param string $templateCode    短信模板CODE
     */
    public function __construct($accessKeyId, $accessKeySecret, $signName, $templateCode)
    {
        $this->accessKeyId = $accessKeyId;
        $this->accessKeySecret = $accessKeySecret;
        $this->signName = $signName;
        $this->templateCode = $templateCode;
    }

    /**
     * 发送短信验证码
     * 
     * @param string $phoneNumber 手机号码
     * @param string $code        验证码
     * @return array              返回结果
     */
    public function sendVerificationCode($phoneNumber, $code)
    {
        $templateParam = json_encode(['code' => $code]);
        
        $params = [
            'RegionId' => $this->regionId,
            'AccessKeyId' => $this->accessKeyId,
            'Format' => 'JSON',
            'SignatureMethod' => 'HMAC-SHA1',
            'SignatureVersion' => '1.0',
            'SignatureNonce' => uniqid(),
            'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
            'Action' => $this->action,
            'Version' => $this->version,
            'PhoneNumbers' => $phoneNumber,
            'SignName' => $this->signName,
            'TemplateCode' => $this->templateCode,
            'TemplateParam' => $templateParam
        ];

        // 生成签名
        $params['Signature'] = $this->generateSignature($params);

        // 构建请求URL
        $url = 'https://' . $this->domain . '/?' . http_build_query($params);

        // 发送请求
        return $this->sendRequest($url);
    }

    /**
     * 生成签名
     * 
     * @param array $params 请求参数
     * @return string       签名
     */
    private function generateSignature($params)
    {
        // 按参数名排序
        ksort($params);

        // 生成规范化请求字符串
        $canonicalizedQueryString = '';
        foreach ($params as $key => $value) {
            $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value);
        }
        $canonicalizedQueryString = substr($canonicalizedQueryString, 1);

        // 生成待签名字符串
        $stringToSign = 'GET&%2F&' . $this->percentEncode($canonicalizedQueryString);

        // 计算签名
        $signature = base64_encode(hash_hmac('sha1', $stringToSign, $this->accessKeySecret . '&', true));

        return $signature;
    }

    /**
     * URL编码
     * 
     * @param string $str 原始字符串
     * @return string     编码后的字符串
     */
    private function percentEncode($str)
    {
        $res = urlencode($str);
        $res = preg_replace('/\+/', '%20', $res);
        $res = preg_replace('/\*/', '%2A', $res);
        $res = preg_replace('/%7E/', '~', $res);
        return $res;
    }

    /**
     * 发送HTTP请求
     * 
     * @param string $url 请求URL
     * @return array     响应数据
     */
    private function sendRequest($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        
        $response = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);

        if ($error) {
            return [
                'success' => false,
                'message' => 'CURL Error: ' . $error
            ];
        }

        $result = json_decode($response, true);

        if (isset($result['Code']) && $result['Code'] == 'OK') {
            return [
                'success' => true,
                'message' => '短信发送成功',
                'data' => $result
            ];
        } else {
            return [
                'success' => false,
                'message' => isset($result['Message']) ? $result['Message'] : '短信发送失败',
                'code' => isset($result['Code']) ? $result['Code'] : 'Unknown',
                'data' => $result
            ];
        }
    }
}

// 使用示例
/*
$accessKeyId = '你的AccessKeyId';
$accessKeySecret = '你的AccessKeySecret';
$signName = '微诺企业'; // 短信签名
$templateCode = 'SMS_489165179'; // 短信模板CODE

$sms = new AliyunSMS($accessKeyId, $accessKeySecret, $signName, $templateCode);
$result = $sms->sendVerificationCode('13800138000', '123456'); // 手机号和验证码

if ($result['success']) {
    echo '短信发送成功';
} else {
    echo '短信发送失败: ' . $result['message'];
}
*/
?>

使用说明

  1. 首先实例化类,传入阿里云的AccessKey ID、AccessKey Secret、短信签名和模板CODE:
$sms = new AliyunSMS($accessKeyId, $accessKeySecret, '微诺企业', 'SMS_489165179');
  1. 然后调用sendVerificationCode方法发送短信:
$result = $sms->sendVerificationCode('手机号码', '验证码');
  1. 检查返回结果:
if ($result['success']) {
    // 发送成功
} else {
    // 发送失败,可以查看$result['message']获取错误信息
}

注意事项

  1. 确保你的阿里云账号已经开通了短信服务,并且有足够的余额。
  2. 确保你使用的短信签名和模板已经通过审核。
  3. 在生产环境中,建议添加适当的错误处理和日志记录。
  4. 为了安全考虑,建议将AccessKey ID和AccessKey Secret存储在安全的地方,不要直接硬编码在代码中。

这个实现遵循了阿里云短信服务的API签名机制,不使用官方SDK也能完成短信发送功能。

复制全文 生成海报 编程 API 短信服务 阿里云 PHP

推荐文章

Gin 与 Layui 分页 HTML 生成工具
2024-11-19 09:20:21 +0800 CST
H5端向App端通信(Uniapp 必会)
2025-02-20 10:32:26 +0800 CST
详解 Nginx 的 `sub_filter` 指令
2024-11-19 02:09:49 +0800 CST
跟着 IP 地址,我能找到你家不?
2024-11-18 12:12:54 +0800 CST
MySQL设置和开启慢查询
2024-11-19 03:09:43 +0800 CST
Vue3中如何进行错误处理?
2024-11-18 05:17:47 +0800 CST
Go 并发利器 WaitGroup
2024-11-19 02:51:18 +0800 CST
任务管理工具的HTML
2025-01-20 22:36:11 +0800 CST
Vue3中如何处理WebSocket通信?
2024-11-19 09:50:58 +0800 CST
CSS 媒体查询
2024-11-18 13:42:46 +0800 CST
10个极其有用的前端库
2024-11-19 09:41:20 +0800 CST
Linux 常用进程命令介绍
2024-11-19 05:06:44 +0800 CST
PHP如何进行MySQL数据备份?
2024-11-18 20:40:25 +0800 CST
Flet 构建跨平台应用的 Python 框架
2025-03-21 08:40:53 +0800 CST
12 个精选 MCP 网站推荐
2025-06-10 13:26:28 +0800 CST
程序员茄子在线接单