zoukankan      html  css  js  c++  java
  • laravel框架使用阿里短信接入

    EG: accessKeyid和accessKeySecret还有模板ID、签名名称这几项必要参数自己去阿里云获取

    一、下载SDK和demo

     下载并解压后

     在laravel框架的app目录下创建libs/Aliyun目录并将上面两个文件夹复制进去,如果按照此方法则不需要改命名空间,如果你放在别的地方就根据你的路径修改一下命名空间

    在根目录的composer.json里添加如下配置:

    
    

    然后在cmd中进入根目录然后进行
    composer dumpautoload

    执行后若出现如下图所示,则表示更新成功

     二、代码部分

    1、首先引入文件并载入短信平台节点

    use AliyunCoreConfig;
    use AliyunCoreProfileDefaultProfile;
    use AliyunCoreDefaultAcsClient;
    use AliyunApiSmsRequestV20170525SendSmsRequest;
    use AliyunApiSmsRequestV20170525QuerySendDetailsRequest;
    
    Config::load();

    2、发送代码

    public function send(Request $request)
        {
            $phone = $request['phone'];//接收的手机号
            //print_r($phone);die;
            $code = rand(100000,999999);//随机生成的6位验证码
            session('code',$code);//将随机数写入session
            session('mphone',$phone);//写入获取的手机号
            session('codetime',time());//写入当前时间
            $response = SmsController::sendSms(
                "你的签名",//signName
                "你的短信模板code",//templateCode
                $phone,//手机号
                Array(  // 短信模板中字段的值
                    "code"=>$code,
                )
            );
            $row = [];
            if ($response->Code == 'OK')
            {
                $row = ['status'=>1,'code'=>$code];
            }
            else
            {
                $row = ['status'=>0,'code'=>$response->Code,'message'=>$response->Message];
            }
            return json_encode($row);
        }
        
        static $acsClient = null;
        
        /**
         * 取得AcsClient
         *
         * @return DefaultAcsClient
         */
        public static function getAcsClient() {
            //产品名称:云通信流量服务API产品,开发者无需替换
            $product = "深呼吸app";
    
            //产品域名,开发者无需替换
            $domain = "dysmsapi.aliyuncs.com";
    
            // TODO 此处需要替换成开发者自己的AK (https://ak-console.aliyun.com/)
            $accessKeyId = "你自己的AccessKeyId"; // AccessKeyId
    
            $accessKeySecret = "你自己的AccessKeySecret"; // AccessKeySecret
    
            // 暂时不支持多Region
            $region = "cn-hangzhou";
    
            // 服务结点
            $endPointName = "cn-hangzhou";
    
    
            if(static::$acsClient == null)
            {
                //初始化acsClient,暂不支持region化
                $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
    
                EndpointConfig::load();
                DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);
                // 增加服务结点
                // 初始化AcsClient用于发起请求
                static::$acsClient = new DefaultAcsClient($profile);
            }
            return static::$acsClient;
        }
    
        /**
         * 发送短信
         *
         * @param string $signName <p>
         * 必填, 短信签名,应严格"签名名称"填写,参考:<a href="https://dysms.console.aliyun.com/dysms.htm#/sign">短信签名页</a>
         * </p>
         * @param string $templateCode <p>
         * 必填, 短信模板Code,应严格按"模板CODE"填写, 参考:<a href="https://dysms.console.aliyun.com/dysms.htm#/template">短信模板页</a>
         * (e.g. SMS_0001)
         * </p>
         * @param string $phoneNumbers 必填, 短信接收号码 (e.g. 12345678901)
         * @param array|null $templateParam <p>
         * 选填, 假如模板中存在变量需要替换则为必填项 (e.g. Array("code"=>"12345", "product"=>"阿里通信"))
         * </p>
         * @param string|null $outId [optional] 选填, 发送短信流水号 (e.g. 1234)
         * @param string|null $smsUpExtendCode [optional] 选填,上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
         * @return stdClass
         */
        public static function sendSms($signName, $templateCode, $phoneNumbers, $templateParam = null, $outId = null, $smsUpExtendCode = null) {
    
            // 初始化SendSmsRequest实例用于设置发送短信的参数
            $request = new SendSmsRequest();
    
            // 必填,设置雉短信接收号码
            $request->setPhoneNumbers($phoneNumbers);
    
            // 必填,设置签名名称
            $request->setSignName($signName);
    
            // 必填,设置模板CODE
            $request->setTemplateCode($templateCode);
    
            // 可选,设置模板参数
            if($templateParam) {
               $request->setTemplateParam(json_encode($templateParam));
            }
            // 可选,设置流水号
            if($outId) {
                $request->setOutId($outId);
            }
            // 选填,上行短信扩展码
            if($smsUpExtendCode) {
                $request->setSmsUpExtendCode($smsUpExtendCode);
            }
            // 发起访问请求
            $acsResponse = static::getAcsClient()->getAcsResponse($request);
            // 打印请求结果
            // var_dump($acsResponse);
            return $acsResponse;
        }

    有的人会出现:

    发现问题在 app/libs/Aliyun/Core/DefaultAcsClient.doActionImpl(),是程序主动抛出的错误。

    官方注释说 $domain是产品域名,开发者无需替换。but。。。。没替换,报个什么错啊。

    既然不需要,就直接在/DefaultAcsClient.doActionImpl()把$domain 写死

    然后测试接口会返回结果:

     这样就发送成功了

    
    
    
    
  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/wxy0126/p/11661224.html
Copyright © 2011-2022 走看看