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函数utf8转gb2312编码
Dec 21 PHP
php 什么是PEAR?(第三篇)
Mar 19 PHP
php下清空字符串中的HTML标签的代码
Sep 06 PHP
ubuntu12.04使用c编写php扩展模块教程分享
Dec 25 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
PHP的几个常用加密函数
Feb 03 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
header与缓冲区之间的深层次分析
Jul 30 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 PHP
PHP树形结构tree类用法示例
Feb 01 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
第三节 定义一个类 [3]
2006/10/09 PHP
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
JS backgroundImage控制
2009/05/19 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
javascript时区函数介绍
2012/09/14 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
python中的五种异常处理机制介绍
2014/09/02 Python
python实现从字典中删除元素的方法
2015/05/04 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
英国电子专家:maplin
2019/09/04 全球购物
个人自荐材料
2014/05/23 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
2016年教师新年寄语
2015/08/18 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers