PHP開發實用-阿里短信服務(Short Message Service)

步驟 1 使用阿里雲短信服務正常發短信須要

  • 短信簽名
  • 短信模板
  1. 1申請短信簽名
      根據用戶屬性來建立符合自身屬性的簽名信息。企業用戶須要上傳相關企業資質證實,我的用戶須要上傳證實我的身份的證實。
      短信簽名須要審覈經過後纔可使用。
    申請短信簽名
    1.2 申請短信模板
      短信模板,即具體發送的短信內容。短信模板能夠支持驗證碼、短信通知、推廣短信、國際/港澳臺消息四種模式。驗證碼和短信通知,經過變量替換實現個性短信定製。推廣短信不支持在模板中添加變量。
      短信模板須要審覈經過後纔可使用。
    申請短信模板

步驟 2 獲取阿里雲訪問密鑰

調用短信API還須要兩個參數:php

  • Access Key ID
  • Access Key Secret

  能夠經過阿里雲控制檯的 祕鑰管理頁面 建立、管理全部的訪問祕鑰對,且保證它處於「啓用」狀態。因爲訪問祕鑰是阿里雲對 API 請求進行安全驗證的關鍵因子,請妥善保管你的訪問祕鑰。若是某些祕鑰對出現泄漏風險,建議及時刪除該祕鑰對並生成新的替代祕鑰對。laravel

獲取Access Key ID

步驟 3 將阿里雲短信整合進Laravel進行開發

阿里雲開發包
  下載阿里雲提供的SDK開發並將api_sdk/lib/Core和api_sdk/lib/Api複製一份放到項目app/Tools/dysms下,沒有的話須要本身建立。
整合進Laravel
打開項目根目錄下的composer.json文件,在classmap,加上圖示代碼
添加自動加載
打開命令行工具在項目根目錄輸入:git

composer dumpautoload

執行成功以下圖
自動加載成功
接下來就是正式的開發了,直接使用sdk裏面導入包的方式進行引入:
引入
第一次postman測試運行報錯以下:
運行報錯
這是由於EndpointerProvider裏面,沒有setEndpoints就直接使用了getEndpointers,因此返回爲空信息,setEndpoints操做是在EndpointConf中調用的,加載xml中的endpoints,在調用代碼中加入github

// 手動加載endpoint
EndpointConfig::load();

再次運行代碼發現報以下錯誤:
代理報錯
這是由於代理的緣由,註釋一下代碼就能夠了:
註釋curl代理shell

開發完整代碼,github源碼地址json

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;

use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
use Aliyun\Core\Regions\EndpointConfig;

class Dysms extends Controller
{
    static $acsClient = null;

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

        //可選-啓用https協議
        //$request->setProtocol("https");

        // 必填,設置短信接收號碼
        $request->setPhoneNumbers(Input::get('phone'));

        // 必填,設置簽名名稱,應嚴格按"簽名名稱"填寫,請參考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
        $request->setSignName("簽名");

        // 必填,設置模板CODE,應嚴格按"模板CODE"填寫, 請參考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
        $request->setTemplateCode("模版CODE");

        // 可選,設置模板參數, 假如模板中存在變量須要替換則爲必填項
        $request->setTemplateParam(json_encode(array(
            // 短信模板中字段的值
            "code" => rand(000000, 999999),
            "product" => "dsd"
        ), JSON_UNESCAPED_UNICODE));

        // 可選,設置流水號
        $request->setOutId("1234567");

        // 選填,上行短信擴展碼(擴展碼字段控制在7位或如下,無特殊需求用戶請忽略此字段)
//        $request->setSmsUpExtendCode("1234567");
        // 發起訪問請求
        $acsResponse = static::getAcsClient()->getAcsResponse($request);
//打印執行結果
        dd($acsResponse);
// 執行成功後的返回狀態
//        {#1538
//            +"Message": "OK"
//            +"RequestId": "0CE56BFE-5E9A-4F3F-8AEC-5C524720CE83"
//            +"BizId": "480519725607521112^0"
//            +"Code": "OK"
//        }
    }

    /**
     * 取得AcsClient
     *
     * @return DefaultAcsClient
     */
    public static function getAcsClient()
    {
        //產品名稱:雲通訊流量服務API產品,開發者無需替換
        $product = "Dysmsapi";
        //產品域名,開發者無需替換
        $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);
            // 手動加載endpoint
            EndpointConfig::load();
            // 增長服務結點
            DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);
            // 初始化AcsClient用於發起請求
            static::$acsClient = new DefaultAcsClient($profile);
        }
        return static::$acsClient;
    }
}

PS:最後不得不吐槽下,阿里用OSS和阿里短信好多坑啊,這麼大的一個公司。api

相關文章
相關標籤/搜索