<lu dir='9sykov'></lu>
      <b id='15u494bj'></b>

          文章熱詞:php,阿裏雲短信接口

          日期:2019-09-09 08:51 by 楊國偉 1652 0 收藏
          我要分享

          摘要:使用阿裏雲短信API,需要在控制台獲取以下必要參數,其中需要自己手機驗證+官方審核多次,尤其審核需要保持耐心。

          1. accessKeyId  相當于你的個人賬戶密鑰;

          2. accessKeySecret 與上是成對的;

          3. SignName  個人簽名,在發出去的短信中,這個簽名會顯示在開頭,類似 【簽名】親愛的用戶...... 這種格式,SignName需要通過提交審核;

          4.TemplateCode  模闆代碼,阿裏雲短信是無法完全自定義短信的,需要通過審核的模闆,然後自己再替換掉模闆中的變量,如模闆:“您的驗證碼是${code}” ,code就是變量,使用時需設置變量值{"code":"12345"}(設置變量值的過程在demo中實現),短信發出去後變成:“您的驗證碼是12345”,每個通過審核的模闆會提供一個模闆代碼;

          最新的阿裏雲短信接口,适用于阿裏大于搬家以後的情況。
          之前一直用阿裏大于的短信接口,最近上項目時發現阿裏大于悄悄地搬家到了阿裏雲!阿裏雲的SDK文件繁多,看得一頭霧水!下面代碼是最新的可适用于阿裏雲短信服務的類,親測成功!

          <?php
          /**
           * 阿裏雲短信驗證碼發送類
           * @author Administrator
           *
           */
          class Sms {
              // 保存錯誤信息
              public $error;
              // Access Key ID
              private $accessKeyId = '';
              // Access Access Key Secret
              private $accessKeySecret = '';
              // 簽名
              private $signName = '';
              // 模版ID
              private $templateCode = '';
              public function __construct($cofig = array()) {
                  $cofig = array (
                          'accessKeyId' => 'xxxxxxxxxxx',
                          'accessKeySecret' => 'xxxxxxxxxx',
                          'signName' => '你的簽名',
                          'templateCode' => 'SMS_76510109'
                  );
                  // 配置參數
                  $this->accessKeyId = $cofig ['accessKeyId'];
                  $this->accessKeySecret = $cofig ['accessKeySecret'];
                  $this->signName = $cofig ['signName'];
                  $this->templateCode = $cofig ['templateCode'];
              }
              private function percentEncode($string) {
                  $string = urlencode ( $string );
                  $string = preg_replace ( '/\+/', '%20', $string );
                  $string = preg_replace ( '/\*/', '%2A', $string );
                  $string = preg_replace ( '/%7E/', '~', $string );
                  return $string;
              }
              /**
               * 簽名
               *
               * @param unknown $parameters            
               * @param unknown $accessKeySecret            
               * @return string
               */
              private function computeSignature($parameters, $accessKeySecret) {
                  ksort ( $parameters );
                  $canonicalizedQueryString = '';
                  foreach ( $parameters 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, $accessKeySecret . '&', true ) );
                  return $signature;
              }
              /**
               * @param unknown $mobile            
               * @param unknown $verify_code            
               *
               */
              public function send_verify($mobile, $verify_code) {
                  $params = array (   //此處作了修改
                          'SignName' => $this->signName,
                          'Format' => 'JSON',
                          'Version' => '2017-05-25',
                          'AccessKeyId' => $this->accessKeyId,
                          'SignatureVersion' => '1.0',
                          'SignatureMethod' => 'HMAC-SHA1',
                          'SignatureNonce' => uniqid (),
                          'Timestamp' => gmdate ( 'Y-m-d\TH:i:s\Z' ),
                          'Action' => 'SendSms',
                          'TemplateCode' => $this->templateCode,
                          'PhoneNumbers' => $mobile,
                          //'TemplateParam' => '{"code":"' . $verify_code . '"}' 
                          'TemplateParam' => '{"time":"1234"}'   //更換爲自己的實際模版
                  );
                  //var_dump($params);die;
                  // 計算簽名并把簽名結果加入請求參數
                  $params ['Signature'] = $this->computeSignature ( $params, $this->accessKeySecret );
                  // 發送請求(此處作了修改)
                  //$url = 'https://sms.aliyuncs.com/?' . http_build_query ( $params );
                  $url = 'http://dysmsapi.aliyuncs.com/?' . http_build_query ( $params );
                  $ch = curl_init ();
                  curl_setopt ( $ch, CURLOPT_URL, $url );
                  curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
                  curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
                  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
                  curl_setopt ( $ch, CURLOPT_TIMEOUT, 10 );
                  $result = curl_exec ( $ch );
                  curl_close ( $ch );
                  $result = json_decode ( $result, true );
                  //var_dump($result);die;
                  if (isset ( $result ['Code'] )) {
                      $this->error = $this->getErrorMessage ( $result ['Code'] );
                      return false;
                  }
                  return true;
              }
              /**
               * 獲取詳細錯誤信息
               *
               * @param unknown $status            
               */
              public function getErrorMessage($status) {
                  // 阿裏雲的短信 亂八七糟的(其實是用的阿裏大于)
                  // https://api.alidayu.com/doc2/apiDetail?spm=a3142.7629140.1.19.SmdYoA&apiId=25450
                  $message = array (
                          'InvalidDayuStatus.Malformed' => '賬戶短信開通狀态不正确',
                          'InvalidSignName.Malformed' => '短信簽名不正确或簽名狀态不正确',
                          'InvalidTemplateCode.MalFormed' => '短信模闆Code不正确或者模闆狀态不正确',
                          'InvalidRecNum.Malformed' => '目标手機号不正确,單次發送數量不能超過100',
                          'InvalidParamString.MalFormed' => '短信模闆中變量不是json格式',
                          'InvalidParamStringTemplate.Malformed' => '短信模闆中變量與模闆内容不匹配',
                          'InvalidSendSms' => '觸發業務流控',
                          'InvalidDayu.Malformed' => '變量不能是url,可以将變量固化在模闆中'
                  );
                  if (isset ( $message [$status] )) {
                      return $message [$status];
                  }
                  return $status;
              }
          }

          調用方法:

          //生成驗證碼
          $mobile = 'xxxxxxx';
          $code = rand ( 1000, 9999 );
          //發送短信
          $sms = new Sms();
          //測試模式
          $status = $sms->send_verify($mobile, $code);
          if (!$status) {
            echo $sms->error;
          }

          上一篇:你還在用原生的支付API嗎?

          下一篇:php的鈎子(hook),你有沒有用過?


          評論