当前位置: 首页 > backend >正文

阿里云短信接入实现示例

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.xdnf.cn/news/3335.html

相关文章:

  • IsaacLab最新2025教程(7)-创建Interactive Scene
  • Socket-UDP
  • Day.js一个2k轻量级的时间日期处理库
  • Modbus转PROFIBUS网关:电动机保护新突破!
  • [CPCTF 2025] Crypto
  • YOLOv11改进:视觉变换器SwinTransformer目标检测网络
  • C 语言链表详解
  • 第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析
  • 测试 用例篇
  • 指令级并行(ILP)和线程级并行(TLP)的区别,GCC -O3优化会展开循环吗?
  • Git 忽略文件配置 .gitignore
  • AI对IT行业的重塑:挑战与机遇并存的技术革命
  • URP - 序列图动画的实现
  • 多数元素题解(LC:169)
  • 扩展根分区
  • 软件产品测试报告:如何全面评估及保障软件质量?
  • kubernetes》》k8s》》Service 、Ingress 区别
  • C 语 言 - - - 动 态 内 存 分 配
  • SIwave基本操作之S参数仿真
  • 5. 进程地址空间
  • react中封装一个预览.doc和.docx文件的组件
  • Vue3 + TypeScript 实现 PC 端鼠标横向拖动滚动
  • 【蓝桥杯】第十六届蓝桥杯C/C++大学B组个人反思总结
  • 高性能架构设计-数据库(读写分离)
  • OpenHarmony - 小型系统内核(LiteOS-A)(十七)标准库
  • 加速LLM大模型推理,KV缓存技术详解与PyTorch实现
  • java: 警告: 源发行版 21 需要目标发行版 21
  • PostgreSQL的COALESCE 函数用法
  • 慧星云支持 Qwen3:开启智算新生态,共筑高效 AI 未来
  • WebGL图形编程实战【5】:层次构建 × Shader初始化深度剖析