php 阿里云·短信发送

发布于:2023-02-05 ⋅ 阅读:(573) ⋅ 点赞:(0)

废话不多说,与文章 

PHP 阿里云OpenAPI签名[RPC 调用机制]·一键登录取号[云通信号码认证服务]_Purgatory001的博客-CSDN博客_php阿里云签名

区别不大,最重要的签名都解决了,剩下的都是弟弟。

<?php

/**
 * 阿里开放文档签名
 * @author lianyu001<1411479499@qq.com>
 * 2022-08-01
 */
class Ali_sms {

    public $data;
    public $accessKeyId = 'xxx'; //阿里后台拿
    public $accessKeySecret = 'xxxx'; //阿里后台拿
    public $url = 'https://dysmsapi.aliyuncs.com?'; //依据服务器那个快拿哪个,这个杭州的
    

    /**
     * new 的时候初始化参数
     * @param ary $actionArray     要调用的开放接口参数 数组,可以去除公共参数,后续如果有公共参数,自行添加在数组中或者 该类中都行
     * @param str $url             访问的服务器地址,看下自己服务器离哪个区域近拿哪个
     */
    public function __construct($actionArray, $url='https://dysmsapi.aliyuncs.com?') {
        $this->url = $url;
//        date_default_timezone_set("GTM");
        date_default_timezone_set("UTC");
//        date_default_timezone_set('Asia/Shanghai');
        $this->data = array(
            // 公共参数
            'Format' => 'JSON',//返回参数格式
            'Version' => '2017-05-25',//版本
            'AccessKeyId' => $this->accessKeyId,
            'SignatureVersion' => '1.0',//加餐版本
            'SignatureMethod' => 'HMAC-SHA1',//加餐方式,参数加密方式
            'SignatureNonce' => uniqid(),//访问唯一标识,防止重复
            'Timestamp' => date('Y-m-d') . 'T' . date('H:i:s') . 'Z',
            'SignatureVersion' => '1.0',
        );
        //判断输入的参数是否为数组
        if (is_array($actionArray)) {
            $this->data = array_merge($this->data, $actionArray);//数组合并
        }
    }

    /**
     * 传递参数处理
     * 按理中间3行要加上的,我这边报警告,就直接注释了
     * @param str $str  传递参数值
     * @return str     处理结果参数
     */
    public 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;
    }
    
    /**
     * 加密
     * @param ary $parameters          加密参数
     * @param str $accessKeySecret     秘钥,第三方可以拿到
     * @return str                     返回签名
     */
    public function computeSignature($parameters, $accessKeySecret) {
        // 将参数Key按字典顺序排序
        ksort($parameters);
        // 生成规范化请求字符串
        $canonicalizedQueryString = '';
        foreach ($parameters as $key => $value) {
            $canonicalizedQueryString .= '&' . $this->percentEncode($key)
                    . '=' . $this->percentEncode($value);
        }
        // 生成用于计算签名的字符串 stringToSign
        $stringToSign = 'POST&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
        // 计算签名,注意accessKeySecret后面要加上字符'&'
        $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
        return $signature;
    }
    /**
     * 使用阿里签名访问openapi接口
     * @return 结果
     */
    public function callInterface() {
        // 计算签名并把签名结果加入请求参数
        $this->data['Signature'] = $this->computeSignature($this->data, $this->accessKeySecret);
        var_dump($this->data);
        var_dump($this->url);
//        return $this->data;
        // 发送请求
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:application/x-www-form-urlencoded']);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
        curl_setopt($ch, CURLOPT_URL, $this->url . http_build_query($this->data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($ch);
        $res = json_decode($res, true);
        return $res;
    }

    /**
     * 测试  发送短信
     */
    function test() {
        $arr=[
            'Action' => 'SendSms',
            'PhoneNumbers'=>'18520745660',
            'SignName'=>'xxx',//签名,短信开头【xxx】
            'TemplateCode'=>'SMS_247666666',//模板名称
            'TemplateParam'=>'{"code":"52013"}',//模板里面的参数code或其他
        ];
        $obj = new Ali_sms($arr);
        $data = $obj->callInterface();
        var_dump($data);die;
    }
    
}

注意点:url,接收请求的地址服务接入点 - 短信服务 - 阿里云

  其他就没什么要求了,看下文档,阿里云的文档简单,人工也是很舒服的。对于我这种拒绝下载过多和过大文件的sdk 或者 demo 的人来说,简直了,一次愉快的沟通。

运行结果如下:

array(4) {
  ["Message"]=>
  string(2) "OK"
  ["RequestId"]=>
  string(36) "CC9F353C-569A-5958-95C6-1EA7391EB299"
  ["Code"]=>
  string(2) "OK"
  ["BizId"]=>
  string(20) "705201159316521496^0"
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到