阿里云短信接入實現示例

1)構建Springboot項目

2)? 添加依賴

<!--阿里云短信-->
<dependency><groupId>com.aliyun</groupId><artifactId>alibabacloud-dysmsapi20170525</artifactId><version>3.0.0</version>
</dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-idaas-doraemon</artifactId><version>1.3.2</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><optional>true</optional><version>[4.4.9,5.0.0)</version>
</dependency>

3) 配置文件

aliyun:sms:accessKey: V***********yaccessSecret: e***********************zregionId: cn-******endPoint: dysm***.al*****.c**

4)配置類

@Component
@Slf4j
public class AliyunConstant implements InitializingBean {@Value("${aliyun.sms.accessKey}")public String accessKey;@Value("${aliyun.sms.accessSecret}")public String accessSecret;@Value("${aliyun.sms.regionId}")public String regionId;@Value("${aliyun.sms.endPoint}")public String endPoint;public static String ACCESS_KEY;public static String ACCESS_SECRET;public static String REGION_ID;public static String END_POINT;@Overridepublic void afterPropertiesSet(){ACCESS_KEY = accessKey;ACCESS_SECRET = accessSecret;REGION_ID = regionId;END_POINT = endPoint;}/** 為了解決base64加密 密鑰太長報錯問題*/static {try {Class<?> clazz = Class.forName("javax.crypto.JceSecurity");Field nameField = clazz.getDeclaredField("isRestricted");Field modifiersField = Field.class.getDeclaredField("modifiers");modifiersField.setAccessible(true);modifiersField.setInt(nameField, nameField.getModifiers() & ~Modifier.FINAL);nameField.setAccessible(true);nameField.set(null, Boolean.FALSE);} catch (Exception e) {log.error(e.getMessage(),e);}}
}

5) 單例客戶端 調用頻繁可以使用資源池構建

public class AsyncClientSingleton {private static final StaticCredentialProvider PROVIDER = StaticCredentialProvider.create(Credential.builder().accessKeyId(AliyunConstant.ACCESS_KEY).accessKeySecret(AliyunConstant.ACCESS_SECRET).build());private static final AsyncClient CLIENT = AsyncClient.builder().credentialsProvider(PROVIDER).region(AliyunConstant.REGION_ID).overrideConfiguration(ClientOverrideConfiguration.create().setEndpointOverride(AliyunConstant.END_POINT)).build();private AsyncClientSingleton() {}public static AsyncClient getInstance() {return CLIENT;}  
}

6)短信類型枚舉

@AllArgsConstructor
@Getter
public enum MsgTempEnum {COOPERATE_INTENTION(10, "標識碼驗證成功","COOPERATE_INTENTION"),EDUCATION_TRAINING(11, "訂閱成功","EDUCATION_TRAINING")}

7) 短信工具類

@Slf4j
@Component
public class SendMsg {@Resourceprivate IMessageService messageService;private static IMessageService messageServiceInstance;@PostConstructpublic void initInstance() {messageServiceInstance = messageService;}public static SendSmsResponseBody sendSms(MsgTempEnum msgTempEnum, String phoneNumbers, Map<String, String> paramsMap) {return sendSms(msgTempEnum, Collections.singletonList(phoneNumbers), paramsMap);}public static SendSmsResponseBody sendSms(MsgTempEnum msgTempEnum, List<String> numbers, Map<String, String> paramsMap) {String code = msgTempEnum.getCode();MsgTemp msgTemp = InitBaseData.msgTempMap.get(code);String phoneNumbers = StringUtils.join(numbers, ",");SendSmsRequest sendSmsRequest = SendSmsRequest.builder().phoneNumbers(phoneNumbers).templateCode(msgTemp.getTemplateCode()).templateParam(JSONUtil.toJsonStr(paramsMap)).signName(CommonConstant.SIGN_NAME).build();try {CompletableFuture<SendSmsResponse> response = AsyncClientSingleton.getInstance().sendSms(sendSmsRequest);SendSmsResponse sendSmsResponse = response.get();if (sendSmsResponse == null) {return null;}SendSmsResponseBody respBody = sendSmsResponse.getBody();for (String number : numbers) {Message message = new Message();message.setMessageType("SMS");message.setMessageCategory(code);message.setMessageContent(MessageFormat.format(msgTemp.getTemplateDesc(), new ArrayList<>(paramsMap.values()).toArray()));message.setTitle(msgTemp.getName());message.setReceiver(number);if (respBody != null) {message.setCallMessage("SmsResult{" + "bizId='" + respBody.getBizId() + ", code='" + respBody.getCode() +", message='" + respBody.getMessage() + ", requestId='" + respBody.getRequestId() + '}');message.setStatus("OK".equals(respBody.getCode()) ? 1 : 0);}messageServiceInstance.save(message);}return sendSmsResponse.getStatusCode() != 200 ? null : respBody;} catch (Exception e) {log.error(e.getMessage(), e);}return null;}}

