天天看點

laravel架構使用阿裡短信接入

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

一、下載下傳SDK和demo

        
laravel架構使用阿裡短信接入

 下載下傳并解壓後

laravel架構使用阿裡短信接入

 在laravel架構的app目錄下建立libs/Aliyun目錄并将上面兩個檔案夾複制進去,如果按照此方法則不需要改命名空間,如果你放在别的地方就根據你的路徑修改一下命名空間

laravel架構使用阿裡短信接入

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

laravel架構使用阿裡短信接入
然後在cmd中進入根目錄然後進行      
composer dumpautoload      

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

laravel架構使用阿裡短信接入

 二、代碼部分

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;
    }      

有的人會出現:

laravel架構使用阿裡短信接入

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

laravel架構使用阿裡短信接入

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

laravel架構使用阿裡短信接入

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

laravel架構使用阿裡短信接入
然後測試接口會傳回結果:

        
laravel架構使用阿裡短信接入

 這樣就發送成功了