短信(阿里云请求接口)

短信类

<?php
/**
 *
 * Enter description here ...
 * @author Lance
 *
 */
class ZSms
{

    /**
     * 阿里云短信验证码发送类
     */
    // 保存错误信息
    public $error;
    // Access Key ID
    private $accessKeyId = '';
    // Access Access Key Secret
    private $accessKeySecret = '';
    // 签名
    private $signName = '';
    // 模版ID
    private $templateCode = '';
    //短信模板中参数
    private $templatePara = '';

    public function __construct($config = array())
    {

        $this->accessKeyId =$config['accessKeyId '];
        $this->accessKeySecret =$config['accessKeySecret '];
        $this->signName = $config ['signName'];
        $this->templateCode = $config ['templateCode'];
    }

    function percentEncode($str)
    {
        // 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
        $res = urlencode($str);
        $res = preg_replace('/\+/', '%20', $res);
        $res = preg_replace('/\*/', '%2A', $res);
        $res = preg_replace('/%7E/', '~', $res);
        return $res;
    }

    function https_request($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($curl);
        if (curl_errno($curl)) {return 'ERROR '.curl_error($curl);}
        curl_close($curl);
        return $data;
    }

    function xml_to_array($xml){
        $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
        if(preg_match_all($reg, $xml, $matches)){
            $count = count($matches[0]);
            for($i = 0; $i < $count; $i++){
                $subxml= $matches[2][$i];
                $key = $matches[1][$i];
                if(preg_match( $reg, $subxml )){
                    $arr[$key] = $this -> xml_to_array( $subxml );
                }else{
                    $arr[$key] = $subxml;
                }
            }
        }
        return @$arr;
    }

    /**
     * 签名
     *
     * @param  $parameters
     * @param  $accessKeySecret
     * @return string
     */
    function computeSignature($parameters, $accessKeySecret)
    {
        // 将参数Key按字典顺序排序
        ksort($parameters);
        // 生成规范化请求字符串
        $canonicalizedQueryString = '';
        foreach($parameters as $key => $value)
        {
            $canonicalizedQueryString .= '&' . $this -> percentEncode($key)
                . '=' . $this -> percentEncode($value);
        }
        // 生成用于计算签名的字符串 stringToSign
        $stringToSign = 'GET&%2F&' . $this -> percentencode(substr($canonicalizedQueryString, 1));
        //echo "<br>".$stringToSign."<br>";
        // 计算签名,注意accessKeySecret后面要加上字符'&'
        $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
        return $signature;
    }

    /**
     * 发送验证码
     *
     * @param unknown $mobile
     * @param unknown $verify_code
     *
     */
    public function send_verify($mobile,$verify_code)
    {
        $target = "https://dysmsapi.aliyuncs.com/?";
        $data = array(
            'AccessKeyId' =>  $this->accessKeyId,
            'Action' => 'SendSms',
            'Format' => 'XML',
            'OutId' => '123',
            'PhoneNumbers' =>$mobile,
            'RegionId' => 'cn-hangzhou',
            'SignName'=>'暖心致品',
            'SignatureMethod' => 'HMAC-SHA1',
            'SignatureNonce'=> uniqid(),
            'SignatureVersion' => '1.0',
            'TemplateCode' =>  $this->templateCode,
            'TemplateParam' => "{code:$verify_code}",
            'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
            'Version' => '2017-05-25'
        );
        // 计算签名并把签名结果加入请求参数
        $data['Signature'] = $this -> computeSignature($data, $this->accessKeySecret);
        $result = $this -> xml_to_array($this -> https_request($target.http_build_query($data)));

        dd($result);
        echo $result['Error']['Code']."--->".$result['Error']['Message'];
        echo "<br><br>".$target . http_build_query($data);
    }

    /**
     * 获取详细错误信息
     *
     * @param unknown $status
     */
    public function getErrorMessage($status)
    {

        $message = array(
            'InvalidDayuStatus.Malformed' => '账户短信开通状态不正确',
            'InvalidSignName.Malformed' => '短信签名不正确或签名状态不正确',
            'InvalidTemplateCode.MalFormed' => '短信模板Code不正确或者模板状态不正确',
            'InvalidRecNum.Malformed' => '目标手机号不正确,单次发送数量不能超过100',
            'InvalidParamString.MalFormed' => '短信模板中变量不是json格式',
            'InvalidParamStringTemplate.Malformed' => '短信模板中变量与模板内容不匹配',
            'InvalidSendSms' => '触发业务流控',
            'InvalidDayu.Malformed' => '变量不能是url,可以将变量固化在模板中'
        );
        if (isset ($message [$status])) {
            return $message [$status];
        }
        return $status;
    }
}

控制器调用

 $config = config('aliyun_sms');
        $data = [
            'accessKeyId' => $config ['accessKeyId'],                 //your appid
            'accessKeySecret' => $config ['accessKeySecret'],         //your app_secret
            'signName'    => $config ['signName'],                    //your 签名
            'templateCode' => $config ['templateCode'.$type],         //your 模板编号
            'templatePara' => $config ['templatePara'.$type]          //your 模板中的变量
        ];
        $sms = new \api\AliyunSms($data);
        $status = $sms->send_verify($mobile, $veryify_code);
        if(!$status)
            //短信发送失败
            return false;
        return true;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值