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自动更新新闻DIY
Oct 09 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
linux下php上传文件注意事项
Jun 11 PHP
mac下多个php版本快速切换的方法
Oct 09 PHP
php支付宝系列之电脑网站支付
May 30 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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中文分词 自动获取关键词介绍
2012/11/13 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
python中PIL安装简单教程
2016/04/21 Python
Python3爬虫学习入门教程
2018/12/11 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
keras中的backend.clip用法
2020/05/22 Python
基于python实现查询ip地址来源
2020/06/02 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
加热夹克:RAVEAN
2018/10/19 全球购物
情侣吵架检讨书
2014/02/05 职场文书
工作过失检讨书
2014/02/23 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
低碳生活倡议书
2014/04/14 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
2014个人年度工作总结
2014/12/15 职场文书
写给领导的感谢信
2015/01/22 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
员工离职证明范本
2015/06/12 职场文书