<?php
namespace App\Controller;
use Think\Controller;

/**
 * 签名助手 2017/11/19
 *
 * Class SignatureHelper
 */
class AlismsPubController extends Controller{
    function __construct() {
        parent::__construct();
    }
    
    /**
     * 生成签名并发起请求
     *
     * @param $accessKeyId string AccessKeyId (https://ak-console.aliyun.com/)
     * @param $accessKeySecret string AccessKeySecret
     * @param $domain string API接口所在域名
     * @param $params array API具体参数
     * @param $security boolean 使用https
     * @param $method boolean 使用GET或POST方法请求,VPC仅支持POST
     * @return bool|\stdClass 返回API接口调用结果,当发生错误时返回false
     */
    public function request($accessKeyId, $accessKeySecret, $domain, $params, $security=false, $method='POST') {
        $apiParams = array_merge(array (
            "SignatureMethod" => "HMAC-SHA1",
            "SignatureNonce" => uniqid(mt_rand(0,0xffff), true),
            "SignatureVersion" => "1.0",
            "AccessKeyId" => $accessKeyId,
            "Timestamp" => gmdate("Y-m-d\TH:i:s\Z"),
            "Format" => "JSON",
        ), $params);
        ksort($apiParams);
        $sortedQueryStringTmp = "";
        foreach ($apiParams as $key => $value) {
            $sortedQueryStringTmp .= "&" . $this->encode($key) . "=" . $this->encode($value);
        }

$stringToSign = "${method}&%2F&" . $this->encode(substr($sortedQueryStringTmp, 1));

$sign = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&",true));

$signature = $this->encode($sign);

$url = ($security ? 'https' : 'http')."://{$domain}/";

try {
            $content = $this->fetchContent($url, $method, "Signature={$signature}{$sortedQueryStringTmp}");
            return json_decode($content);
        } catch( \Exception $e) {
            return false;
        }
    }

private function encode($str)
    {
        $res = urlencode($str);
        $res = preg_replace("/\+/", "%20", $res);
        $res = preg_replace("/\*/", "%2A", $res);
        $res = preg_replace("/%7E/", "~", $res);
        return $res;
    }

private function fetchContent($url, $method, $body) {
        $ch = curl_init();

if($method == 'POST') {
            curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
        } else {
            $url .= '?'.$body;
        }

curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "x-sdk-client" => "php/2.0.0"
        ));

if(substr($url, 0,5) == 'https') {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }

$rtn = curl_exec($ch);

if($rtn === false) {
            // 大多由设置等原因引起,一般无法保障后续逻辑正常执行,
            // 所以这里触发的是E_USER_ERROR,会终止脚本执行,无法被try...catch捕获,需要用户排查环境、网络等故障
            trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
        }
        curl_close($ch);

return $rtn;
    }
}

/*******************************************************************************************************/

<?php
namespace App\Controller;
use Think\Controller;
use App\Controller\AlismsPubController;
/**
 * 签名助手 2017/11/19
 *
 * Class SignatureHelper
 */
class AlismsController extends AlismsPubController{
    function __construct($signName,$codeId) {
        parent::__construct();
        $this->accessKeyId = "******************"; //AccessKeyId
        $this->accessKeySecret = "***********************"; //AccessKeySecret
        $this->SignName = $signName; //签名
        $this->CodeId = $codeId; //验证码模板ID
    }
    
    //发送验证码
    public function code($phone,$code=''){
        if(!$this->isphone($phone)){
            return false;
        }
        
        $params["PhoneNumbers"] = $phone;
        $params["TemplateCode"] = $this->CodeId; //模板
        
        $params['TemplateParam'] = ["code" => $code]; //验证码
        
        return $this->send($params);
    }
    
    //验证手机号是否正确
    private function isphone($phone){
        if(!is_numeric($phone)){
            return false;
        }else{
            return preg_match("/^1[3456789]{1}\d{9}$/", $phone) ? true : false;
        }
    }
    
    private function send($params=[]){
        $params["SignName"] = $this->SignName;
        if(!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
            $params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
        }
        $helper = new AlismsPubController();
        $content = $helper->request(
            $this->accessKeyId,
            $this->accessKeySecret,
            "dysmsapi.aliyuncs.com",
            array_merge($params,array(
               "RegionId" => "cn-hangzhou",
                "Action" => "SendSms",
                "Version" => "2017-05-25"
            ))
        );
        
        if($content===false){
            return false;
        }else{
            $data = (array)$content;
            if($data['Code']=="OK"){
                return true;
            }else{
                return false;
            }
        }
    }
}

/******************************************************************************************/

验证码使用:

$alisms = new AlismsController('*****','*******');
        if($alisms->code($phone,$code)){
            return true;
        }else{
            return false;
        }

通知使用:

