动力商城-05 阿里云短信服务

news2025/1/19 20:21:50

1.添加依赖

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.24</version>
        </dependency>

2.控制层

@Api(tags = "短信业务接口管理")
@RequestMapping("p/sms")
@RestController
public class SendController {

    @Autowired
    private SendService sendService;


    /**
     * 获取短信验证码
     * @param map 手机号码
     * @return
     */
    @ApiOperation("获取短信验证码")
    @PostMapping("send")
    public Result<String> sendPhoneMsg(@RequestBody Map<String,Object> map) {
        sendService.sendPhoneMsg(map);
        return Result.success("短信发送成功");
    }

    /**
     * 绑定手机号码
     * @param map 手机号码phonenum,短信验证码code
     * @return
     */

//    p/sms/savePhone
    @ApiOperation("绑定手机号码")
    @PostMapping("savePhone")
    public Result<String> saveMsgPhone(@RequestBody Map<String,Object> map) {
        Boolean saved = sendService.saveMsgPhone(map);
        return Result.handle(saved);
    }
}

3.接口

public interface SendService {

    /**
     * 获取短信验证码
     * @param map
     */
    void sendPhoneMsg(Map<String, Object> map);

    /**
     * 绑定手机号码
     * @param map
     * @return
     */
    Boolean saveMsgPhone(Map<String, Object> map);
}

  1. 接口实现
@Service
public class SendServiceImpl implements SendService {
    @Autowired
    private AliyunDxConfig aliyunDxConfig;

    @Autowired
    private MemberMapper memberMapper;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Override
    public void sendPhoneMsg(Map<String, Object> map) {
        // 准备配置对象
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(aliyunDxConfig.getAccessKeyID())
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(aliyunDxConfig.getAccessKeySecret());
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = aliyunDxConfig.getEndpoint();
        try {
            // 创建客户端对象
            com.aliyun.dysmsapi20170525.Client client = new com.aliyun.dysmsapi20170525.Client(config);
            // 获取手机号码
            String phonenum = (String) map.get("phonenum");
            // 生成一个随机数字
            String randomNumber = RandomUtil.randomNumbers(4);
            // 将生成的随机数字存放到redis中
            stringRedisTemplate.opsForValue().set(MemberConstants.MSG_PHONE_PREFIX+phonenum, randomNumber, Duration.ofMinutes(30));
            // 创建模版参数
            String templateParam = "{\"code\":\""+randomNumber+"\"}";
            // 创建请求参数对象
            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
                    .setPhoneNumbers(phonenum)
                    .setSignName(aliyunDxConfig.getSignName())
                    .setTemplateCode(aliyunDxConfig.getTemplateCode())
                    .setTemplateParam(templateParam);
            // 发送请求
            client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Boolean saveMsgPhone(Map<String, Object> map) {
        // 获取会员输入的短信验证码
        String code = (String) map.get("code");
        // 获取会员手机号码
        String phonenum = (String) map.get("phonenum");
        // 从redis中获取当前手机号码对应验证码
        String redisCode = stringRedisTemplate.opsForValue().get(MemberConstants.MSG_PHONE_PREFIX + phonenum);
        // 判断验证码是否正确
        if (!code.equals(redisCode)) {
            throw new BusinessException("请输入正确的短信验证码");
        }
        // 将会员手机号码更新到会员信息中
        Member member = new Member();
        member.setUserMobile(phonenum);
        // 获取当前会员的openId
        String openId = AuthUtils.getMemberOpenId();
        return memberMapper.update(member,new LambdaUpdateWrapper<Member>()
                .eq(Member::getOpenId,openId)
        )>0;
    }
}

5.配置类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "aliyun.dx")
@RefreshScope
public class AliyunDxConfig {
    /**
     * 阿里云平台访问API接口accessKeyID
     */
    private String accessKeyID;
    /**
     * 阿里云平台访问API接口accessKeySecret
     */
    private String accessKeySecret;
    /**
     * 短信签名
     */
    private String signName;
    /**
     * 短信模版CODE
     */
    private String templateCode;

    /**
     * API访问端点
     */
    private String endpoint;
}

测试成功
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析 HTML Input 元素:构建交互性表单的核心

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HAMR技术进入云存储市场!

2024年12月3日&#xff0c;Seagate宣布其Mozaic 3系列HAMR&#xff08;热辅助磁记录&#xff09;硬盘获得了来自一家领先云服务提供商&#xff08;可能AWS、Azure或Google Cloud其中之一&#xff09;以及其他高容量硬盘客户的资格认证。 Seagate的Mozaic 3技术通过引入热辅助磁…

图数据库 | 12、图数据库架构设计——高性能计算架构

在传统类型的数据库架构设计中&#xff0c;通常不会单独介绍计算架构&#xff0c;一切都围绕存储引擎展开&#xff0c;毕竟存储架构是基础&#xff0c;尤其是在传统的基于磁盘存储的数据库架构设计中。 类似地&#xff0c;在图数据库架构设计中&#xff0c;项目就围绕存储的方…

【工具变量】地级市城市全社会用电量数据(2006-2021年)

一、数据范围&#xff1a;覆盖中国300多个地级市 二、包含指标&#xff1a; 省份、地级市、年份、全社会用电量。 三、数据来源&#xff1a;国家电网查询数据。对于极大部分城市&#xff0c;国网售电量就是全社会用电量(往年的售电量和全社会用电量数据相同&#xff09;,此外…

请求响应:常见参数接收及封装(数组集合参数及日期参数)

数组参数 在前端页面的表单中&#xff0c;存在复选框元素&#xff0c;当提交表单到后端的时候&#xff0c;会将复选框中的全部内容提交到后端进行处理&#xff0c;由于复选框中往往存在很多数据&#xff0c;并且同复选框中数据名称相同&#xff0c;这样的请求参数叫做数组参数…

兔子的寿命有多长?

在宠物的世界里&#xff0c;兔子以其灵动的身姿、柔软的皮毛和温顺的性格深受人们喜爱。然而&#xff0c;当我们满心欢喜地将兔子迎进家门时&#xff0c;可曾想过它们能陪伴我们多久&#xff1f;兔子的寿命&#xff0c;是一个值得深入探讨的话题&#xff0c;它不仅关乎生命的时…

本地多卡(3090)部署通义千问Qwen-72B大模型提速实践:从龟速到够用

最近在做文本风格转化&#xff0c;涉及千万token级别的文本。想用大模型转写&#xff0c;在线的模型一来涉及数据隐私&#xff0c;二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限&#xff0c;正好实验室给俺配了4卡3090的机子&#xff0c;反正也就是做个推理&#…

鸿蒙开发——键值型数据库的基本使用与跨设备同步

1、简 述 ❓ 什么是键值型数据库 键值型数据库&#xff08;KV-Store&#xff09;是一种非关系型数据库&#xff0c;其数据以“键值”对的形式进行组织、索引和存储&#xff0c;其中“键”作为唯一标识符。 键值型数据库适合很少数据关系和业务关系的业务数据存储。 另外&#…

STM32一keil5更换芯片后报错问题的解决。

目录 一、STM32型号认识二、报错问题三、常用的启动配置文件四、问题解决 一、STM32型号认识 二、报错问题 当我们在原来工程下修改芯片时&#xff0c;原本可以编译通过的代码突然很多报错。如下所示&#xff0c;这是因为我们的启动文件配置错误。对于不同型号的芯片其flash容量…

CentOS安装Nginx并配置为系统服务

前言 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 [13]&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;公开版本1.19.6发布…

部署loki,grafana 以及springcloud用法举例

文章目录 场景docker 部署grafanadocker-compose部署loki维护配置文件 local-config.yaml维护docker-compose.yml配置启动 grafana 添加loki数据源springcloud用法举例查看loki的explore,查看日志 场景 小公司缺少运维岗位&#xff0c;需要研发自己部署日志系统&#xff0c;elk…

快速学习selenium基础操作

全篇大概19000字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间1h 什么是Selenium&#xff1f; Selenium是一系列自动化工具集的统称&#xff0c;官方工具有 Selenium IDE、Selenium WebDriver、Selenium Grid&#xff0c; 主要用于桌面端Web应用程序的自动化。能够通…

使用uniapp开发小程序场景:在百度地图上调用接口返回的设备相关信息并展示

首先在百度地图开发者平台注册微信小程序开发密钥下载百度地图SDK-bmap-wx.min.js,下载地址在项目入口index.html页面进行引入页面中进行调用&#xff0c;代码示例如下<map id"map" longitude"108.95" latitude"34.34" scale"3" :m…

SPI驱动模型框架及spidev.c分析---学习记录

目录 SPI设备如何使用 SPI驱动模型框架 SPI 控制器/SPI Master分析 SPI 设备端/SPI Slave分析 SPI 控制器/SPI Master与SPI 设备端/SPI Slave驱动模型 Linux内核自带的SPI 设备端/SPI Slave代码spidev.c 小结 SPI设备如何使用 一般我们使用spi设备驱动是类似文件操作&#xff0…

WordPress XStore Elementor 前端与编辑器内容不同步的问题

最近在新站更换成XStore的Elementor模板后&#xff0c;在编辑器修改完的内容前端网页部分没有同步&#xff0c;一开始清除了缓存没有解决。后面尝试重新安装也还是存在这个问题。 后续又在服务器上删除了Elementor插件缓存文件&#xff0c;问题依然存在。 最后通过在Elemento…

第四届全国过程模拟与仿真大会召开,积鼎科技相伴大会6年成长

第四届全国过程模拟与仿真学术会议于2024年11月29日-12月2日在广州圆满召开。积鼎科技&#xff0c;作为自主流体仿真软件研发的领航企业&#xff0c;与大会相伴四年&#xff0c;自首届以来一直积极参与其中&#xff0c;见证了大会从初创到逐渐壮大的全过程。每一次参会&#xf…

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果

Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署

文章目录 前言一、Zookeeper单机部署&#xff08;手动部署&#xff09;1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…

文件IO——01

1. 认识文件 1&#xff09;文件概念 “文件”是一个广义的概念&#xff0c;可以代表很多东西 操作系统里&#xff0c;会把很多的硬件设备和软件资源抽象成“文件”&#xff0c;统一管理 但是大部分情况下的文件&#xff0c;都是指硬盘的文件&#xff08;文件相当于是对“硬…

Spring完整知识点二

Spring注解开发 Spring是轻代码而重配置的框架&#xff0c;配置比较繁重&#xff0c;影响开发效率&#xff0c;所以注解开发是一种趋势&#xff0c;它能够代替xml配置文件&#xff0c;可以简化配置&#xff0c;提高开发效率Spring注解根据出现时间分类 Spring原始注解&#xf…