laravel框架使用阿里短信接入


EG: accessKeyid和accessKeySecret還有模板ID、簽名名稱這幾項必要參數自己去阿里雲獲取

一、下載SDK和demo

 

 下載並解壓后

 

 

 在laravel框架的app目錄下創建libs/Aliyun目錄並將上面兩個文件夾復制進去,如果按照此方法則不需要改命名空間,如果你放在別的地方就根據你的路徑修改一下命名空間

在根目錄的composer.json里添加如下配置:

 
        

 

然后在cmd中進入根目錄然后進行
composer dumpautoload

執行后若出現如下圖所示,則表示更新成功

 

 

 二、代碼部分

1、首先引入文件並載入短信平台節點

use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
use Aliyun\Api\Sms\Request\V20170525\QuerySendDetailsRequest;

Config::load();

2、發送代碼

public function send(Request $request)
    {
        $phone = $request['phone'];//接收的手機號
        //print_r($phone);die;
        $code = rand(100000,999999);//隨機生成的6位驗證碼
        session('code',$code);//將隨機數寫入session
        session('mphone',$phone);//寫入獲取的手機號
        session('codetime',time());//寫入當前時間
        $response = SmsController::sendSms(
            "你的簽名",//signName
            "你的短信模板code",//templateCode
            $phone,//手機號
            Array(  // 短信模板中字段的值
                "code"=>$code,
            )
        );
        $row = [];
        if ($response->Code == 'OK')
        {
            $row = ['status'=>1,'code'=>$code];
        }
        else
        {
            $row = ['status'=>0,'code'=>$response->Code,'message'=>$response->Message];
        }
        return json_encode($row);
    }
    
    static $acsClient = null;
    
    /**
     * 取得AcsClient
     *
     * @return DefaultAcsClient
     */
    public static function getAcsClient() {
        //產品名稱:雲通信流量服務API產品,開發者無需替換
        $product = "深呼吸app";

        //產品域名,開發者無需替換
        $domain = "dysmsapi.aliyuncs.com";

        // TODO 此處需要替換成開發者自己的AK (https://ak-console.aliyun.com/)
        $accessKeyId = "你自己的AccessKeyId"; // AccessKeyId

        $accessKeySecret = "你自己的AccessKeySecret"; // AccessKeySecret

        // 暫時不支持多Region
        $region = "cn-hangzhou";

        // 服務結點
        $endPointName = "cn-hangzhou";


        if(static::$acsClient == null)
        {
            //初始化acsClient,暫不支持region化
            $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);

            EndpointConfig::load();
            DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);
            // 增加服務結點
            // 初始化AcsClient用於發起請求
            static::$acsClient = new DefaultAcsClient($profile);
        }
        return static::$acsClient;
    }

    /**
     * 發送短信
     *
     * @param string $signName <p>
     * 必填, 短信簽名,應嚴格"簽名名稱"填寫,參考:<a href="https://dysms.console.aliyun.com/dysms.htm#/sign">短信簽名頁</a>
     * </p>
     * @param string $templateCode <p>
     * 必填, 短信模板Code,應嚴格按"模板CODE"填寫, 參考:<a href="https://dysms.console.aliyun.com/dysms.htm#/template">短信模板頁</a>
     * (e.g. SMS_0001)
     * </p>
     * @param string $phoneNumbers 必填, 短信接收號碼 (e.g. 12345678901)
     * @param array|null $templateParam <p>
     * 選填, 假如模板中存在變量需要替換則為必填項 (e.g. Array("code"=>"12345", "product"=>"阿里通信"))
     * </p>
     * @param string|null $outId [optional] 選填, 發送短信流水號 (e.g. 1234)
     * @param string|null $smsUpExtendCode [optional] 選填,上行短信擴展碼(擴展碼字段控制在7位或以下,無特殊需求用戶請忽略此字段)
     * @return stdClass
     */
    public static function sendSms($signName, $templateCode, $phoneNumbers, $templateParam = null, $outId = null, $smsUpExtendCode = null) {

        // 初始化SendSmsRequest實例用於設置發送短信的參數
        $request = new SendSmsRequest();

        // 必填,設置雉短信接收號碼
        $request->setPhoneNumbers($phoneNumbers);

        // 必填,設置簽名名稱
        $request->setSignName($signName);

        // 必填,設置模板CODE
        $request->setTemplateCode($templateCode);

        // 可選,設置模板參數
        if($templateParam) {
           $request->setTemplateParam(json_encode($templateParam));
        }
        // 可選,設置流水號
        if($outId) {
            $request->setOutId($outId);
        }
        // 選填,上行短信擴展碼
        if($smsUpExtendCode) {
            $request->setSmsUpExtendCode($smsUpExtendCode);
        }
        // 發起訪問請求
        $acsResponse = static::getAcsClient()->getAcsResponse($request);
        // 打印請求結果
        // var_dump($acsResponse);
        return $acsResponse;
    }

有的人會出現:

發現問題在 app/libs/Aliyun/Core/DefaultAcsClient.doActionImpl(),是程序主動拋出的錯誤。

官方注釋說 $domain是產品域名,開發者無需替換。but。。。。沒替換,報個什么錯啊。

既然不需要,就直接在/DefaultAcsClient.doActionImpl()把$domain 寫死

然后測試接口會返回結果:

 

 這樣就發送成功了

 
        
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM