阿裡雲開通短信服務
位址
要申請兩個東西
- 短信簽名
- 短信模闆
- 申請短信簽名 申請完,稽核時間一般兩個小時以内,挺快的。
稽核狀态變為通過,即為稽核成功。
申請短信模闆
裡面的 ${code} 在之後調用api的時候是需要傳進去的。
模闆裡的code也是調用api的時候要使用到的。
建立使用者
調用短信服務的api,還需要兩個參數
- AccessKeyId
-
AccessKeySecret
是以還需要去通路控制裡建立一個使用者,并配置設定 AliyunDysmsFullAccess 管理短信服務(SMS)的權限
建立好的時候記得儲存 AccessKeySecret,之後就沒機會再檢視了。
整合到Laravel架構
手動整合
??? SDK及DEMO下載下傳
Laravel整合的時候 也碰到各種各樣的問題。
把下載下傳的包裡面的 api_sdk/lib/Core 和 api_sdk/lib/Api複制一份放到項目 app/libs/Aliyun 下,沒有 libs 檔案夾就建立。
然後打開項目根目錄下的 composer.json 檔案,找到下面的位置 classmap,加上圖示代碼
然後終端(Terminal)進入項目根目錄,執行
composer dumpautoload
執行後若出現如下圖所示,則表示更新成功
然後就可以直接使用sdk裡面導入包的方式了。
真正做的時候也不是這樣一帆風順的,官方的sdk和demo本身也有些問題。
Invalid argument supplied for foreach()
直接把Demo複制過來,就會出現這樣的問題
查了很多地方,發現是少了一句demo裡少了一行代碼
在 SmsController.getAcsClient() 裡補上(原來是沒的)
EndpointConfig::load();
Can not find endpoint to access.
天真的以為問題都解決了,結果馬上出來另外一個問題。
找來源發現問題在這裡 app/libs/Aliyun/Core/DefaultAcsClient.doActionImpl(),是程式主動抛出的錯誤。
回去看看這個 $domain 是什麼,結果官方注釋說 $domain是産品域名,開發者無需替換。我都沒替換,你報個什麼錯啊。
算了,既然不需要,那就直接這裡吧 $domain 寫死好了。
$domain = 'dysmsapi.aliyuncs.com';
具體實作
我就把 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