You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.9 KiB
159 lines
5.9 KiB
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | YFCMF [ WE CAN DO IT MORE SIMPLE ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2015-2016 http://www.rainfer.cn All rights reserved.
|
|
// +----------------------------------------------------------------------
|
|
// | Author: rainfer <81818832@qq.com>
|
|
// +----------------------------------------------------------------------
|
|
class Alisms
|
|
{
|
|
private $method = 'GET';
|
|
private $api = 'https://sms.aliyuncs.com/'; //短信接口
|
|
private $dateTimeFormat = 'Y-m-d\TH:i:s\Z';
|
|
private $config = [
|
|
'Format' => 'json',
|
|
'Version' => '2016-09-27',
|
|
'SignatureMethod' => 'HMAC-SHA1',
|
|
'SignatureVersion' => "1.0",
|
|
'signName' => '', //管理控制台中配置的短信签名(状态必须是验证通过)
|
|
'TemplateCode' => '',
|
|
'AccessKeyId' => '',
|
|
'accessKeySecret' => '',
|
|
];
|
|
|
|
public function __construct($config = [])
|
|
{
|
|
$this->config($config);
|
|
}
|
|
|
|
/*读取配置*/
|
|
public function config($config = [])
|
|
{
|
|
/**
|
|
*发送短信
|
|
*@AccessKeyId 阿里云申请的 Access Key ID
|
|
*@AccessKeySecret 阿里云申请的 Access Key Secret
|
|
*/
|
|
if(config('think_sdk_sms.AccessKeyId')) $conf['AccessKeyId']=config('think_sdk_sms.AccessKeyId');
|
|
if(config('think_sdk_sms.accessKeySecret')) $conf['accessKeySecret']=config('think_sdk_sms.accessKeySecret');
|
|
if(config('think_sdk_sms.signName')) $conf['signName']=config('think_sdk_sms.signName');
|
|
if(config('think_sdk_sms.TemplateCode')) $conf['TemplateCode']=config('think_sdk_sms.TemplateCode');
|
|
$this->config = array_merge($this->config, $conf);
|
|
$this->config = array_merge($this->config, $config);
|
|
if(!config('think_sdk_sms.sms_open')){
|
|
throw new Exception("短信系统尚未配置和未开启!");
|
|
}else{
|
|
return $this;
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
*发送短信
|
|
*@mobile 目标手机号,多个手机号可以逗号分隔
|
|
*@code 短信模板的模板CODE
|
|
*@ParamString 短信模板中的变量;,参数格式{“no”:”123456”}, 个人用户每个变量长度必须小于15个字符
|
|
*/
|
|
public function smsend($mobile,$ParamString,$code='')
|
|
{
|
|
date_default_timezone_set("GMT");
|
|
$dateTimeFormat = 'Y-m-d\TH:i:s\Z'; // ISO8601规范
|
|
if(!$code){
|
|
$code = $this->config['TemplateCode'];
|
|
}
|
|
$data = array(
|
|
'SignName' => $this->config['signName'],
|
|
'Format' => $this->config['Format'],
|
|
'Version' => $this->config['Version'],
|
|
'AccessKeyId' => $this->config['AccessKeyId'],
|
|
'SignatureVersion' => $this->config['SignatureVersion'],
|
|
'SignatureMethod' => $this->config['SignatureMethod'],
|
|
'SignatureNonce' => md5('estxiu.com').rand(100000,999999).uniqid(), //唯一随机数
|
|
'Timestamp' => date($dateTimeFormat),
|
|
// 接口参数
|
|
'Action' => 'SingleSendSms',
|
|
'TemplateCode' => $code,
|
|
'RecNum' => $mobile,
|
|
'ParamString' => $ParamString,
|
|
);
|
|
$data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']);
|
|
//var_dump($data);exit;
|
|
$data = $this->http($this->api, $data, $this->method);
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 发送HTTP请求方法,目前只支持CURL发送请求
|
|
* @param string $url 请求URL
|
|
* @param array $params 请求参数
|
|
* @param string $method 请求方法GET/POST
|
|
* @return array $data 响应数据
|
|
*/
|
|
protected function http($url, $params, $method = 'GET', $header = array(), $multi = false)
|
|
{
|
|
$opts = array(
|
|
CURLOPT_TIMEOUT => 30,
|
|
CURLOPT_RETURNTRANSFER => 1,
|
|
CURLOPT_SSL_VERIFYPEER => false,
|
|
CURLOPT_SSL_VERIFYHOST => false,
|
|
CURLOPT_HTTPHEADER => $header
|
|
);
|
|
|
|
/* 根据请求类型设置特定参数 */
|
|
switch (strtoupper($method)) {
|
|
case 'GET':
|
|
$opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
|
|
break;
|
|
case 'POST':
|
|
//判断是否传输文件
|
|
$params = $multi ? $params : http_build_query($params);
|
|
$opts[CURLOPT_URL] = $url;
|
|
$opts[CURLOPT_POST] = 1;
|
|
$opts[CURLOPT_POSTFIELDS] = $params;
|
|
break;
|
|
default:
|
|
exception('不支持的请求方式!');
|
|
}
|
|
|
|
/* 初始化并执行curl请求 */
|
|
$ch = curl_init();
|
|
curl_setopt_array($ch, $opts);
|
|
$data = curl_exec($ch);
|
|
$error = curl_error($ch);
|
|
curl_close($ch);
|
|
if ($error)
|
|
exception('请求发生错误:' . $error);
|
|
return $data;
|
|
}
|
|
|
|
//生成取短信签名
|
|
private function computeSignature($parameters, $accessKeySecret)
|
|
{
|
|
ksort($parameters);
|
|
$canonicalizedQueryString = '';
|
|
foreach($parameters as $key => $value){
|
|
$canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
|
|
}
|
|
$stringToSign = $this->method.'&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
|
|
$signature = $this->signString($stringToSign, $accessKeySecret."&");
|
|
return $signature;
|
|
}
|
|
private function percentEncode($str)
|
|
{
|
|
$res = urlencode($str);
|
|
$res = preg_replace('/\+/', '%20', $res);
|
|
$res = preg_replace('/\*/', '%2A', $res);
|
|
$res = preg_replace('/%7E/', '~', $res);
|
|
return $res;
|
|
}
|
|
private function signString($source, $accessSecret)
|
|
{
|
|
return base64_encode(hash_hmac('sha1', $source, $accessSecret, true));
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|