以下更新2018-04-2309:57:54 后续不再更新,

基本类:

app/SignatureHelper.php
<?php

namespace aliyun_mns;

/**
* 签名助手 2017/11/19
*
* Class SignatureHelper
*/
class SignatureHelper { /**
* SignatureHelper constructor.
*/
public function __construct()
{
//....
} /**
* 生成签名并发起请求
*
* @param $accessKeyId string AccessKeyId (https://ak-console.aliyun.com/)
* @param $accessKeySecret string AccessKeySecret
* @param $domain string API接口所在域名
* @param $params array API具体参数
* @param $security boolean 使用https
* @return bool|\stdClass 返回API接口调用结果,当发生错误时返回false
*/
public function request($accessKeyId, $accessKeySecret, $domain, $params, $security=false)
{
$apiParams = array_merge(array (
"SignatureMethod" => "HMAC-SHA1",
"SignatureNonce" => uniqid(mt_rand(0,0xffff), true),
"SignatureVersion" => "1.0",
"AccessKeyId" => $accessKeyId,
"Timestamp" => gmdate("Y-m-d\TH:i:s\Z"),
"Format" => "JSON",
), $params);
ksort($apiParams);
;
$sortedQueryStringTmp = "";
foreach ($apiParams as $key => $value) {;
$sortedQueryStringTmp .= "&" . $this->encode($key) . "=" . $this->encode($value);
} $stringToSign = "GET&%2F&" . $this->encode(substr($sortedQueryStringTmp, 1)); $sign = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&",true)); $signature = $this->encode($sign); $url = ($security ? 'https' : 'http')."://{$domain}/?Signature={$signature}{$sortedQueryStringTmp}"; try {
$content = $this->fetchContent($url);
return json_decode($content);
} catch( \Exception $e) {
return false;
}
} /**
* @param $str
* @return mixed|string
*/
private function encode($str)
{
$res = urlencode($str);
$res = preg_replace("/\+/", "%20", $res);
$res = preg_replace("/\*/", "%2A", $res);
$res = preg_replace("/%7E/", "~", $res);
return $res;
} /**
* @param $url
* @return mixed
*/
private function fetchContent($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"x-sdk-client" => "php/2.0.0"
)); if(substr($url, 0,5) == 'https') {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
} $rtn = curl_exec($ch); if($rtn === false) {
trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
}
curl_close($ch); return $rtn;
}
}
app/querySendDetails.php
<?php
/*
* 此文件用于验证短信服务API接口,供开发时参考
* 执行验证前请确保文件为utf-8编码,并替换相应参数为您自己的信息,并取消相关调用的注释
* 建议验证前先执行Test.php验证PHP环境
*
* 2017/11/30
*/ namespace aliyun_mns\app; use aliyun_mns\SignatureHelper; /**
* Class querySendDetails
* @package aliyun_mns\app
*/
class querySendDetails { public function __construct()
{
//..
} /**
* @var array
*/
protected $config = []; /**
* @param $name
* @return mixed
*/
public function __get($name)
{
return $this->config[$name];
} protected $accessKeyId;
protected $accessKeySecret; }
/**
* 短信发送记录查询
*/
function querySendDetails() { $params = array ();
// *** 需用户填写部分 *** // fixme 必填: 请参阅 https://ak-console.aliyun.com/ 取得您的AK信息
$accessKeyId = "LTAIFtsByAFF5ovd";
$accessKeySecret = "wGFc0xlA14cYgz1MtDVkSSOQ6japUH";
$test=[
'PhoneNumber'=>'', // fixme 必填: 短信接收号码
'SendDate'=>'', // fixme 必填: 短信发送日期,格式Ymd,支持近30天记录查询
'PageSize'=>10, // fixme 必填: 分页大小
'CurrentPage'=>1, // fixme 必填: 当前页码
'BizId'=>'' // fixme 可选: 设置发送短信流水号
]; $helper = new SignatureHelper(); // 此处可能会抛出异常,注意catch
$content = $helper->request(
$accessKeyId,
$accessKeySecret,
"dysmsapi.aliyuncs.com",
array_merge($params, array(
"RegionId" => "cn-hangzhou",
"Action" => "QuerySendDetails",
"Version" => "2017-05-25",
))
); return $content;
} ini_set("display_errors", "on"); // 显示错误提示,仅用于测试时排查问题
set_time_limit(0); // 防止脚本超时,仅用于测试使用,生产环境请按实际情况设置
header("Content-Type: text/plain; charset=utf-8"); // 输出为utf-8的文本格式,仅用于测试 // 验证查询短信发送情况(QuerySendDetails)接口
print_r(querySendDetails());

