千家信息网

SpringBoot怎么实现短信发送

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇"SpringBoot怎么实现短信发送"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这
千家信息网最后更新 2025年11月08日SpringBoot怎么实现短信发送

这篇"SpringBoot怎么实现短信发送"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"SpringBoot怎么实现短信发送"文章吧。

application.properties:

server.port=8002#server.servlet.context-path=/spring.datasource.url=jdbc:mysql://localhost:3306/ssm_message?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaispring.datasource.username=rootspring.datasource.password=19961117Lhhspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#开启驼峰命名mybatis.configuration.map-underscore-to-camel-case=true#设置超时时间-可自行调整sms.default.connect.timeout=sun.net.client.defaultConnectTimeoutsms.default.read.timeout=sun.net.client.defaultReadTimeoutsms.timeout=10000#初始化ascClient需要的几个参数#短信API产品名称(短信产品名固定,无需修改)sms.product=Dysmsapi#短信API产品域名(接口地址固定,无需修改)sms.domain=dysmsapi.aliyuncs.com#替换成你的AK (产品密)#你的accessKeyId,填你自己的 上文配置所得  自行配置sms.access.key.id=xxxx#你的accessKeyId,填你自己的 上文配置所得  自行配置sms.access.key.secret=xxxx#阿里云配置你自己的短信模板填入sms.template.code=SMS_238470888

messageController

