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 Image Resize图片大小调整的函数代码
Jan 17 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
May 07 PHP
centos 5.6 升级php到5.3的方法
May 14 PHP
php4与php5的区别小结(配置异同)
Dec 20 PHP
php去除html标记的原生函数详解
Jan 27 PHP
PHP数学运算与数据处理实例分析
Apr 01 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
php模拟post上传图片实现代码
Jun 24 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
php和vue配合使用技巧和方法
May 09 PHP
一文搞懂PHP中的抽象类和接口
May 25 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
文章推荐系统(三)
2006/10/09 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
php 的反射详解及示例代码
2016/08/25 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Python类中self参数用法详解
2020/02/13 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
工商管理专业自荐信
2014/06/03 职场文书
社区护士演讲稿
2014/08/27 职场文书
超市开店计划书
2014/09/15 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
报案材料怎么写
2015/05/25 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js