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

java实现发送短信

1.将必要的配置写yml

sms:enabled: trueurl: //代理地址ap-id: secret-key: jbjgbm: sign: template: xxx,您的验证码是:{code},有效期2分钟。

2.创建配置类,获取yml的配置信息

@Data
@Configuration
@ConfigurationProperties("sms")
public class SmsConfig {private boolean enabled;private String url;private String apId;private String secretKey;private String jbjgbm;private String sign;private String template;
}

3.使用工具类,搭建发送短信的请求

@Slf4j
@Service
public class SmsUtil {private static final String SMS_LIMIT_KEY_PREFIX = "sms:send:limit:";private static final Integer SMS_SEND_LIMIT = 5;private static final Integer SMS_SEND_SUCCESS = 1;private static final Integer SMS_SEND_FAILED = -1;private static final Integer SMS_SEND_OUT_LIMIT = -2;@Resourceprivate SmsConfig SmsConfig;public Integer sendMsg(String phoneNum, String smsContent) {if (SmsConfig.isEnabled()) {return postBigDataChannel(phoneNum, smsContent);} else {throw new ServiceException("未配置短信通道");}}public Integer postBigDataChannel(String phoneNum, String smsContent) {String today = LocalDate.now().toString();String key = SMS_LIMIT_KEY_PREFIX + today + 3;log.info("key: {}", key);
//        if (RedisUtils.hasKey(key) && RedisUtils.getAtomicValue(key) >= SMS_SEND_LIMIT) {
//            return SMS_SEND_OUT_LIMIT;
//        }if (!RedisUtils.hasKey(key)) {RedisUtils.setAtomicValue(key, 0);}String dxId = Seq.getId();StringBuffer stringBuffer = new StringBuffer();stringBuffer.append(SmsConfig.getJbjgbm());stringBuffer.append(SmsConfig.getApId());stringBuffer.append(SmsConfig.getSecretKey());stringBuffer.append(dxId);stringBuffer.append("00");stringBuffer.append(phoneNum);stringBuffer.append(smsContent);stringBuffer.append(SmsConfig.getSign());stringBuffer.append("1");//参数校验序列,生成方法:将jbjgbm、apId、secretKey、dxId、dxType、mobiles、content、sign、priority按序拼接(无间隔符),// 通过MD5(32位小写)计算得出值。String mac = DigestUtil.md5Hex(stringBuffer.toString());Map<String, String> postData = new HashMap<>();postData.put("jbjgbm", SmsConfig.getJbjgbm());postData.put("apId", SmsConfig.getApId());postData.put("dxId", dxId);postData.put("dxType", "00");postData.put("mobiles", phoneNum);postData.put("content", smsContent);postData.put("sign", SmsConfig.getSign());postData.put("priority", "1");postData.put("mac", mac);log.info("短信平台地址:{},号码:{},内容:{}", SmsConfig.getUrl(), phoneNum, JSONUtil.toJsonStr(postData));String base64Str = Base64Encoder.encode(JSONUtil.toJsonStr(postData));Map<String, Object> postParam = new HashMap<>();postParam.put("data", base64Str);log.info("短信验证码路径:{}", SmsConfig.getUrl());try {HttpResponse execute = HttpRequest.post(SmsConfig.getUrl()).form(postParam).timeout(10000).execute();if (execute.getStatus() != HttpStatus.HTTP_OK) {log.error("发送短信失败{}", execute.getStatus());return SMS_SEND_FAILED;}} catch (Exception e) {log.error("发送短信失败{}", e.getMessage());return SMS_SEND_FAILED;}RedisUtils.incrAtomicValue(key);return SMS_SEND_SUCCESS;}
}

4.传输手机号与内容直接使用

try {smsUtil.sendMsg(phone, content);log.info("短信发送成功,手机号:{},信息:{}", phone, content);} catch (Exception e) {log.error("短信发送失败:{}", e.getMessage());}

http://www.lryc.cn/news/579125.html

相关文章:

  • QT6 源(147)模型视图架构里的表格窗体 QTableWidget 的范例代码举例,以及其条目 QTableWidgetItem 类型的源代码。
  • 【嵌入式电机控制#6】编码器原理与内部构造
  • HTTP 协议深入理解
  • Django 安装使用教程
  • Day3.常见音频场景
  • 动手学Dify:自定义工具与沙盒
  • 澳鹏重磅发布MediGo医疗大模型数据开发平台 破解医疗AI数据瓶颈
  • 【docker部署】在服务器上使用docker
  • 【深度学习-Day 34】CNN实战:从零构建CIFAR-10图像分类器(PyTorch)
  • CISSP知识点汇总-安全与风险管理
  • 智能学号抽取系统 V3.7.5 —— 一个基于 Vue.js 的交互式网页应用
  • 小架构step系列02:搭建工程
  • 智能检测原理和架构
  • STM32WB55VGY6TR 蓝牙OTA升级
  • ZED相机与Foxglove集成:加速机器人视觉调试效率的实用方案
  • 观测云 × AWS SSO:权限治理可观测实践
  • 计算机组成笔记:缓存替换算法
  • [202106][凤凰架构][构建可靠的大型分布式系统][周志明][著]
  • 车载软件架构 -- SOA服务分层设计原则
  • MacOS 安装brew 国内源【超简洁步骤】
  • 线程同步【Linux操作系统】
  • Kafka 运维与调优篇:构建高可用生产环境的实战指南
  • Java学习第六部分——API部分(续)
  • 腾讯云认证考试报名 - TDSQL数据库交付运维专家(TCCE PostgreSQL版)
  • 智慧城市的安全密码:商用密码如何守护万物互联?
  • 运用逆元优化组合计算#数论
  • Django服务开发镜像构建
  • C++主流编辑器特点比较
  • Java 并发编程的 CAS(Compare and Swap)是什么?
  • 讲解“/etc/ssh/sshd_config “的“HostKey /etc/ssh/ssh_host_ed25519_key“ 笔记250702