config.php配置类:

<?php
/**
* Created by 徐锅
* User: 徐锅
* Date: 2018/1/19
* Time: 14:49
*/
return [
'captchaNum'=>4,
'accessKeyId'=>'填写自己的 accessKeyId',
'accessKeySecret'=>'填写自己的 accessKeySecret',
//以上配置了一般签权信息 'sendSms' =>[
"RegionId" => "cn-hangzhou",
"Action" => "SendSms",
"Version" => "2017-05-25",
"SignName" => "短信签名1",// fixme 必填: 短信签名
'PhoneNumbers'=>'',// fixme 必填: 短信接收号码
'TemplateParam'=>[],//fixme 可选: 设置模板参数,idea:['code'=>'SMS_61200089','customer'=>'yadan']
'TemplateCode'=>'',//fixme 模板 Code
'OutId'=>'12345',// fixme 可选: 设置发送短信流水号
'SmsUpExtendCode'=>'1234567', // fixme 可选: 上行短信扩展码, 扩展码字段控制在7位或以下,无特殊需求用户请忽
'domain'=>'dysmsapi.aliyuncs.com',// fixme API接口所在域名
], 'drawPrizeSendSms' =>[
"RegionId" => "cn-hangzhou",
"Action" => "SendSms",
"Version" => "2017-05-25",
"SignName" => "短信签名2",// fixme 必填: 短信签名
'PhoneNumbers'=>'',// fixme 必填: 短信接收号码
'TemplateParam'=>[],//fixme 可选: 设置模板参数,idea:['code'=>'SMS_61200089','customer'=>'yadan']
'TemplateCode'=>'',//fixme 模板 Code
'OutId'=>'12345',// fixme 可选: 设置发送短信流水号
'SmsUpExtendCode'=>'1234567', // fixme 可选: 上行短信扩展码, 扩展码字段控制在7位或以下,无特殊需求用户请忽
'domain'=>'dysmsapi.aliyuncs.com',// fixme API接口所在域名
],
//以上应用了两个短信签名,具体应用多少个自己在阿里云配置。主要用于发送短信的主体名称 'querySendDetails'=>[
'PhoneNumber'=>'', // fixme 必填: 短信接收号码
'SendDate'=>'', // fixme 必填: 短信发送日期,格式Ymd,支持近30天记录查询
'PageSize'=>10, // fixme 必填: 分页大小
'CurrentPage'=>1, // fixme 必填: 当前页码
'BizId'=>'' // fixme 可选: 设置发送短信流水号
],
//以上是配置接受短信的信息与短信长度的配置 'sms'=>[
'validate_ip'=>true,
'customer_verify_true'=>[
'code'=>'SMS_132090198',
'customer_name'=>'',
'activity_name'=>'',
'draw_prize_number'=>'',
],
'customer_verify_true_to_distr'=>[
'code'=>'SMS_132095195',
'distr_name'=>'',
'customer_name'=>'',
'customer_phone'=>'',
'activity_name'=>''
],
'customer_award_true_to_distr'=>[
'code'=>'SMS_132090445',
'distr_name'=>'',
'customer_name'=>'',
'customer_phone'=>'',
'date'=>'',
],
'customer_award_true'=>[
'code'=>'SMS_132100332',
'customer_name'=>'',
'date'=>'',
]
],//以上是对于短信模板的配置。具体可以在阿里创建设置,code为模板代码,其他为模板变量 ];

app/sendSms.php调用类:

