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

发表评论