laravel+阿里大于实现发送验证码短信

一、短信服务使用阿里大于提供的短信接口

阿里大于官方网站上的接入流程:

在阿里大于申请接口后,需要做以下操作:

  1. 申请签名
  2. 申请短信模板
  3. 创建Accesskey,可以通过权限最大的Accesskey创建子Accesskey,便于权限控制
  4. 充值,如果账户中余额不足的话,是发布出去短信的

二、在laravel中使用阿里大于接口

之前在laravel中使用composer安装阿里大于的扩展包,但是尝试之后,一直返回code=11的错误码,是扩展包的权限不足,具体原因还未找到

然后就在laravel引入官方提供的skd包,下面介绍具体在laravel中使用官方sdk包的过程:

  1. 从官网上下载php版短信服务的skd包,解压后有四个文件夹,分别是:api_demo,api_sdk,msg_demo,msg_sdk
  2. 在laravel中根目录下的 app文件夹下新建一个文件夹 libs,把api_sdk和msg_sdk复制到libs文件夹下.
  3. 利用composer自动加载文件     关于laravel利用composer自动加载介绍,请参考:http://laravelacademy.org/post/7074.html
  4. 找到项目根目录下的composer.json文件,利用composer的classmap选项加载


    然后执行 composer dumpautoload
  5. 代码:
    1.   1 <?php
        2 
        3 
        4 
        5   //use 命名空间+类名
        6 
        7     use Aliyun\Core\Config;  //命名空间 Aliyun\Core  类名是 Config  (命名空间不必一定存在)
        8     use Aliyun\Core\Profile\DefaultProfile;
        9     use Aliyun\Core\DefaultAcsClient;
       10     use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
       11     use Aliyun\Api\Sms\Request\V20170525\QuerySendDetailsRequest;
       12 
       13 
       14     use App\Http\Controllers\Controller;
       15 
       16 
       17 
       18 
       19     // 加载区域结点配置
       20     Config::load();
       21 
       22 
       23     class SmsController extends Controller 
       24     {
       25 
       26 
       27         /**
       28          * 构造器
       29          * @param string $accessKeyId    必填,AccessKeyId
       30          * @param string $accessKeySecret 必填,AccessKeySecret
       31          */
       32         public function __construct($accessKeyId="######",$accessKeySecret="#######")
       33         {
       34 
       35 
       36             // 短信API产品名
       37              $product = "Dysmsapi";
       38 
       39 
       40             // 短信API产品域名
       41              $domain = "dysmsapi.aliyuncs.com";
       42 
       43 
       44               // 暂时不支持多Region
       45              $region = "cn-hangzhou";
       46 
       47 
       48               // 服务结点
       49              $endPointName = "cn-hangzhou";
       50 
       51 
       52               // 初始化用户Profile实例
       53              $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
       54 
       55 
       56               // 增加服务结点
       57              DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);
       58 
       59 
       60               // 初始化AcsClient用于发起请求
       61              $this->acsClient = new DefaultAcsClient($profile);
       62 
       63 
       64         }
       65 
       66 
       67 
       68 
       69         /**
       70          *  发送短信范例
       71          * @param  [type] $phoneNumbers 必填, 短信接收号码
       72          * @param  string $signName    必填, 短信签名,应严格"签名名称"填写,
       73          * @param  string $templateCode  必填, 短信模板Code,应严格按"模板CODE"填写,
       74          * @param  [type] $outId        选填, 假如模板中存在变量需要替换则为必填项
       75          * @return [type]               [description]
       76          */
       77         public function sendSms($phoneNumbers,$signName="XX软件",$templateCode="SMS_XXXXXX",$outId=null)
       78         {
       79 
       80 
       81              // 初始化SendSmsRequest实例用于设置发送短信的参数
       82             $request = new SendSmsRequest;
       83 
       84 
       85              // 必填,设置雉短信接收号码
       86             $request->setPhoneNumbers($phoneNumbers);
       87 
       88 
       89              // 必填,设置签名名称
       90             $request->setSignName($signName);
       91 
       92 
       93             // 必填,设置模板CODE
       94             $request->setTemplateCode($templateCode);
       95 
       96 
       97             $num = rand(100000,999999);
       98 
       99 
      100              // 可选,设置模板参数
      101             $request->setTemplateParam(json_encode(
      102                 Array(
      103                     "code" => "$num"
      104                 )
      105             ));
      106 
      107 
      108               // 可选,设置流水号
      109             if($outId) {
      110                 $request->setOutId($outId);
      111             }
      112 
      113 
      114              // 发起访问请求
      115             $acsResponse = $this->acsClient->getAcsResponse($request);
      116 
      117 
      118 
      119 
      120         }
      121 
      122 
      123         /**
      124          * 查询短信发送情况范例
      125          * @param  [type]  $phoneNumbers 必填, 短信接收号码
      126          * @param  [type]  $sendDate     必填,短信发送日期,格式Ymd,支持近30天记录查询 
      127          * @param  integer $pageSize   必填,分页大小
      128          * @param  integer $currentPage  必填,当前页码
      129          * @param  [type]  $bizId        选填,短信发送流水号
      130          * @return [type]                [description]
      131          */
      132         public function queryDetails($phoneNumbers,$sendDate,$pageSize=10,$currentPage=1,$bizId=null)
      133         {
      134 
      135 
      136              // 初始化QuerySendDetailsRequest实例用于设置短信查询的参数
      137             $request = new QuerySendDetailsRequest();
      138 
      139 
      140             $request->setPhoneNumber($phoneNumbers);
      141 
      142 
      143             $request->setSendDate($sendDate);
      144 
      145 
      146             $request->setPageSize($pageSize);
      147 
      148 
      149             $request->setCurrentPage($currentPage);
      150 
      151 
      152             if($bizId) {
      153                 $request->setBizId($bizId);
      154             }
      155 
      156 
      157             $acsResponse = $this->acsClient->getAcsResponse($request);
      158 
      159 
      160         }
      161 
      162 
      163     }
      之后用就实例化调用方法就可以了。

 本文参考:http://blog.csdn.net/lishanleilixin/article/details/78126955

posted @ 2017-10-05 20:52  lin_zone  阅读(1065)  评论(0编辑  收藏