Эх сурвалжийг харах

【Add】新增阿里云发送短信通知功能

liuxiangxin 4 сар өмнө
parent
commit
be89efdaf6

+ 27 - 0
app/Facades/Servers/Aliyun/Sms.php

@@ -0,0 +1,27 @@
+<?php namespace App\Facades\Servers\Aliyun;
+
+use Illuminate\Support\Facades\Facade;
+
+/**
+ * 短信发送
+ * 
+ * @method static array sendSms(string $phone,array $param,string $signName,string $templateCode) 发送短信
+ * 
+ * @see \App\Servers\Aliyun\Sms
+ * 
+ * 
+ */
+class Sms extends Facade
+{
+    /**
+     * Get the registered name of the component.
+     *
+     * @return string
+     */
+    protected static function getFacadeAccessor()
+    {
+        return '\App\Servers\Aliyun\Sms';
+    }
+}
+
+?>

+ 1 - 1
app/Facades/Servers/Encrypts/ApiSign.php

@@ -5,7 +5,7 @@ use Illuminate\Support\Facades\Facade;
 /**
  * 接口签名
  * 
- * @staticmethod array encode( array $contents ,string $appid, string $appkey)  加密
+ * @method static array encode( array $contents ,string $appid, string $appkey)  加密
  * 
  * @see \App\Servers\Encrypts\ApiSign
  * 

+ 34 - 0
app/Servers/Aliyun/Client.php

@@ -0,0 +1,34 @@
+<?php namespace App\Servers\Aliyun;
+
+
+use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
+use Darabonba\OpenApi\Models\Config;
+
+/**
+ * 阿里
+ *
+ * @author    刘相欣
+ */
+class Client{
+
+    /**
+     * 使用AK&SK初始化账号Client
+     * @return Dysmsapi Client
+     */
+    public static function createClient(){
+        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html。
+        $config = new Config([
+            // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+            "accessKeyId" => config('aliyun.accessKeyId',''),
+            // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+            "accessKeySecret" => config('aliyun.accessKeySecret',''),
+        ]);
+        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
+        $config->endpoint = "dysmsapi.aliyuncs.com";
+        // 返回结果
+        return              new Dysmsapi($config);
+    }
+
+}
+

+ 58 - 0
app/Servers/Aliyun/Sms.php

@@ -0,0 +1,58 @@
+<?php namespace App\Servers\Aliyun;
+
+
+use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
+use AlibabaCloud\Tea\Exception\TeaError;
+use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
+use AlibabaCloud\Tea\Utils\Utils;
+use App\Facades\Servers\Logs\Log;
+
+/**
+ * 验证码模型
+ *
+ * @author    刘相欣
+ */
+class Sms extends Client{
+
+
+    /**
+     * 发送短信
+     * @param string $phone 手机号。国际/港澳台消息需加国际区号。支持向不同的手机号码发送短信,手机号码之间以半角逗号(,)分隔。上限为 1000 个手机号码。批量发送相对于单条发送,及时性稍有延迟。验证码类型的短信,建议单条发送。
+     * @param array  $param 模板参数。短信模板变量对应的实际值。支持传入多个参数, json格式,如 {"name":"张三","number":"1390000****"}
+     * @param string $signName 签名名称。
+     * @param string $templateCode 模板ID。
+     * 
+     */
+    public function sendSms(string $phone,array $param,string $signName,string $templateCode){
+        try {
+            // 变量参数转成json字符串
+            $param          = $param ? json_encode($param,JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE) : '';
+            // 创建请求
+            $sendSmsRequest = new SendSmsRequest(['phoneNumbers' => $phone,'signName' => $signName,'templateCode' => $templateCode,'templateParam' => $param]);
+            // 创建终端
+            $client         = $this->createClient();
+            // 复制代码运行请自行打印 API 的返回值
+            $response       = $client->sendSmsWithOptions($sendSmsRequest, new RuntimeOptions([]))->toMap();
+            // 获取参数 
+            $result         = $response['body'];
+            // 如果失败的话
+            if( $result['Code'] != 'OK' )   return ['code'=>$result['Code'],'error'=>$result['Message'],'request_id'=>$result['RequestId']];
+            dd($result);
+            // 返回成功信息
+            return          ['code'=>$result['Code'],'message'=>$result['Message'],'requestId'=>$result['RequestId'],'bizId'=>$result['BizId']];
+        }catch (\Exception $error) {
+            // 返回错误信息
+            if ( !($error instanceof TeaError) ) {
+                $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
+            }
+            // 错误信息
+            $errorMsg          = Utils::assertAsString($error->message);
+            // 日志记录
+            Log::error('aliyun_sms',$errorMsg);
+            // 返回错误信息
+            return          ['error'=>$errorMsg];
+        }
+    }
+
+}
+

+ 6 - 0
config/aliyun.php

@@ -0,0 +1,6 @@
+<?php
+
+return [
+    'accessKeyId'       => 'LTAI5tDwjfteBvivYN41r8sJ', 
+    'accessKeySecret'   => 'yowuOGi2nYYnrqGpO3qcz94C4brcPp'
+];