laravel中短信发送验证码的实现方法


Posted in PHP onApril 25, 2018

前言

前段时间想实现一个短信验证码的功能,但是卡了很长时间。

首先我用的是阿里云的短信服务业务,其首次接入流程如下:

laravel中短信发送验证码的实现方法

在阿里云上开通短信服务后需要做的:

1,申请签名  2,申请模板   3,创建Accesskey ,值得说的是,可以通过阿里云提供的子用户进行Accesskey的创建,这样可以更安全  4,充值

laravel有很多的进行短信业务的扩展包,之前我用的是阿里大于,使用如下:

1,从终端或者命令进入您的项,运行:composer require iscms/alisms-for-laravel

2,将:iscms\Alisms\AlidayuServiceProvider::class加入config\app.php的Providers下 类似:

laravel中短信发送验证码的实现方法

3,运行:php artisan vendor:publish,这样会在config文件夹下新增一个alisms.php文件,内容如下:

<?php
 return [
  'KEY' =>env('ALISMS_KEY',null),
  'SECRETKEY'=>env('ALISMS_SECRETKEY',null),
 ];

 4,在.env文件中写入:

ALISMS_KEY=23305789
ALISMS_SECRETKEY=**************

 注意:ALISMS_KEY和ALISMS_SECRETKEY就是阿里云生成的访问秘钥成对(AccessKeyId 与 AccessKeySecret)

开始使用:

 1,在您需要调用短信服务的控制器中引入SMS:

use iscms\Alisms\SendsmsPusher as Sms;

public function __construct(Sms $sms)
 {
  $this->sms=$sms;
 }

 public function index()
 {
  $result=$this->sms->send("$phone","$name","$content","$code");
 }

参数说明:$phone,$name,$content,$code

  • $phone 指接受短信方的短信号码,
  • $name 指短信签名 可以在阿里大鱼短信签名 http://www.alidayu.com/admin/service/sign 找到
  • $content 是指短信模板中的变量内容.举个例子

在自己的阿里大鱼模板里面有下面一个短信模板

模板名称: 身份验证验证码

模板ID: SMS_3910275

*模板内容: 验证码$[code],您正在进行${product}身份验证,打死不要告诉别人哦!

那么对应的我们的$content 就应该为

{
  code:"生成的验证码",
  product:"示例项目"
 }

到此就可以正常使用,但是不知道为什么,我在使用过程中,控制台返回了code=11的错误码,在淘宝上查证后是因为isv权限的问题,之后我在阿里云上将用户的权限控制开到了最大,但是依旧会出现这个错误,换了一个扩展包还是这个问题,到现在还没有解决,于是我就在laravel中写原生的。

首先从阿里云官网上下载关于短信服务的sdk包

SDK工具包中一共包含了2个类库,一个aliyun-php-sdk-core包,另外一个是alicom-dysms-api包,将这两个包添加到工程类库中依赖。

选择PHP版本的sdk包将压缩包解压,里面有四个文件夹:api_demo,api_sdk,msg_demo,msg_sdk

在laravel项目的app文件夹下新建一个名为libs的文件夹,将api_sdk和msg_sdk复制到libs文件夹下。

找到根目录下的composer.json文件,找到composer.json中定义的classmap选项,写入引入的两个包:

laravel中短信发送验证码的实现方法

终端进入项目文件夹中运行:

composer dumpautoload

这样子就在laravel中引入了第三方类库。

创建代码文件

我将其简单的封装了一下:

<?php
 // namespace App\Http\Controllers\sms;
 use Aliyun\Core\Config;
 use Aliyun\Core\Profile\DefaultProfile;
 use Aliyun\Core\DefaultAcsClient;
 use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
 use Aliyun\Api\Sms\Request\V20170525\QuerySendDetailsRequest;
 use App\Http\Controllers\Controller;

 // 加载区域结点配置
 Config::load();
 class SmsController extends Controller 
 {

  /**
   * 构造器
   * @param string $accessKeyId 必填,AccessKeyId
   * @param string $accessKeySecret 必填,AccessKeySecret
   */
  public function __construct($accessKeyId="######",$accessKeySecret="#######")
  {
   // 短信API产品名
    $product = "Dysmsapi";
   // 短信API产品域名
    $domain = "dysmsapi.aliyuncs.com";
    // 暂时不支持多Region
    $region = "cn-hangzhou";
    // 服务结点
    $endPointName = "cn-hangzhou";
    // 初始化用户Profile实例
    $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
    // 增加服务结点
    DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);

    // 初始化AcsClient用于发起请求
    $this->acsClient = new DefaultAcsClient($profile);
  }


  /**
   * 发送短信范例
   * @param [type] $phoneNumbers 必填, 短信接收号码
   * @param string $signName 必填, 短信签名,应严格"签名名称"填写,
   * @param string $templateCode 必填, 短信模板Code,应严格按"模板CODE"填写,
   * @param [type] $outId  选填, 假如模板中存在变量需要替换则为必填项
   * @return [type]    [description]
   */
  public function sendSms($phoneNumbers,$signName="XX软件",$templateCode="SMS_XXXXXX",$outId=null)
  {
    // 初始化SendSmsRequest实例用于设置发送短信的参数
   $request = new SendSmsRequest;
    // 必填,设置雉短信接收号码
   $request->setPhoneNumbers($phoneNumbers);
    // 必填,设置签名名称
   $request->setSignName($signName);
   // 必填,设置模板CODE
   $request->setTemplateCode($templateCode);
   $num = rand(100000,999999);
    // 可选,设置模板参数
   $request->setTemplateParam(json_encode(
    Array(
     "code" => "$num"
    )
   ));

    // 可选,设置流水号
   if($outId) {
    $request->setOutId($outId);
   }

    // 发起访问请求
   $acsResponse = $this->acsClient->getAcsResponse($request);
  }


  /**
   * 查询短信发送情况范例
   * @param [type] $phoneNumbers 必填, 短信接收号码
   * @param [type] $sendDate  必填,短信发送日期,格式Ymd,支持近30天记录查询 
   * @param integer $pageSize 必填,分页大小
   * @param integer $currentPage 必填,当前页码
   * @param [type] $bizId  选填,短信发送流水号
   * @return [type]    [description]
   */
  public function queryDetails($phoneNumbers,$sendDate,$pageSize=10,$currentPage=1,$bizId=null)
  {
    // 初始化QuerySendDetailsRequest实例用于设置短信查询的参数
   $request = new QuerySendDetailsRequest();
   $request->setPhoneNumber($phoneNumbers);
   $request->setSendDate($sendDate);
   $request->setPageSize($pageSize);
   $request->setCurrentPage($currentPage);
   if($bizId) {
    $request->setBizId($bizId);
   }
   $acsResponse = $this->acsClient->getAcsResponse($request);
  }
 }

之后用就实例化调用方法就可以了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php 保留小数点
Apr 21 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
PHP修改session_id示例代码
Jan 08 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
PHP时间类完整代码实例
Feb 26 PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 #PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 #PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 #PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 #PHP
原生php实现excel文件读写的方法分析
Apr 25 #PHP
PHP操作Redis常用技巧总结
Apr 24 #PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 #PHP
You might like
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
javascript实现切割轮播效果
2019/11/28 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python实现的文件同步服务器实例
2015/06/02 Python
Python线性回归实战分析
2018/02/01 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python 重命名轴索引的方法
2018/11/10 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
实习评语大全
2014/04/26 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
中央空调节能方案
2014/06/15 职场文书
小学开学标语
2014/07/01 职场文书
政协调研汇报材料
2014/08/15 职场文书
单位工作证明范本
2015/06/15 职场文书
法定授权委托证明书
2015/06/18 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python