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


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

  • 短信簽名
  • 短信模板
  1. 1申請短信簽名
      根據用戶屬性來創建符合自身屬性的簽名信息。企業用戶需要上傳相關企業資質證明,個人用戶需要上傳證明個人身份的證明。
      短信簽名需要審核通過后才可以使用。
    申請短信簽名
    1.2 申請短信模板
      短信模板,即具體發送的短信內容。短信模板可以支持驗證碼、短信通知、推廣短信、國際/港澳台消息四種模式。驗證碼和短信通知,通過變量替換實現個性短信定制。推廣短信不支持在模板中添加變量。
      短信模板需要審核通過后才可以使用。
    申請短信模板

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

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

  • Access Key ID
  • Access Key Secret

  可以通過阿里雲控制台的 秘鑰管理頁面 創建、管理所有的訪問秘鑰對,且保證它處於“啟用”狀態。由於訪問秘鑰是阿里雲對 API 請求進行安全驗證的關鍵因子,請妥善保管你的訪問秘鑰。如果某些秘鑰對出現泄漏風險,建議及時刪除該秘鑰對並生成新的替代秘鑰對。

獲取Access Key ID

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

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

composer dumpautoload  

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

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

再次運行代碼發現報如下錯誤:
代理報錯
這是因為代理的原因,注釋一下代碼就可以了:
注釋curl代理

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

<?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和阿里短信好多坑啊,這么大的一個公司。


免責聲明!

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



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