PHP
PHP通过API方式调用阿里云发送短信接口
PHP通过API方式调用阿里云发送短信接口
最近在开发一个项目的时候,需要用到阿里云短信发送接口进行验证码的发送,看了下官方文档,考虑到用SDK太占用空间,所以打算直接通过API方式,不走SDK的方式进行请求,主要涉及到签名部分,需要根据官方文档的说明自己写代码,下面跟大家分享这份代码,首先先是配置方法代码,主要是短信发送的配置信息,代码如下:
/**
* 获取变量配置
* @param $key
* @return mixed|string
*/
function _getConfigData($key)
{
#模板内容验证码:${code},请尽快完成验证,如非本人操作,请忽略本短信!
#默认值
$configValue = "";
#设置公告配置变量
$dataList = array(
"smsCode" => "短信模板", //短信模板
"smsAutograph" => "短信签名", //短信签名
"smsAccessKeyId" => "短信AccessKeyId", //短信AccessKeyId
"smsAccessKeySecret" => "短信AccessKeySecret", //短信AccessKeySecret
);
#获取值
if (isset($dataList[$key])) {
$configValue = $dataList[$key];
}
#返回
return $configValue;
} 然后是阿里云短信签名的加密代码,代码如下:
/**
* Get方式请求
* @param $url
* @return mixed
*/
function curlGet($url)
{
// 初始化curl
$ch = curl_init();
// 设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
// 运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
// 取出数据
$data = json_decode($res, true);
//返回
return $data;
}
/**
* 短信发送签名
* @param $parameters
* @param $accessKeySecret
* @return string
*/
function smsSignature($parameters, $accessKeySecret)
{
//排序
ksort($parameters);
//初始化签名字符串
$signString = '';
//循环参数
foreach ($parameters as $key => $value) {
$signString .= '&' . percentEncode($key) . '=' . percentEncode($value);
}
//字符串编码
$stringToSign = 'GET&%2F&' . percentEncode(substr($signString, 1));
//加密
$signature = base64_encode(hash_hmac('sha1', $stringToSign,$accessKeySecret . '&', true));
//返回
return $signature;
}
/**
* 字符串编码
* @param $string
* @return null|string|string[]
*/
function percentEncode($string)
{
$string = urlencode($string);
$string = preg_replace('/\+/', '%20', $string);
$string = preg_replace('/\*/', '%2A', $string);
$string = preg_replace('/%7E/', '~', $string);
return $string;
}最后是调用发送的代码
/**
* 发送短信验证码
* @param string $phone
* @param string $codeNumber
* @return array
*/
function _sendAliSMS($phone = "", $codeNumber = "")
{
#获取发送短信配置
$smsCode = _getConfigData("smsCode");
$smsAutograph = _getConfigData("smsAutograph");
$smsAccessKeyId = _getConfigData("smsAccessKeyId");
$smsAccessKeySecret = _getConfigData("smsAccessKeySecret");
#组合请求额外参数
$TemplateParam = array("code" => $codeNumber);
$TemplateParam = json_encode($TemplateParam);
#组合请求公共参数
$params = array( //此处作了修改
'SignName' => $smsAutograph, //短信签名
'Format' => 'JSON', //返回参数的语言类型
'Version' => '2017-05-25', //API 的版本号,取值范围:2017-05-25。
'AccessKeyId' => $smsAccessKeyId, //访问密钥 ID
'SignatureVersion' => '1.0', //签名算法版本。取值范围:1.0。
'SignatureMethod' => 'HMAC-SHA1', //签名方式。取值范围:HMAC-SHA1。
'SignatureNonce' => uniqid(), //签名唯一随机数
'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), //请求的时间戳。按照ISO8601 标准表示,并需要使用UTC时间,格式为yyyy-MM-ddTHH:mm:ssZ
'Action' => 'SendSms', //API 的名称
'TemplateCode' => $smsCode, //短信模版
'PhoneNumbers' => $phone, //接收手机号码
'TemplateParam' => $TemplateParam //额外参数
);
#根据参数获取签名
$params['Signature'] = smsSignature($params, $smsAccessKeySecret);
#请求地址
$url = 'http://dysmsapi.aliyuncs.com/?' . http_build_query($params);
#请求
$data = curlGet($url);
#判断是否发送成功
if (isset($data["Code"]) && $data["Code"] == "OK") {
return array("code" => 200, "msg" => $codeNumber);
} else {
return array("code" => 404, "msg" => "短信验证码请求异常");
}
}这样就可以通过API对方式调用阿里云发送短信接口给用户发送验证码短信。
0条评论