<?php
/*
* 此文件用于验证短信服务API接口,供开发时参考
* 执行验证前请确保文件为utf-8编码,并替换相应参数为您自己的信息,并取消相关调用的注释
* 建议验证前先执行Test.php验证PHP环境
*
* 2017/11/30
*/ namespace aliyun_mns\app; use aliyun_mns\SignatureHelper; class sendSmsDrawPrize extends SignatureHelper{ /**
*助手类
* @var SignatureHelper
*/
protected $signatureHelper;
/**
* key
* @var
*/
protected $accessKeyId;
protected $accessKeySecret;
protected $options;
/**
* @var array
*/
protected $config = []; /**
* sendSms constructor.
*/
public function __construct($config= [])
{
$this->options = require_once dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR . 'config.php';
$this->accessKeyId = $this->options['accessKeyId'];
$this->accessKeySecret =$this->options['accessKeySecret'];
$this->signatureHelper = new SignatureHelper();
$this->config = count($config)?array_merge($this->options['drawPrizeSendSms'],[]):$this->options['drawPrizeSendSms'];
//..
} /**
* @param $name
* @return mixed
*/
public function __get($name)
{
return $this->config[$name];
} /**
* @param string $type string 模板名称
* @param int $mobileNum float 手机号
* @return array
*/
public function index($type='',$mobileNum = 0,$msg_captcha = false,$temp_body = [])
{;
if(!is_numeric($mobileNum)){
exit('Phone Number Error or Undefined');
}
ini_set("display_errors", "on"); // 显示错误提示,仅用于测试时排查问题
set_time_limit(0); // 防止脚本超时,仅用于测试使用,生产环境请按实际情况设置
header("Content-Type: text/plain; charset=utf-8"); // 输出为utf-8的文本格式,仅用于测试
$sms_captcha = $msg_captcha?:$this->register_captcha($this->options['captchaNum']);
// 验证发送短信(SendSms)接口
$sms_return = $this->sendSms($type,$mobileNum,$sms_captcha,$temp_body);//$temp_body 短信发送的内容数组,细节请参考短信模板填写
$sms_arr = $this->objectToArray($sms_return);
return array_merge($sms_arr,['captcha'=>$sms_captcha]);
} /**
* @param int $captcha_num int 验证码长度
* @return int
*/
private function register_captcha($captcha_num = 4)
{
$count=[];
for($i =0;$i<$captcha_num; $i++){
$count[] =rand(1, 9);
}
$captcha = (int) implode("",$count);
return $captcha;
} /**
fixme 成功返回
array(5) {
["Message"] => string(2) "OK"
["RequestId"] => string(36) "DFFD5D4A-304E-4F39-9744-72FA6099C076"
["BizId"] => string(20) "224507516603473690^0"
["Code"] => string(2) "OK"
["captcha"] => int(4833)
}
*/ /**
* fixme actine sms event
* @return bool|\stdClass
*/
private function sendSms($type,$mobileNum,$captcha,$temp_body)
{
(!empty($type)) or exit('sms type empty error');
$params = $this->getSmsConfig($type,$mobileNum,$captcha,$temp_body);
// *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
if(!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
$params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
} // 此处可能会抛出异常,注意catch
$content = $this->signatureHelper->request(
$this->accessKeyId,
$this->accessKeySecret,
$this->domain,
$params
); return $content;
} /**
* 添加
* 获取短信配置 $temp_body 数组
* @param string $sms_type fixme: repasswd/login/register/dev
* @return array
*/
public function getSmsConfig($sms_type='',$mobileNum,$captcha = '0000',$temp_body)
{
$arr = $this->options['sms'];$sms_con=[];
foreach ($arr as $key=>$value)
{
if($sms_type === $key){
$sms_con = $arr[$key];break;
}else{
continue;
}
}
$parmas = [];
$parmas['PhoneNumbers']= $mobileNum;
$parmas['TemplateCode']= $sms_con['code'];//模板code
$sms_con['code']= $captcha;//模板验证码
$parmas['TemplateParam']= array_merge($sms_con,$temp_body);
return array_merge($this->config,$parmas);
} /**
* 对象转换数组
* @param $object
* @return mixed
*/
function objectToArray(&$object) {
$object = json_decode(json_encode($object),true);
return $object;
} }

使用实例:

$sms_msg = $sendSms->index($type,$moblie,$msg_captcha,$temp_body);
type :模板名称,即是配置config.php里的短信模板的键名,由此得到code
moblie:要发送用户的手机号
msg_captcha:发送验证码时,发送几位数
temp_body:模板变量

以上是非常简易的短信发送demo,也可以直接使用官网demo接入;

以上只是发送短信,更多时间频率的控制需要开发者自行设计;

2018阿里云短信发送DEMO接入简单实例的更多相关文章

  1. Abp 添加阿里云短信发送

    ABP中有短信发送接口ISmsSender public interface ISmsSender { Task<string> SendAsync(string number, stri ...

  2. spring boot集成阿里云短信发送接收短信回复功能

    1.集成阿里云通信发送短信: 在pom.xml文件里添加依赖 <!--阿里短信服务--> <dependency> <groupId>com.aliyun</ ...

  3. tp5阿里云短信发送

    到阿里云下载php版demo,下完整版的,不是轻量级的; 框架  :TP5 把下载下来的文件放到extend里面 文件名:alimsg 里面的文件 import('alimsg.api_demo.Sm ...

  4. 阿里云短信发送服务SDK-Python3

    本文提供阿里云的短信发送服务SDK,使用Python3实现. # -*- coding: utf-8 -*- # pip install requests import requests import ...

  5. .net core 使用阿里云短信发送SMS

    阿里云官方的skd(aliyun-net-sdk-core,aliyun-net-sdk-dysmsapi)在dnc中发送短信会出错,nuget上的包貌似也一样不管用.直接改下sdk当然也可以,但就发 ...

  6. java 阿里云短信发送

    记录自己的足迹,学习的路很长,一直在走着呢~ 第一步登录阿里云的控制台,找到此处: 点击之后就到此页面,如果发现账号有异常或者泄露什么,可以禁用或者删除  AccessKey: 此处方便测试,所以就新 ...

  7. 阿里云短信验证解决方案(java版)(redis存储)

    最近搞了一个互联网项目的注册,需要写一个手机号验证(由于之前没有轮子,只能自己摸索了); 1:基本思路: 1>购买了阿里云短信服务->下载阿里云短信发送demo(java版); 2> ...

  8. ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成

    在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件.短信的基础支持,那么只需要根据自己的情况实现对应的接 ...

  9. 移动端获取短信验证码java实现——阿里云短信服务

    需求:移动端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短信 ...

随机推荐

  1. 软件工程(FZU2015) 学生博客列表(最终版)

    FZU:福州大学软件工程 张老师的博客:http://www.cnblogs.com/easteast/ 经过前两周选课,最后正式选上课程的所有学生博客如下: 序号 学号后3位 博客 1 629 li ...

  2. Javascript模板引擎handlebars使用

    源地址:http://rfyiamcool.blog.51cto.com/1030776/1278620 代码示例: <!DOCTYPE html> <html> <he ...

  3. ES使用C#添加和更新文档

    ElasticSearch 使用C#添加和更新文档 这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:Elas ...

  4. web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法

    问题描述 最近将公司官网样式进行了调整,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了c ...

  5. Servlet 快速概览

    目录 生命周期 web.xml 获取表单数据(设置请求的编码格式) 返回响应内容(设置响应的编码格式) 结合前两点,总结基本模板 获取请求协议头部信息 设置响应头部信息 使用过滤器 在web.xml中 ...

  6. Hibernate two table same id

    Hibernate更新数据(不用update也可以) - 森林木马 - 博客园 https://www.cnblogs.com/owenma/p/3481497.html hibernate级联更新会 ...

  7. Eclipse External Tool Configration Notepad++

    Location: C:\Program Files\Notepad++\notepad++.exe Arguments: ${resource_loc}

  8. Velocity中判断是否为空

    方法一: 使用 #ifnull() 或 #ifnotnull() eg:#ifnull ($foo) 要使用这个特性必须在velocity.properties文件中加入: userdirective ...

  9. vue页面传参和接参

    https://blog.csdn.net/zhouzuoluo/article/details/81259298(copy) js** this.$router.push({ name: 'Flow ...

  10. SQL年月日格式化

    Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16