$alisms = new AlismsController('天将神兵通知','SMS_205468305');
        if($alisms->code($phone,'')){
            return true;
        }else{
            return false;
        }

php阿里云短信验证码相关推荐

  1. nodejs实现阿里云短信验证码

    nodejs实现阿里云短信验证码 事先准备 1.开通阿里云短信服务 2.获取 AccessKey 代码编写 事先准备 1.开通阿里云短信服务 1⃣️登陆阿里云,然后进入到 https://dysms. ...

  2. 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)

    获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...

  3. 阿里云短信验证码实战

    一.创建阿里云短信权限用户 1.登陆阿里云之后我们点击头像,接着点击AccessKey: 2.选择开始使用子用户 : 3.我们先要创建一个用户组: 4.依次点击新建的用户组--授权管理,给用户组授权, ...

  4. 【阿里云短信验证码】麻瓜教程~~~从注册---申请---代码---执行

    阿里云短信验证码 当然啦,学习任何东西第一步就是去注册当前网站的账号. 阿里云的官网:https://www.aliyun.com/?utm_content=se_1008364713 ◆[1.先注册 ...

  5. springboot 使用shiro集成阿里云短信验证码

    目录 1.阿里云短信验证码服务 2.发送短信验证码 3.shiro配置多个realm 4.验证短信验证码 5.一些修改思路 引言:短信验证码是通过发送验证码到手机的一种有效的验证码系统,主要用于验证用 ...

  6. C# ASP.NET MVC 阿里云短信验证码Demo

    相信大家在开发过程中又很多使用到验证码验证的功能,今天将验证码的验证整理一下写了一个Demo 通过本篇后你能学习到: 阿里云短信服务 Drapper连接SQL Server进行增改操作 JS前端倒计时 ...

  7. [风一样的创作]二次封装阿里云短信 验证码 发送短信 查询短信 编辑短信

    1.首先要注册阿里云,购买阿里云短信服务,拿到AccessKey ID和AccessKey Secret 链接: https://usercenter.console.aliyun.com/#/man ...

  8. Thinkphp3.2开发阿里云短信验证码

    之前一直使用的是创蓝253的短信验证码,开发起来比较方便,不想阿里云这么复杂.有兴趣的同学可以去看一下创蓝253的短信验证码(https://www.253.com). 今天主要说一下阿里云的短信验证 ...

  9. 阿里云短信验证码的坑.....

    阿里云短信的坑 博主在集成阿里云短信的时候发生了此问题: 明明生成6位数字的验证码结果,通过阿里云短信发送出来有时只有5位. 解决办法也很简单我就直接贴代码,说原因了. 原因是: 问题原因:因为我返回 ...

  10. 短信验证--阿里云短信验证码接口

    前言 公司最近项目需要一个手机验证码的功能,任务确定后,倍感亚历山大,以为和第三方对接的都好麻烦,查阿里的API.网上大神写的博客,各种查之后才发现,简单的一塌糊涂,这里想说个问题,不知道其他的攻城狮 ...

最新文章

  1. 复盘一次服务安装失败问题
  2. JavaSE基础之构造器(构造方法)和一般方法
  3. C++编程思想重点笔记(下)
  4. java易语言_java程序员,0基础学习开发易语言。
  5. Linux命令 比较文件
  6. 男程序员怎么保养皮肤【护肤】?
  7. minwindow java_Java经典算法:最小窗口子字符串
  8. [vue] prop验证的type类型有哪几种?
  9. android token机制_你真的了解16.6ms刷新机制吗?
  10. C/C++ OpenCV图像的载入,显示,输出
  11. Redis 与 key 相关的常用命令
  12. c# 操作word中在右下角插入图片
  13. 适用于Photoshop,Xd和Sketch的UI套件
  14. 20150823 命令练习总结
  15. tensorflow之tfrecord
  16. MySQL入门总结和学习笔记
  17. MySQL 定时备份数据库(非常全),值得收藏!
  18. 最简单的基于FFMPEG的封装格式转换器(致敬雷霄骅)
  19. Twaver-HTML5基础学习(1)两点一线
  20. sqlite stmt

热门文章

  1. linux怎么下载ftp文件夹,命令行 - 如何在Linux上通过FTP递归下载文件夹
  2. javplayer 使用教程_SAI教程SAI绘画软件下载SAI2上色教程
  3. qlv视频转换器免费版_推荐几款强大的视频剪辑软件
  4. 用两个队列实现一个栈
  5. dns入门之MX记录
  6. PLSQL 导出、导入 表和数据
  7. CATIA怎么约束快捷键_CATIA快捷键和Solidworks快捷键
  8. 快速切换ip没必要用工具
  9. Spotfire 表达式中的属性
  10. 马拉车java_算法-Manacher算法 / 马拉车算法(Java实现)