阿里云短信接入实现示例

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.mzph.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…