package com.example.demo.controller;import com.alibaba.fastjson.JSON;import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;import com.example.demo.service.MessageService;import com.example.demo.utils.MessageUtils;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;import java.util.Map;@Api(description = "短信接口")@RequestMapping("/smsLogin")@RestControllerpublic class MessageController {    @Autowired    public MessageService messageService;    @Autowired    public MessageUtils messageUtils;    @ApiOperation(value = "获取短信验证码接口", notes = "获取短信验证码接口")    @GetMapping("/sendMessage")    public Map getSMSMessage(String phone) {        Map map = new HashMap<>();        if (phone == null || phone == "") {            map.put("code", "FAIL");            map.put("msg", "手机号为空");            return map;        }        Map smsMap = messageUtils.getPhoneMsg(phone);        if("OK".equals(smsMap.get("status"))){            Map data = messageService.selectSMSDataByPhone(phone);            map.put("phone", phone);            map.put("smsCode", smsMap.get("msg"));            // 将验证码存入数据库  也可以考虑用redis等方式 这里就用数据库做例子            if (data != null) {                messageService.updateSMSDataByPhone(map);            } else {                messageService.insert(map);            }            smsMap.put("msg", "成功");        }        return smsMap;    }    @ApiOperation(value = "短信校验登录接口", notes = "短信校验登录接口")    @GetMapping("/login")    public Map login(String phone, String smsCode) {        Map map = new HashMap<>();        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(smsCode)) {            map.put("code", "FAIL");            map.put("msg", "请检查数据");            return map;        }        // 取出对应的验证码进行比较即可        Map smsMap = messageService.selectSMSDataByPhone(phone);        if (smsMap == null) {            map.put("code", "FAIL");            map.put("msg", "该手机号未发送验证码");            return map;        }        String code = (String) smsMap.get("sms_code");        if (!smsCode.equals(code)) {            map.put("code", "FAIL");            map.put("msg", "验证码不正确");            return map;        }        map.put("code", "OK");        map.put("msg", "success");        return map;    }}

MessageUtils

package com.example.demo.utils;import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.IAcsClient;import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;import com.aliyuncs.exceptions.ClientException;import com.aliyuncs.http.MethodType;import com.aliyuncs.profile.DefaultProfile;import com.aliyuncs.profile.IClientProfile;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Component;import org.springframework.web.client.RestTemplate;import java.util.HashMap;import java.util.Map;@Componentpublic class MessageUtils {    @Autowired    RestTemplate restTemplate;    @Value("${sms.default.connect.timeout}")    private String DEFAULT_CONNECT_TIMEOUT;    @Value("${sms.default.read.timeout}")    private String DEFAULT_READ_TIMEOUT;    @Value("${sms.timeout}")    private String SMS_TIMEOUT;    @Value("${sms.product}")    private String SMS_PRODUCT;    @Value("${sms.domain}")    private String SMS_DOMAIN;    @Value("${sms.access.key.id}")    private String SMS_ACCESSKEYID;    @Value("${sms.access.key.secret}")    private String SMS_ACCESSKEYSECRET;    @Value("${sms.template.code}")    private String TEMPLATE_CODE;    private static String code;//code对应你短信目标里面的参数    public Map getPhoneMsg(String phone) {        if (phone == null || phone == "") {            System.out.println("手机号为空");            return null;        }        // 设置超时时间-可自行调整        System.setProperty(DEFAULT_CONNECT_TIMEOUT, SMS_TIMEOUT);        System.setProperty(DEFAULT_READ_TIMEOUT, SMS_TIMEOUT);        // 初始化ascClient需要的几个参数        final String product = SMS_PRODUCT;        final String domain = SMS_DOMAIN;        // 替换成你的AK        final String accessKeyId = SMS_ACCESSKEYID;        final String accessKeySecret = SMS_ACCESSKEYSECRET;        // 初始化ascClient,暂时不支持多region        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",                accessKeyId, accessKeySecret);        Map map = new HashMap();        try {            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product,                    domain);            //获取验证码            code = vcode();            IAcsClient acsClient = new DefaultAcsClient(profile);            // 组装请求对象            SendSmsRequest request = new SendSmsRequest();            // 使用post提交            request.setMethod(MethodType.POST);            // 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式            request.setPhoneNumbers(phone);            // 必填:短信签名-可在短信控制台中找到            request.setSignName("java学习");            // 必填:短信模板-可在短信控制台中找到            request.setTemplateCode(TEMPLATE_CODE);            // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为$[code]"时,此处的值为            // 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败            request.setTemplateParam("{ \"code\":\"" + code + "\"}");            // 可选-上行短信扩展码(无特殊需求用户请忽略此字段)            // request.setSmsUpExtendCode("90997");            // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者            request.setOutId("yourOutId");            // 请求失败这里会抛ClientException异常            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);            map.put("status", sendSmsResponse.getCode());            if (sendSmsResponse.getCode() != null                    && sendSmsResponse.getCode().equals("OK")) {                // 请求成功                map.put("msg", code);            } else {                //如果验证码出错,会输出错误码告诉你具体原因                map.put("msg", sendSmsResponse.getMessage());            }        } catch (Exception e) {            e.printStackTrace();            map.put("status", "FAIL");            map.put("msg", "获取短信验证码失败");        }        return map;    }    /**     * 生成6位随机数验证码     *     * @return     */    public static String vcode() {        String vcode = "";        for (int i = 0; i < 6; i++) {            vcode = vcode + (int) (Math.random() * 9);        }        return vcode;    }}

以上就是关于"SpringBoot怎么实现短信发送"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

短信 验证 内容 接口 手机 配置 产品 手机号 模板 短信发送 参数 数据 成功 上文 可在 字段 所得 换行符 控制台 数据库 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 安卓中数据库查询案例 南通企业网络安全准入控制 指导和管理网络安全工作的委员会 数据库中数据库设计的任务 网络安全的证书 有哪些 苏州企业软件开发价格咨询 服务器的2个g的安全包 nextcloud数据库 学习网络技术的心得体会 小米 无法连接到服务器 网络安全公共法 开一个北凉游戏服务器要多少钱 上海好麦网络技术有限公司 网络安全防范思想 查询邮件服务器地址记录 数据库满足原则 网络安全与计算机安全 哈利波特手游服务器能退吗 电子信息类与网络安全有关么 网络安全工作检查报告 青县服务器属于天津市吗 党员干部网络安全承诺书 管家婆搬移工具数据库不存在 为什么最近要加强网络安全 网络安全法经过几次审议 市南区安卓软件开发推荐 盐城软件开发外包 重庆的腾讯云服务器在哪 oracle数据库表命令 net连接数据库的步骤教程
0