123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- <?php
- namespace app\common\library;
- /**
- * 阿里大于SMS短信发送
- */
- class Alisms
- {
- private $_params = [];
- public $error = '';
- protected $config = [];
- protected static $instance;
- public function __construct($options = [])
- {
- if ($config = config('alisms')) {
- $this->config = array_merge($this->config, $config);
- }
- $this->config = array_merge($this->config, is_array($options) ? $options : []);
- }
- /**
- * 单例
- * @param array $options 参数
- * @return Alisms
- */
- public static function instance($options = [])
- {
- if (is_null(self::$instance)) {
- self::$instance = new static($options);
- }
- return self::$instance;
- }
- /**
- * 设置签名
- * @param string $sign
- * @return Alisms
- */
- public function sign($sign = '')
- {
- $this->_params['SignName'] = $sign;
- return $this;
- }
- /**
- * 设置参数
- * @param array $param
- * @return Alisms
- */
- public function param(array $param = [])
- {
- foreach ($param as $k => &$v) {
- $v = (string)$v;
- }
- unset($v);
- $param = array_filter($param);
- $this->_params['TemplateParam'] = $param ? json_encode($param) : '{}';
- return $this;
- }
- /**
- * 设置模板
- * @param string $code 短信模板
- * @return Alisms
- */
- public function template($code = '')
- {
- $this->_params['TemplateCode'] = $code;
- return $this;
- }
- /**
- * 接收手机
- * @param string $mobile 手机号码
- * @return Alisms
- */
- public function mobile($mobile = '')
- {
- $this->_params['PhoneNumbers'] = $mobile;
- return $this;
- }
- /**
- * 立即发送
- * @return boolean
- */
- public function send()
- {
- $this->error = '';
- $params = $this->_params();
- $params['Signature'] = $this->_signed($params);
- $response = $this->_curl($params);
- if ($response !== false) {
- $res = (array)json_decode($response, true);
- if (isset($res['Code']) && $res['Code'] == 'OK') {
- return true;
- }
- $this->error = isset($res['Message']) ? $res['Message'] : 'InvalidResult';
- } else {
- $this->error = 'InvalidResult';
- }
- return false;
- }
- /**
- * 获取错误信息
- * @return string
- */
- public function getError()
- {
- return $this->error;
- }
- private function _params()
- {
- return array_merge([
- 'AccessKeyId' => $this->config['key'],
- 'SignName' => isset($this->config['sign']) ? $this->config['sign'] : '',
- 'Action' => 'SendSms',
- 'Format' => 'JSON',
- 'Version' => '2017-05-25',
- 'SignatureVersion' => '1.0',
- 'SignatureMethod' => 'HMAC-SHA1',
- 'SignatureNonce' => uniqid(),
- 'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
- ], $this->_params);
- }
- private function percentEncode($string)
- {
- $string = urlencode($string);
- $string = preg_replace('/\+/', '%20', $string);
- $string = preg_replace('/\*/', '%2A', $string);
- $string = preg_replace('/%7E/', '~', $string);
- return $string;
- }
- private function _signed($params)
- {
- $sign = $this->config['secret'];
- ksort($params);
- $canonicalizedQueryString = '';
- foreach ($params 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, $sign . '&', true));
- return $signature;
- }
- private function _curl($params)
- {
- $uri = 'http://dysmsapi.aliyuncs.com/?' . http_build_query($params);
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($ch, CURLOPT_URL, $uri);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
- curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36");
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
- $reponse = curl_exec($ch);
- curl_close($ch);
- return $reponse;
- }
- }
|