当前位置:首页 > PHP教程 > php高级应用 > 列表

php与阿里云短信接口接入操作案例分析

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-10 08:59:31 浏览: 评论:0 

本文实例讲述了php与阿里云短信接口接入操作,分享给大家供大家参考,具体如下:

使用阿里云短信API,需要在控制台获取以下必要参数,其中需要自己手机验证+官方审核多次,尤其审核需要保持耐心。

1. accessKeyId  相当于你的个人账户密钥;

2. accessKeySecret 与上是成对的;

3. SignName  个人签名,在发出去的短信中,这个签名会显示在开头,类似 【签名】亲爱的用户...... 这种格式,SignName需要通过提交审核;

4.TemplateCode  模板代码,阿里云短信是无法完全自定义短信的,需要通过审核的模板,然后自己再替换掉模板中的变量,如模板:“您的验证码是$[code]” ,code就是变量,使用时需设置变量值{"code":"12345"}(设置变量值的过程在demo中实现),短信发出去后变成:“您的验证码是12345”,每个通过审核的模板会提供一个模板代码;

最新的阿里云短信接口,适用于阿里大于搬家以后的情况。

之前一直用阿里大于的短信接口,最近上项目时发现阿里大于悄悄地搬家到了阿里云!阿里云的SDK文件繁多,看得一头雾水!下面代码是最新的可适用于阿里云短信服务的类,亲测成功!

  1. <?php 
  2. /** 
  3.  * 阿里云短信验证码发送类 
  4.  * @author Administrator 
  5.  * 
  6.  */ 
  7. class Sms { 
  8.  
  9.   // 保存错误信息 
  10.  
  11.   public $error
  12.  
  13.   // Access Key ID 
  14.  
  15.   private $accessKeyId = ''
  16.  
  17.   // Access Access Key Secret 
  18.  
  19.   private $accessKeySecret = ''
  20.  
  21.   // 签名 
  22.  
  23.   private $signName = ''
  24.  
  25.   // 模版ID 
  26.  
  27.   private $templateCode = ''
  28.  
  29.   public function __construct($cofig = array()) { 
  30.  
  31.     $cofig = array ( 
  32.  
  33.         'accessKeyId' => 'xxxxxxxxxxx'
  34.  
  35.         'accessKeySecret' => 'xxxxxxxxxx'
  36.  
  37.         'signName' => '你的签名'
  38.  
  39.         'templateCode' => 'SMS_76510109' 
  40.  
  41.     ); 
  42.  
  43.     // 配置参数 
  44.  
  45.     $this->accessKeyId = $cofig ['accessKeyId']; 
  46.  
  47.     $this->accessKeySecret = $cofig ['accessKeySecret']; 
  48.  
  49.     $this->signName = $cofig ['signName']; 
  50.  
  51.     $this->templateCode = $cofig ['templateCode']; 
  52.  
  53.   } 
  54.  
  55.   private function percentEncode($string) { 
  56.  
  57.     $string = urlencode ( $string ); 
  58.  
  59.     $string = preg_replace ( '/\+/''%20'$string ); 
  60.  
  61.     $string = preg_replace ( '/\*/''%2A'$string ); 
  62.  
  63.     $string = preg_replace ( '/%7E/''~'$string ); 
  64.  
  65.     return $string
  66.  
  67.   } 
  68.  
  69.   /** 
  70.    * 签名 
  71.    * 
  72.    * @param unknown $parameters       
  73.    * @param unknown $accessKeySecret       
  74.    * @return string 
  75.    */ 
  76.  
  77.   private function computeSignature($parameters$accessKeySecret) { 
  78.  
  79.     ksort ( $parameters ); 
  80.  
  81.     $canonicalizedQueryString = ''
  82.  
  83.     foreach ( $parameters as $key => $value ) { 
  84.  
  85.       $canonicalizedQueryString .= '&' . $this->percentEncode ( $key ) . '=' . $this->percentEncode ( $value ); 
  86.  
  87.     } 
  88.  
  89.     $stringToSign = 'GET&%2F&' . $this->percentencode ( substr ( $canonicalizedQueryString, 1 ) ); 
  90.  
  91.     $signature = base64_encode ( hash_hmac ( 'sha1'$stringToSign$accessKeySecret . '&', true ) ); 
  92.  
  93.     return $signature
  94.  
  95.   } 
  96.  
  97.   /** 
  98.    * @param unknown $mobile       
  99.    * @param unknown $verify_code       
  100.    * 
  101.    */ 
  102.  
  103.   public function send_verify($mobile$verify_code) { 
  104.  
  105.     $params = array (  //此处作了修改 
  106.  
  107.         'SignName' => $this->signName, 
  108.  
  109.         'Format' => 'JSON'
  110.  
  111.         'Version' => '2017-05-25'
  112.  
  113.         'AccessKeyId' => $this->accessKeyId, 
  114.  
  115.         'SignatureVersion' => '1.0'
  116.  
  117.         'SignatureMethod' => 'HMAC-SHA1'
  118.  
  119.         'SignatureNonce' => uniqid (), 
  120.  
  121.         'Timestamp' => gmdate ( 'Y-m-d\TH:i:s\Z' ), 
  122.  
  123.         'Action' => 'SendSms'
  124.  
  125.         'TemplateCode' => $this->templateCode, 
  126.  
  127.         'PhoneNumbers' => $mobile
  128.  
  129.         //'TemplateParam' => '{"code":"' . $verify_code . '"}'  
  130.  
  131.         'TemplateParam' => '{"time":"1234"}'  //更换为自己的实际模版 
  132.  
  133.     ); 
  134.  
  135.     //var_dump($params);die; 
  136.  
  137.     // 计算签名并把签名结果加入请求参数 
  138.  
  139.     $params ['Signature'] = $this->computeSignature ( $params$this->accessKeySecret ); 
  140.  
  141.     // 发送请求(此处作了修改) 
  142.  
  143.     //$url = 'https://sms.aliyuncs.com/?' . http_build_query ( $params ); 
  144.  
  145.     $url = 'http://dysmsapi.aliyuncs.com/?' . http_build_query ( $params ); 
  146.  
  147.     $ch = curl_init (); 
  148.  
  149.     curl_setopt ( $ch, CURLOPT_URL, $url ); 
  150.  
  151.     curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); 
  152.  
  153.     curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE ); 
  154.  
  155.     curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); 
  156.  
  157.     curl_setopt ( $ch, CURLOPT_TIMEOUT, 10 ); 
  158.  
  159.     $result = curl_exec ( $ch ); 
  160.  
  161.     curl_close ( $ch ); 
  162.  
  163.     $result = json_decode ( $result, true ); 
  164.  
  165.     //var_dump($result);die; 
  166.  
  167.     if (isset ( $result ['Code'] )) { 
  168.  
  169.       $this->error = $this->getErrorMessage ( $result ['Code'] ); 
  170.  
  171.       return false; 
  172.  
  173.     } 
  174.  
  175.     return true; 
  176.  
  177.   } 
  178.  
  179.   /** 
  180.    * 获取详细错误信息 
  181.    * 
  182.    * @param unknown $status       
  183.    */ 
  184.  
  185.   public function getErrorMessage($status) { 
  186.  
  187.     // 阿里云的短信 乱八七糟的(其实是用的阿里大于) 
  188.  
  189.     // https://api.alidayu.com/doc2/apiDetail?spm=a3142.7629140.1.19.SmdYoA&apiId=25450 
  190.  
  191.     $message = array ( 
  192.  
  193.         'InvalidDayuStatus.Malformed' => '账户短信开通状态不正确'
  194.  
  195.         'InvalidSignName.Malformed' => '短信签名不正确或签名状态不正确'
  196.  
  197.         'InvalidTemplateCode.MalFormed' => '短信模板Code不正确或者模板状态不正确'
  198.  
  199.         'InvalidRecNum.Malformed' => '目标手机号不正确,单次发送数量不能超过100'
  200.  
  201.         'InvalidParamString.MalFormed' => '短信模板中变量不是json格式'
  202.  
  203.         'InvalidParamStringTemplate.Malformed' => '短信模板中变量与模板内容不匹配'
  204.  
  205.         'InvalidSendSms' => '触发业务流控'
  206.  
  207.         'InvalidDayu.Malformed' => '变量不能是url,可以将变量固化在模板中' 
  208.  
  209.     ); 
  210.  
  211.     if (isset ( $message [$status] )) { 
  212.  
  213.       return $message [$status]; 
  214.  
  215.     } 
  216.  
  217.     return $status
  218.  
  219.   } 
  220.  

调用方法:

  1. //生成验证码 
  2. $mobile = 'xxxxxxx'
  3. $code = rand ( 1000, 9999 ); 
  4. //发送短信 
  5. $sms = new Sms(); 
  6.  
  7. //测试模式 
  8. $status = $sms->send_verify($mobile$code); 
  9. if (!$status) { 
  10.  echo $sms->error; 
  11.  
  12. }

Tags: php阿里云短信接口

分享到: