php与阿里云短信接口接入操作案例分析


Posted in PHP onMay 27, 2020

本文实例讲述了php与阿里云短信接口接入操作。分享给大家供大家参考,具体如下:

使用阿里云短信API,需要在控制台获取以下必要参数,其中需要自己手机验证+官方审核多次,尤其审核需要保持耐心。

1. accessKeyId  相当于你的个人账户密钥;

2. accessKeySecret 与上是成对的;

3. SignName  个人签名,在发出去的短信中,这个签名会显示在开头,类似 【签名】亲爱的用户...... 这种格式,SignName需要通过提交审核;

4.TemplateCode  模板代码,阿里云短信是无法完全自定义短信的,需要通过审核的模板,然后自己再替换掉模板中的变量,如模板:“您的验证码是$[code]” ,code就是变量,使用时需设置变量值{"code":"12345"}(设置变量值的过程在demo中实现),短信发出去后变成:“您的验证码是12345”,每个通过审核的模板会提供一个模板代码;

最新的阿里云短信接口,适用于阿里大于搬家以后的情况。

之前一直用阿里大于的短信接口,最近上项目时发现阿里大于悄悄地搬家到了阿里云!阿里云的SDK文件繁多,看得一头雾水!下面代码是最新的可适用于阿里云短信服务的类,亲测成功!

<?php
/**
 * 阿里云短信验证码发送类
 * @author Administrator
 *
 */
class Sms {

  // 保存错误信息

  public $error;

  // Access Key ID

  private $accessKeyId = '';

  // Access Access Key Secret

  private $accessKeySecret = '';

  // 签名

  private $signName = '';

  // 模版ID

  private $templateCode = '';

  public function __construct($cofig = array()) {

    $cofig = array (

        'accessKeyId' => 'xxxxxxxxxxx',

        'accessKeySecret' => 'xxxxxxxxxx',

        'signName' => '你的签名',

        'templateCode' => 'SMS_76510109'

    );

    // 配置参数

    $this->accessKeyId = $cofig ['accessKeyId'];

    $this->accessKeySecret = $cofig ['accessKeySecret'];

    $this->signName = $cofig ['signName'];

    $this->templateCode = $cofig ['templateCode'];

  }

  private function percentEncode($string) {

    $string = urlencode ( $string );

    $string = preg_replace ( '/\+/', '%20', $string );

    $string = preg_replace ( '/\*/', '%2A', $string );

    $string = preg_replace ( '/%7E/', '~', $string );

    return $string;

  }

  /**
   * 签名
   *
   * @param unknown $parameters      
   * @param unknown $accessKeySecret      
   * @return string
   */

  private function computeSignature($parameters, $accessKeySecret) {

    ksort ( $parameters );

    $canonicalizedQueryString = '';

    foreach ( $parameters as $key => $value ) {

      $canonicalizedQueryString .= '&' . $this->percentEncode ( $key ) . '=' . $this->percentEncode ( $value );

    }

    $stringToSign = 'GET&%2F&' . $this->percentencode ( substr ( $canonicalizedQueryString, 1 ) );

    $signature = base64_encode ( hash_hmac ( 'sha1', $stringToSign, $accessKeySecret . '&', true ) );

    return $signature;

  }

  /**
   * @param unknown $mobile      
   * @param unknown $verify_code      
   *
   */

  public function send_verify($mobile, $verify_code) {

    $params = array (  //此处作了修改

        'SignName' => $this->signName,

        'Format' => 'JSON',

        'Version' => '2017-05-25',

        'AccessKeyId' => $this->accessKeyId,

        'SignatureVersion' => '1.0',

        'SignatureMethod' => 'HMAC-SHA1',

        'SignatureNonce' => uniqid (),

        'Timestamp' => gmdate ( 'Y-m-d\TH:i:s\Z' ),

        'Action' => 'SendSms',

        'TemplateCode' => $this->templateCode,

        'PhoneNumbers' => $mobile,

        //'TemplateParam' => '{"code":"' . $verify_code . '"}' 

        'TemplateParam' => '{"time":"1234"}'  //更换为自己的实际模版

    );

    //var_dump($params);die;

    // 计算签名并把签名结果加入请求参数

    $params ['Signature'] = $this->computeSignature ( $params, $this->accessKeySecret );

    // 发送请求(此处作了修改)

    //$url = 'https://sms.aliyuncs.com/?' . http_build_query ( $params );

    $url = 'http://dysmsapi.aliyuncs.com/?' . http_build_query ( $params );

    $ch = curl_init ();

    curl_setopt ( $ch, CURLOPT_URL, $url );

    curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );

    curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );

    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );

    curl_setopt ( $ch, CURLOPT_TIMEOUT, 10 );

    $result = curl_exec ( $ch );

    curl_close ( $ch );

    $result = json_decode ( $result, true );

    //var_dump($result);die;

    if (isset ( $result ['Code'] )) {

      $this->error = $this->getErrorMessage ( $result ['Code'] );

      return false;

    }

    return true;

  }

  /**
   * 获取详细错误信息
   *
   * @param unknown $status      
   */

  public function getErrorMessage($status) {

    // 阿里云的短信 乱八七糟的(其实是用的阿里大于)

    // https://api.alidayu.com/doc2/apiDetail?spm=a3142.7629140.1.19.SmdYoA&apiId=25450

    $message = array (

        'InvalidDayuStatus.Malformed' => '账户短信开通状态不正确',

        'InvalidSignName.Malformed' => '短信签名不正确或签名状态不正确',

        'InvalidTemplateCode.MalFormed' => '短信模板Code不正确或者模板状态不正确',

        'InvalidRecNum.Malformed' => '目标手机号不正确,单次发送数量不能超过100',

        'InvalidParamString.MalFormed' => '短信模板中变量不是json格式',

        'InvalidParamStringTemplate.Malformed' => '短信模板中变量与模板内容不匹配',

        'InvalidSendSms' => '触发业务流控',

        'InvalidDayu.Malformed' => '变量不能是url,可以将变量固化在模板中'

    );

    if (isset ( $message [$status] )) {

      return $message [$status];

    }

    return $status;

  }

}

调用方法:

//生成验证码
$mobile = 'xxxxxxx';
$code = rand ( 1000, 9999 );
//发送短信
$sms = new Sms();

//测试模式
$status = $sms->send_verify($mobile, $code);
if (!$status) {
 echo $sms->error;

}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个PHP的String类代码
Apr 20 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
Dec 14 PHP
php+xml实现在线英文词典之添加词条的方法
Jan 23 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
PHP框架Laravel学习心得体会
Oct 28 PHP
Yii数据库缓存实例分析
Mar 29 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
Yii框架表单提交验证功能分析
Jan 07 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
PHP开发API接口签名生成及验证操作示例
May 27 #PHP
php+websocket 实现的聊天室功能详解
May 27 #PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 #PHP
PHP code 验证码生成类定义和简单使用示例
May 27 #PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 #PHP
tp5.1 框架数据库-数据集操作实例分析
May 26 #PHP
tp5.1 框架路由操作-URL生成实例分析
May 26 #PHP
You might like
PHP的开合式多级菜单程序
2006/10/09 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
PHP 正则表达式小结
2015/02/12 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
详解vue添加删除元素的方法
2018/06/30 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
python实现rest请求api示例
2014/04/22 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
Python imread、newaxis用法详解
2019/11/04 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
班主任寄语大全
2014/04/04 职场文书
商铺门面租房协议书
2014/10/21 职场文书
2014年关工委工作总结
2014/11/17 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
三方合作意向书范本
2015/05/09 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python