8) 調用示例

LinkedHashMap可以保證入參順序一致,方便后臺記錄短信發送日志。

public void sendNoticeMsg(String receiver, String name, String tel, MsgTempEnum msgTempEnum){Map<String,String> map = new LinkedHashMap<>();map.put("name",name);map.put("tel",tel);sendNoticeMsg(receiver,map,msgTempEnum);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81180.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

邏輯回歸之參數選擇:從理論到實踐

一、邏輯回歸概述 邏輯回歸雖然名字中帶有“回歸”&#xff0c;但它是一種用于處理二分類或多分類問題的算法。其核心思想是通過構建一個線性模型&#xff0c;將輸入特征進行線性組合&#xff0c;再利用邏輯函數&#xff08;如Sigmoid函數&#xff09;將線性組合的結果映射到0…

綜合案例建模(1)

文章目錄 滾花手扭螺絲機箱封蓋螺絲螺絲孔錐形墊片 滾花手扭螺絲 前視基準面畫草圖&#xff0c;旋轉生成主體 倒角0.5 頂面&#xff0c;草圖轉換實體引用&#xff0c;去復制邊線 生成螺旋線路徑 頂面繪制草圖 上一步畫的草圖沿螺旋線掃描切除 鏡像掃描特征 陣列鏡像掃描特征 創…

SQL語句練習 自學SQL網 多表查詢

目錄 Day 6 用JOINs進行多表聯合查詢 Day 7 外連接 OUTER JOINs Day 8 外連接 特殊關鍵字 NULLs Day 6 用JOINs進行多表聯合查詢 SELECT * FROM Boxoffice INNER JOIN movies ON movies.idboxoffice.Movie_id;SELECT * FROM Boxoffice INNER JOIN moviesON movies.idboxoffi…

游戲引擎學習第247天:簡化DEBUG_VALUE

歡迎。關于紋理傳輸的詳細情況。 上周我們剛剛完成了紋理下載的相關工作&#xff0c;但實際上并沒有完全解決這個問題。問題的核心是&#xff0c;當前關于紋理下載的正確方式仍然存在較大的不確定性。盡管我們在進行紋理下載的工作時已有一定進展&#xff0c;但依舊有不少模糊…

python將字符串轉成二進制數組

python將字符串轉成二進制數組 功能概述&#xff1a; save_binary_to_json() 函數&#xff1a;將字符串轉換為二進制數據&#xff08;字節的整數表示&#xff09;&#xff0c;并保存到JSON文件中。 load_binary_from_json() 函數&#xff1a;從JSON文件中讀取二進制數據并還原…

【springboot知識】配置方式實現SpringCloudGateway相關功能

配置方式實現SpringCloudGateway相關功能 Spring Cloud Gateway 核心功能與實戰實現指南一、核心功能架構二、六大核心功能實現1. 動態路由配置2. 斷言(Predicate)配置3. 過濾器(Filter)配置4. 負載均衡配置5. 熔斷降級配置6. 限流配置 三、高級配置技巧1. 跨域配置2. 重試機制…

Windows 10 環境二進制方式安裝 MySQL 8.0.41

文章目錄 初始化數據庫配置文件注冊成服務啟停服務鏈接服務器登錄之后重置密碼卸載 初始化數據庫 D:\MySQL\MySQL8.0.41\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin\mysqld -I --console --basedirD:\MySQL\MySQL8.0.41\mysql-8.0.41-winx64\mysql-8.0.41-winx64 --datadi…

流式通信技術對比:SSE vs WebSocket 應用場景與最佳實踐

在構建動態、實時交互的現代 Web 應用時&#xff0c;實時通信能力至關重要。Server-Sent Events&#xff08;SSE&#xff09; 和 WebSocket 是當前最主流的兩種技術方案&#xff0c;它們都支持服務器主動向客戶端推送數據&#xff0c;但在通信模式、應用場景和實現復雜度上存在…

復雜度和順序表(雙指針方法)

目錄 目錄 目錄 前言&#xff1a; 一、時間復雜度和空間復雜度 1.1概念 1.2規則 二、順序表 2.1靜態順序表 2.2動態順序表 三、雙指針法 四、總結 前言&#xff1a; 時間復雜度和空間復雜度是用于判斷算法好壞的指標&#xff0c;程序性能的核心指標。時間復雜度主要衡…

flutter 專題 六十四 在原生項目中集成Flutter

概述 使用Flutter從零開始開發App是一件輕松愜意的事情&#xff0c;但對于一些成熟的產品來說&#xff0c;完全摒棄原有App的歷史沉淀&#xff0c;全面轉向Flutter是不現實的。因此使用Flutter去統一Android、iOS技術棧&#xff0c;把它作為已有原生App的擴展能力&#xff0c;…

Java高階程序員學習計劃(詳細到天,需有一定Java基礎)

??致敬讀者 ??感謝閱讀??笑口常開??生日快樂?早點睡覺??博主相關 ??博主信息??博客首頁??專欄推薦??活動信息文章目錄 Java高階程序員學習計劃(詳細到天,需有一定Java基礎)第一階段(30天)Java基礎:Java生態工具鏈:設計模式與編碼規范:第二階段(15天…

JS自動化獲取網站信息開發說明

一、自動獲取信息的必要性 1. 提高效率與節省時間 批量處理&#xff1a;自動化可以快速抓取大量數據&#xff0c;比人工手動操作快得多。 24/7 運行&#xff1a;自動化工具可以全天候工作&#xff0c;不受時間限制。 減少重復勞動&#xff1a;避免人工反復執行相同的任務&am…

Android Kotlin 依賴注入全解:Koin appModule 配置與多 ViewModel 數據共享實戰指南

一、基礎配置與概念 1. 什么是 appModule appModule 是 Koin 依賴注入框架中的核心配置模塊&#xff0c;用于集中管理應用中的所有依賴項。它本質上是一個 Koin 模塊&#xff08;org.koin.core.module.Module&#xff09;&#xff0c;通過 DSL 方式聲明各種組件的創建方式和依…

學習記錄:DAY21

我的開發日志&#xff1a;類路徑掃描、DI 容器與動態代理 前言 我失憶了&#xff0c;完全不記得自己早上干了什么。 日程 早上 10 點左右開始&#xff0c;學了一早上&#xff0c;主要是類路徑掃描相關的調試。 晚上 8 點了&#xff0c;真不能再摸&#x1f41f;了。 學習記錄 計…

【Agent】MCP協議 | 用高德MCP Server制作旅游攻略

note MCP (Model Context Protocol) 代表了 AI 與外部工具和數據交互的標準建立。MCP 的本質&#xff1a;它是一個統一的協議標準&#xff0c;使 AI 模型能夠以一致的方式連接各種數據源和工具&#xff0c;類似于 AI 世界的"USB-C"接口。 它能夠在 LLM/AI Agent 與外…

使用 Spring Data Redis 實現 Redis 數據存儲詳解

使用 Spring Data Redis 實現 Redis 數據存儲詳解 Spring Data Redis 是 Spring 生態中操作 Redis 的核心模塊&#xff0c;它封裝了 Redis 客戶端的底層細節&#xff08;如 Jedis 或 Lettuce&#xff09;&#xff0c;提供了統一的 API 來操作 Redis 的數據結構。以下是詳細實現…

Qt5與現代OpenGL學習(四)X軸方向旋轉60度

把上面兩張圖像放到D盤1文件夾內&#xff1a; shader.h #ifndef SHADER_H #define SHADER_H#include <QDebug> #include <QOpenGLShader> #include <QOpenGLShaderProgram> #include <QString>class Shader { public:Shader(const QString& verte…

【Machine Learning Q and AI 讀書筆記】- 02 自監督學習

Machine Learning Q and AI 中文譯名 大模型技術30講&#xff0c;主要總結了大模型相關的技術要點&#xff0c;結合學術和工程化&#xff0c;對LLM從業者來說&#xff0c;是一份非常好的學習實踐技術地圖. 本文是Machine Learning Q and AI 讀書筆記的第2篇&#xff0c;對應原…

using var connection = connectionFactory.CreateConnection(); using var 是什么意思

在 .NET 中&#xff0c;??垃圾回收&#xff08;Garbage Collection, GC&#xff09;?? 確實是自動管理內存的機制&#xff0c;但它 ??僅適用于托管資源&#xff08;Managed Resources&#xff09;??&#xff08;如類實例、數組等&#xff09;。然而&#xff0c;對于 ?…

Multicore-TSNE

文章目錄 TSNE使用scikit-learn庫使用Multicore-TSNE庫安裝方法基本使用方法采用不同的距離度量 其他資料 TSNE t-Distributed Stochastic Neighbor Embedding (t-SNE) 是一種高維數據的降維方法&#xff0c;由Laurens van der Maaten和Geoffrey Hinton于2008年提出&#xff0…