1. 程式人生 > 其它 >阿里雲傳送簡訊

阿里雲傳送簡訊

1、類檔案

<?php
namespace app\admin\controller;
use think\Cache;

/**
 * 阿里雲簡訊驗證碼傳送類
 * @author Administrator
 *
 */
class Sample {
    // 儲存錯誤資訊
    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' => 'accessKeyId',    // accessKeyId 'accessKeySecret' => 'accessKeySecret',  // accessKeySecret 'signName' => 'signName', 'templateCode' => 'SMS_2553000' // 簡訊模板
); // 配置引數 $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 string $mobile * @param int $verify_code */ public function send_verify($mobile, $name1,$name2,$time1,$time2,$template) { //設定驗證碼快取 // self::setRegSmsCache(['mobile'=>$mobile,'code'=>$verify_code,'times'=>time()]); $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' => $template, 'PhoneNumbers' => $mobile, //'TemplateParam' => '{"code":"' . $verify_code . '"}' 'TemplateParam' => '{"name1":"'.$name1.'","name2":"'.$name2.'","time1":"'.$time1.'","time2":"'.$time2.'"}' //更換為自己的實際模版 );
// 計算簽名並把簽名結果加入請求引數 $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; } /** * 設定手機短息驗證碼快取 * #User: Mikkle * #Email:[email protected] * #Date: * @param $data_cache */ protected function setRegSmsCache($data_cache) { Cache::set('sms_' . $data_cache['mobile'], $data_cache, 300); } /** * 檢測手機簡訊驗證碼 * #User: Mikkle * #Email:[email protected] * #Date: * @param $mobile * @param bool|false $code * @return bool */ public function checkRegSms($mobile, $code = false) { if (!$mobile) return false; if ($code === false) { //判斷60秒以內是否重複傳送 if (!Cache::has('sms_' . $mobile)) return true; if (Cache::get('sms_' . $mobile)['times'] > time()) { return false; } else { return true; } } else { //判斷驗證碼是否輸入正確 if (!Cache::has('sms_' . $mobile)) return false; if (Cache::get('sms_' . $mobile)['code'] == $code) { return true; } else { return false; } } } }

呼叫類檔案發簡訊

use app\admin\controller\Sample;
class Index extends Api
{
    public function sms()
    {
    $mobile = '183*******';
    //$name1,$name2,$time1,$time2  模板所需引數

    $sample = new Sample();
    $sample->send_verify($mobile,$name1,$name2,$time1,$time2,'SMS_2553000');
    }
}