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 相关文章推荐
与数据库连接
Oct 09 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
Apr 08 PHP
php调用shell的方法
Nov 05 PHP
phpQuery让php处理html代码像jQuery一样方便
Jan 06 PHP
php生成zip文件类实例
Apr 07 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
php实现查询功能(数据访问)
May 23 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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中使用虚代理实现延迟加载技术
2014/11/05 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
python 图片验证码代码分享
2012/07/04 Python
python自动化测试实例解析
2014/09/28 Python
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
python查询mysql,返回json的实例
2018/03/26 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
C面试题
2015/10/08 面试题
设计毕业生简历中的自我评价
2013/10/01 职场文书
数控专业应届生求职信
2013/11/27 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
升学宴演讲稿
2014/09/01 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
离婚案件原告代理词
2015/05/23 职场文书
学习雷锋主题班会
2015/08/14 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android