alismsChajian.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. /**
  3. * 阿里云短信服务api
  4. */
  5. class alismsChajian extends Chajian{
  6. private $accesskeyid;
  7. private $accesskeysecret;
  8. protected function initChajian()
  9. {
  10. $this->accesskeyid = getconfig('alisms_keyid');
  11. $this->accesskeysecret = getconfig('alisms_keysecret');
  12. }
  13. /**
  14. * 批量发送短信
  15. */
  16. public function send($mobiles, $qianm, $tplid, $cans=array())
  17. {
  18. if(isempt($this->accesskeyid) || isempt($this->accesskeysecret))return returnerror('没有设置短信keyid或keysecret');
  19. if(isempt($qianm))return returnerror('请设置短信签名');
  20. if(isempt($tplid) || substr($tplid,0,4) != 'SMS_')return returnerror('短信模版CODE格式有误');
  21. $mbarr = $this->getTplcont($tplid);
  22. if(!$mbarr['success'])return $mbarr;
  23. $tplcont = $mbarr['data']['TemplateContent'];
  24. if(isset($cans['url']))$cans['url'] = c('xinhuapi')->urlsmall($cans['url']); //如果有短域名用这个生成,不要就删掉这行
  25. //把没用参数删掉
  26. $csarr = $this->rock->matcharr($tplcont);
  27. foreach($csarr as $cs1)if(!isset($cans[$cs1]))return returnerror('模版里有{'.$cs1.'}参数,发送必须传');
  28. foreach($cans as $k1=>$v1)if(!in_array($k1, $csarr))unset($cans[$k1]);
  29. $params = array();
  30. $shoujha= explode(',', $mobiles);
  31. $params["PhoneNumberJson"] = $shoujha;
  32. $params["TemplateCode"] = $tplid;
  33. foreach($shoujha as $smid){
  34. $params["SignNameJson"][] = $qianm;
  35. if($cans)$params["TemplateParamJson"][] = $cans;
  36. }
  37. if($cans)$params["TemplateParamJson"] = json_encode($params["TemplateParamJson"], JSON_UNESCAPED_UNICODE);
  38. $params["SignNameJson"] = json_encode($params["SignNameJson"], JSON_UNESCAPED_UNICODE);
  39. $params["PhoneNumberJson"] = json_encode($params["PhoneNumberJson"], JSON_UNESCAPED_UNICODE);
  40. $helper = new SignatureHelper();
  41. $result = $helper->request(
  42. $this->accesskeyid,
  43. $this->accesskeysecret,
  44. 'dysmsapi.aliyuncs.com',
  45. array_merge($params, array(
  46. "RegionId" => "cn-hangzhou",
  47. "Action" => "SendBatchSms",
  48. "Version" => "2017-05-25",
  49. ))
  50. );
  51. if(!$result)return returnerror('发送失败');
  52. $barr = json_decode($result, true);
  53. if($barr['Code']=='OK')return returnsuccess($barr);
  54. return returnerror('发送失败:'.$result.'');
  55. }
  56. public function getTplcont($tplid)
  57. {
  58. $num = 'alisms_'.$tplid.'';
  59. $val = m('option')->getval($num);
  60. if(!isempt($val)){
  61. return returnsuccess(array('TemplateContent'=>$val));
  62. }
  63. if(isempt($this->accesskeyid) || isempt($this->accesskeysecret))return returnerror('没有设置短信keyid或keysecret');
  64. $helper = new SignatureHelper();
  65. $params['TemplateCode'] = $tplid;
  66. $result = $helper->request(
  67. $this->accesskeyid,
  68. $this->accesskeysecret,
  69. 'dysmsapi.aliyuncs.com',
  70. array_merge($params, array(
  71. "RegionId" => "cn-hangzhou",
  72. "Action" => "QuerySmsTemplate",
  73. "Version" => "2017-05-25",
  74. ))
  75. );
  76. if(!$result)return returnerror('获取模版失败'.$tplid.'');
  77. $barr = json_decode($result, true);
  78. if($barr['Code']=='OK'){
  79. m('option')->setval($num, $barr['TemplateContent']);
  80. return returnsuccess($barr);
  81. }
  82. return returnerror('获取失败:'.$result.'');
  83. }
  84. }
  85. /**
  86. * 签名助手 2017/11/19
  87. *
  88. * Class SignatureHelper
  89. */
  90. class SignatureHelper {
  91. /**
  92. * 生成签名并发起请求
  93. *
  94. * @param $accessKeyId string AccessKeyId (https://ak-console.aliyun.com/)
  95. * @param $accessKeySecret string AccessKeySecret
  96. * @param $domain string API接口所在域名
  97. * @param $params array API具体参数
  98. * @param $security boolean 使用https
  99. * @return bool|\stdClass 返回API接口调用结果,当发生错误时返回false
  100. */
  101. public function request($accessKeyId, $accessKeySecret, $domain, $params, $security=false) {
  102. $apiParams = array_merge(array (
  103. "SignatureMethod" => "HMAC-SHA1",
  104. "SignatureNonce" => uniqid(mt_rand(0,0xffff), true),
  105. "SignatureVersion" => "1.0",
  106. "AccessKeyId" => $accessKeyId,
  107. "Timestamp" => gmdate("Y-m-d\TH:i:s\Z"),
  108. "Format" => "JSON",
  109. ), $params);
  110. ksort($apiParams);
  111. $sortedQueryStringTmp = "";
  112. foreach ($apiParams as $key => $value) {
  113. $sortedQueryStringTmp .= "&" . $this->encode($key) . "=" . $this->encode($value);
  114. }
  115. $stringToSign = "GET&%2F&" . $this->encode(substr($sortedQueryStringTmp, 1));
  116. $sign = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&",true));
  117. $signature = $this->encode($sign);
  118. $url = ($security ? 'https' : 'http')."://{$domain}/?Signature={$signature}{$sortedQueryStringTmp}";
  119. try {
  120. $content = $this->fetchContent($url);
  121. return $content;
  122. } catch( \Exception $e) {
  123. return false;
  124. }
  125. }
  126. private function encode($str)
  127. {
  128. $res = urlencode($str);
  129. $res = preg_replace("/\+/", "%20", $res);
  130. $res = preg_replace("/\*/", "%2A", $res);
  131. $res = preg_replace("/%7E/", "~", $res);
  132. return $res;
  133. }
  134. private function fetchContent($url) {
  135. $ch = curl_init();
  136. curl_setopt($ch, CURLOPT_URL, $url);
  137. curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  138. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  139. curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  140. "x-sdk-client" => "php/2.0.0"
  141. ));
  142. if(substr($url, 0,5) == 'https') {
  143. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  144. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  145. }
  146. $rtn = curl_exec($ch);
  147. if($rtn === false) {
  148. trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
  149. }
  150. curl_close($ch);
  151. return $rtn;
  152. }
  153. }
粤ICP备19079148号