1. 程式人生 > >PHP開發實用-阿裏短信服務(Short Message Service)

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

-s pre AR 多region client fff end onf ()

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

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

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

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

  • Access Key ID
  • Access Key Secret

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

技術分享圖片

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

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

composer dumpautoload  

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

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

再次運行代碼發現報如下錯誤:
技術分享圖片
這是因為代理的原因,註釋一下代碼就可以了:
技術分享圖片

開發完整代碼,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和阿裏短信好多坑啊,這麽大的一個公司。

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