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'];
}
*/
?>
使用说明
- 首先实例化类,传入阿里云的AccessKey ID、AccessKey Secret、短信签名和模板CODE:
$sms = new AliyunSMS($accessKeyId, $accessKeySecret, '微诺企业', 'SMS_489165179');
- 然后调用
sendVerificationCode
方法发送短信:
$result = $sms->sendVerificationCode('手机号码', '验证码');
- 检查返回结果:
if ($result['success']) {
// 发送成功
} else {
// 发送失败,可以查看$result['message']获取错误信息
}
注意事项
- 确保你的阿里云账号已经开通了短信服务,并且有足够的余额。
- 确保你使用的短信签名和模板已经通过审核。
- 在生产环境中,建议添加适当的错误处理和日志记录。
- 为了安全考虑,建议将AccessKey ID和AccessKey Secret存储在安全的地方,不要直接硬编码在代码中。
这个实现遵循了阿里云短信服务的API签名机制,不使用官方SDK也能完成短信发送功能。