Alisms.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /**
  3. * 阿里云短信接口
  4. * @author 墨白<453885726@qq.com>
  5. * 示例
  6. * $alisms = new \Common\Model\Alisms($accessKeyId,$accessKeySecret);
  7. * $mobile = '18788830181';
  8. * $code = 'SMS_36225243';
  9. * $paramString = '{"code":"344556"}';
  10. * $re = $alisms->smsend($mobile,$code,$paramString);
  11. * print_r($re);
  12. *
  13. */
  14. namespace addons\alisms;
  15. class Alisms{
  16. public $config = array(
  17. 'Format' =>'json', //返回值的类型,支持JSON与XML。默认为XML
  18. 'Version' =>'2017-05-25', //API版本号,为日期形式:YYYY-MM-DD,本版本对应为2016-09-27
  19. 'SignatureMethod' =>'HMAC-SHA1', //签名方式,目前支持HMAC-SHA1
  20. 'SignatureVersion'=>'1.0',
  21. );
  22. private $accessKeySecret;
  23. private $http = 'http://dysmsapi.aliyuncs.com';//https://sms.aliyuncs.com/'; //短信接口
  24. private $dateTimeFormat = 'Y-m-d\TH:i:s\Z';
  25. public $signName = '依雅芙文化传媒'; //管理控制台中配置的短信签名(状态必须是验证通过)
  26. public $method = 'GET';
  27. /**
  28. *发送短信
  29. *@AccessKeyId 阿里云申请的 Access Key ID
  30. *@AccessKeySecret 阿里云申请的 Access Key Secret
  31. */
  32. function __construct($accessKeyId,$accessKeySecret){
  33. $this->config['AccessKeyId'] = $accessKeyId;
  34. $this->AccessKeySecret = $accessKeySecret;
  35. }
  36. /**
  37. *发送短信
  38. *@mobile 目标手机号,多个手机号可以逗号分隔
  39. *@code 短信模板的模板CODE
  40. *@ParamString 短信模板中的变量;,参数格式{“no”:”123456”}, 个人用户每个变量长度必须小于15个字符
  41. */
  42. public function smsend($mobile,$code,$ParamString){
  43. $apiParams = $this->config;
  44. $apiParams["Action"] = 'SendSms';//'SingleSendSms';
  45. $apiParams['TemplateCode'] = $code; //短信模板的模板CODE
  46. //$apiParams['RecNum'] = $mobile; //目标手机号,多个手机号可以逗号分隔
  47. //$apiParams['ParamString'] = $ParamString; //短信模板中的变量;,此参数传递{“no”:”123456”}, 个人用户每个变量长度必须小于15个字符
  48. $apiParams['SignName'] = $this->signName; //管理控制台中配置的短信签名(状态必须是验证通过)
  49. date_default_timezone_set("GMT");
  50. $apiParams["Timestamp"] = date($this->dateTimeFormat);
  51. $apiParams["SignatureNonce"] = md5(md5('wbh').rand(100000,999999).uniqid()); //唯一随机数
  52. $apiParams['RegionId'] = 'cn-hangzhou';
  53. $apiParams['PhoneNumbers'] = $mobile;
  54. $apiParams['TemplateParam'] = $ParamString;
  55. $apiParams["Signature"] = $this->computeSignature($apiParams, $this->AccessKeySecret);//签名
  56. $tag = '?';
  57. $requestUrl = $this->http;
  58. foreach ($apiParams as $apiParamKey => $apiParamValue){
  59. $requestUrl .= $tag."$apiParamKey=" . urlencode($apiParamValue);
  60. $tag = '&';
  61. }
  62. return $this->postSMS($requestUrl);
  63. }
  64. private function postSMS($url){
  65. $ch = curl_init();
  66. curl_setopt($ch, CURLOPT_URL, $url);
  67. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  68. curl_setopt($ch, CURLOPT_HEADER, 0);
  69. $output = curl_exec($ch);
  70. curl_close($ch);
  71. return json_decode($output,true);
  72. /*
  73. $opts = array(
  74. 'http'=>array(
  75. 'method'=>$this->method,
  76. 'timeout'=>600,
  77. 'header'=>'Content-Type: application/x-www-form-urlencoded',
  78. )
  79. );
  80. $html = file_get_contents($url, false, stream_context_create($opts));
  81. if($html){
  82. return json_decode($html,true);
  83. }else{
  84. return false;
  85. }*/
  86. }
  87. //生成取短信签名
  88. private function computeSignature($parameters, $accessKeySecret){
  89. ksort($parameters);
  90. $canonicalizedQueryString = '';
  91. foreach($parameters as $key => $value){
  92. $canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
  93. }
  94. $stringToSign = $this->method.'&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
  95. $signature = $this->signString($stringToSign, $accessKeySecret."&");
  96. return $signature;
  97. }
  98. protected function percentEncode($str){
  99. $res = urlencode($str);
  100. $res = preg_replace('/\+/', '%20', $res);
  101. $res = preg_replace('/\*/', '%2A', $res);
  102. $res = preg_replace('/%7E/', '~', $res);
  103. return $res;
  104. }
  105. private function signString($source, $accessSecret){
  106. return base64_encode(hash_hmac('sha1', $source, $accessSecret, true));
  107. }
  108. }