PHP 调用百度云SMS发送短信实例

手写 PHP 调用 百度云简单消息服务 SMS , 拿来即用

百度云官方文档: 简单消息服务 SMS

百度云签名计算工具 : 签名计算工具

PHP 框架: ThinkPHP 6

准备参数:

        AccessKey ,  SecretKey , 模板ID , 签名ID

代码如下:

    /**
     * 发送短信验证码
     * @param string $mobile 手机号
     */
    public function getCms()
    {
        $mobile = $this->request->post('mobile');
        $captcha = mt_rand(100000,999999);

        $data = [
            "signatureId" => '你的签名id', // 签名
            "template" => '你的模板id', // 模板
            "mobile" => $mobile, // 手机号
            "contentVar" => [ // 内容
                "content" => '您的验证码为:'.$captcha,
            ]
        ];

        $ak = '你的 AccessKey';
        $sk = '你的 SecretKey';

        $res = $this->getBaiduApi($data,$ak,$sk);

        if($res['code'] == 1000){
            $this->success('发送成功');
        }
        $this->error($res['message']);
    }

    /**
     * 接收处理
     * @param $data     array   短信数据
     * @param $ak   string      AccessKey
     * @param $sk   string      SecretKey
     * @return false|mixed
     */
    public function getBaiduApi($data,$ak,$sk)
    {
        $host = 'smsv3.bj.baidubce.com'; // 服务 域名 (北京 smsv3.bj.baidubce.com  ,  苏州	smsv3.su.baidubce.com)
        $uri = '/api/v3/sendSms'; // 接口路径
        $startUtc = gmdate("Y-m-d\TH:i:s\Z");  // utc 时间戳

        $Authorization = $this->getBaiDuAuthorization($startUtc,$uri,$host,$ak,$sk);

        $url = "https://".$host.$uri;

        $data = json_encode($data,JSON_UNESCAPED_UNICODE);
        $header = [
            'Authorization:'.$Authorization,
            'Host:'.$host,
            'content-type:application/json',
            'x-bce-date:'.$startUtc,
            'Content-Length:'.strlen($data)
        ];

        return getBaiDuPostCurl($url,$data,$header);
    }

    /**
     *  生成签名 认证字符串  
     *  ps: 可使用百度云签名计算工具进行校验
     * @param  [string]   startUtc   url
     * @param  [string]   canonicalUri    请求数据
     * @param  [string]   host    请求头
     * @param  [string]   ak    AccessKey
     * @param  [string]   sk    SecretKey
     */
    function getBaiDuAuthorization($startUtc,$canonicalUri,$host,$ak,$sk)
    {
        // 签名有效期 (秒)
        $validity = '1800';

        // 代签名头域
        $signedHeaders = 'host;x-bce-date';

        // Host
        $Host = "host:".$host;

//        $startUtc = '2023-07-28T10:02:36Z';         // utc 时间
        $BceDate = "x-bce-date:".UrlEncode($startUtc);

        // http 方法
        $httpRequestMethod = "POST";

        $canonicalCan = '';

        // 1: 规范化请求和前缀字符串

        // 规范化请求  由HTTP请求信息规范化后生成
        $canonicalRequest = $httpRequestMethod."\n" .$canonicalUri."\n" .$canonicalCan."\n" .$Host."\n" .$BceDate;

        // 前缀字符串  由除sk字段外的签名信息生成
        $authStringPrefix = "bce-auth-v1/".$ak."/".$startUtc."/".$validity;

        // 2: 派生签名密钥 signingKey  signingKey = HMAC-SHA-256-HEX("sk", authStringPrefix)
        $signingKey = bin2hex(hash_hmac('sha256',  $authStringPrefix,$sk, true));

        // 3: 签名摘要 signature  signature = HMAC-SHA-256-HEX(signingKey, canonicalRequest)
        $signature = bin2hex(hash_hmac('sha256',  $canonicalRequest,$signingKey, true));

        // 4: 认证字符串 authorization  Authorization = authStringPrefix/signedHeaders/signature
        $Authorization = $authStringPrefix.'/'.$signedHeaders.'/'.$signature;

//        var_dump($startUtc);
//        var_dump($authStringPrefix);
//        var_dump($canonicalRequest);
//        var_dump($signingKey);
//        var_dump($signature);
//        var_dump($Authorization);exit;

        return $Authorization;
    }


    /**
     * post 请求
     * @param  [string]   url   url
     * @param  [string]   data    请求数据
     * @param  [string]   header    请求头
     */
    function getBaiDuPostCurl($url,$data=null,$header=null)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_NOBODY, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        if (!empty($data)) {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        if ( !empty($header) ) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }

        $httpCode = curl_exec($ch);
        $errorCode = curl_errno($ch);
        curl_close($ch);
        if(0 !== $errorCode) {
            return false;
        }

        return json_decode($httpCode,true);
    }
PS : 记得将 getSms 下的参数 替换为你自己的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一一一凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值