天天看點

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

阿裡雲開通短信服務

位址

要申請兩個東西

  • 短信簽名
  • 短信模闆
  • 申請短信簽名
    laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務
    申請完,稽核時間一般兩個小時以内,挺快的。

稽核狀态變為通過,即為稽核成功。

申請短信模闆

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

裡面的 ${code} 在之後調用api的時候是需要傳進去的。

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

模闆裡的code也是調用api的時候要使用到的。

建立使用者

調用短信服務的api,還需要兩個參數

  • AccessKeyId
  • AccessKeySecret

    是以還需要去通路控制裡建立一個使用者,并配置設定 AliyunDysmsFullAccess 管理短信服務(SMS)的權限

    laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

    建立好的時候記得儲存 AccessKeySecret,之後就沒機會再檢視了。

    整合到Laravel架構

    手動整合

    ??? SDK及DEMO下載下傳

Laravel整合的時候 也碰到各種各樣的問題。

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

把下載下傳的包裡面的 api_sdk/lib/Core 和 api_sdk/lib/Api複制一份放到項目 app/libs/Aliyun 下,沒有 libs 檔案夾就建立。

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

然後打開項目根目錄下的 composer.json 檔案,找到下面的位置 classmap,加上圖示代碼

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

然後終端(Terminal)進入項目根目錄,執行

composer dumpautoload
           

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

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

然後就可以直接使用sdk裡面導入包的方式了。

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

真正做的時候也不是這樣一帆風順的,官方的sdk和demo本身也有些問題。

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

Invalid argument supplied for foreach()

直接把Demo複制過來,就會出現這樣的問題

查了很多地方,發現是少了一句demo裡少了一行代碼

在 SmsController.getAcsClient() 裡補上(原來是沒的)

EndpointConfig::load();
           
laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

Can not find endpoint to access.

天真的以為問題都解決了,結果馬上出來另外一個問題。

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

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

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

回去看看這個 $domain 是什麼,結果官方注釋說 $domain是産品域名,開發者無需替換。我都沒替換,你報個什麼錯啊。

laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

算了,既然不需要,那就直接這裡吧 $domain 寫死好了。

$domain = 'dysmsapi.aliyuncs.com';
           
laravel5接入阿裡雲短信驗證碼服務阿裡雲開通短信服務

具體實作

我就把 smsDemo 裡的幾個方法都移到 SmsController 裡了,

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

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;
use Aliyun\Core\Regions\EndpointConfig;

class SmsController extends Controller{

    // 可供調用的發送驗證碼api
    public function send(Request $request){
        header('Content-Type: text/plain; charset=utf-8');
        $phone = $request->input('phone');
        $code = $this::randomKeys(); // 随機生成6位數字驗證碼
        $response = SmsController::sendSms(
            "富春江app", // 短信簽名
            "SMS_111785732", // 短信模闆編号
            $phone, // 短信接收者
            Array(  // 短信模闆中字段的值
              "code"=>$this::randomKeys(),
            ),
            "123456"   // 流水号,選填
        );
        $row = [];
        if($response->Code=='OK'){
            $row = ['status'=>1,'code'=>$code];
        }else{
            $row = ['status'=>0,'code'=>$response->Code,'message'=>$response->Message];
        }        
        $row = ['status'=>1,'code'=>$code];
        return json_encode($row);
    }

    
    // 随機生成6位數字驗證碼
    public function randomKeys($length = 6){
        $key='';
        $pattern='1234567890';
        for($i=0;$i<$length;++$i){
            $key .= $pattern{mt_rand(0,9)};    // 生成php随機數
        }
        return $key;
    }

    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 = "LTAIp5j2DxU47O42"; // AccessKeyId

        $accessKeySecret = "EY9OdjeinAnEOeDyFNZb2OiT3Xg4ep"; // 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" target="_blank" rel="external nofollow" >短信簽名頁</a>
     * </p>
     * @param string $templateCode <p>
     * 必填, 短信模闆Code,應嚴格按"模闆CODE"填寫, 參考:<a href="https://dysms.console.aliyun.com/dysms.htm#/template" target="_blank" rel="external nofollow" >短信模闆頁</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