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条评论