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 相关文章推荐
WIN98下Apache1.3.14+PHP4.0.4的安装
Oct 09 PHP
模拟flock实现文件锁定
Feb 14 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php通用防注入程序 推荐
Feb 26 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
PHP基础知识回顾
Aug 16 PHP
PHP延迟静态绑定示例分享
Jun 22 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
php中Snoopy类用法实例
Jun 19 PHP
smarty自定义函数用法示例
May 20 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
PHP页面静态化――纯静态与伪静态用法详解
Jun 05 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 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
工作过失检讨书
2014/02/23 职场文书
公司联欢会策划方案
2014/05/19 职场文书
员工工作能力评语
2014/12/31 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
会议简报格式范文
2015/07/20 职场文书