liujie
2026-04-03 84ddc2238887435626240d58e3c5938da6f9de2d
update
2个文件已添加
2个文件已修改
278 ■■■■■ 已修改文件
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/utils/ALiSendSms.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/utils/HWSendSms.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/utils/Sample.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.Gson;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.RedisConstants;
import com.ruoyi.common.core.exception.GlobalException;
@@ -11,6 +12,7 @@
import com.ruoyi.study.dto.AppUserQuery;
import com.ruoyi.study.mapper.TUserMapper;
import com.ruoyi.study.service.ITUserService;
import com.ruoyi.study.utils.ALiSendSms;
import com.ruoyi.study.utils.HWSendSms;
import com.ruoyi.study.vo.AppUserVO;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,6 +22,7 @@
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -62,7 +65,7 @@
        if (!matcher.matches()) {
            throw new GlobalException("手机号不合法!");
        }
        hwSendSms.sendSms(phoneCode, phone);
        // 判断redis中是否存在手机验证码
        Object phoneCodeRedis = redisTemplate.opsForValue().get(RedisConstants.PHONE_CODE + phone);
        if (phoneCodeRedis == null) {
@@ -78,6 +81,13 @@
                phoneCode = String.valueOf(phoneCodeRedis).split(":")[0];
            }
        }
        ALiSendSms sendSmsDemo = new ALiSendSms();
        try {
            // 使用刚创建的短信模板发送短信
            sendSmsDemo.sendSms(phone, "SMS_333505709", "{\"code\":\""+phoneCode+"\"}");
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*
         * 保存信息到redis
         * key为 --> phone_code:手机号码 (phone_code表示该业务为 验证码登录)
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/utils/ALiSendSms.java
New file
@@ -0,0 +1,127 @@
package com.ruoyi.study.utils;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
 * 阿里云短信工具类
 */
@Component
public class ALiSendSms {
    // 设置鉴权参数,初始化客户端
    private DefaultProfile profile = DefaultProfile.getProfile(
            "cn-shanghai",// 地域ID
            "LTAI5tMxrqxDk43YUJtWbpHC",// 您的AccessKey ID
            "b0Dg0LeFXT4XDYVoAab24Nuoc1JX1y");// 您的AccessKey Secret
    private IAcsClient client = new DefaultAcsClient(profile);
    private static void log_print(String functionName, Object result) {
        Gson gson = new Gson();
        System.out.println("-------------------------------" + functionName + "-------------------------------");
        System.out.println(gson.toJson(result));
    }
    /**
     * 添加短信模板
     */
    public String addSmsTemplate() throws ClientException {
        CommonRequest addSmsTemplateRequest = new CommonRequest();
        addSmsTemplateRequest.setSysDomain("dysmsapi.aliyuncs.com");
        addSmsTemplateRequest.setSysAction("AddSmsTemplate");
        addSmsTemplateRequest.setSysVersion("2017-05-25");
        // 短信类型。0:验证码;1:短信通知;2:推广短信;3:国际/港澳台消息
        addSmsTemplateRequest.putQueryParameter("TemplateType", "0");
        // 模板名称,长度为1~30个字符
        addSmsTemplateRequest.putQueryParameter("TemplateName", "测试短信模板");
        // 模板内容,长度为1~500个字符
        addSmsTemplateRequest.putQueryParameter("TemplateContent", "您正在申请手机注册,验证码为:${code},5分钟内有效!");
        // 短信模板申请说明
        addSmsTemplateRequest.putQueryParameter("Remark", "测试");
        CommonResponse addSmsTemplateResponse = client.getCommonResponse(addSmsTemplateRequest);
        String data = addSmsTemplateResponse.getData();
        // 消除返回文本中的反转义字符
        String sData = data.replaceAll("'\'", "");
        log_print("addSmsTemplate", sData);
        Gson gson = new Gson();
        // 将字符串转换为Map类型,取TemplateCode字段值
        Map map = gson.fromJson(sData, Map.class);
        Object templateCode = map.get("TemplateCode");
        return templateCode.toString();
    }
    /**
     * 发送短信
     */
    public String sendSms(String phone, String templateCode, String json) throws ClientException {
        CommonRequest request = new CommonRequest();
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        // 接收短信的手机号码
        request.putQueryParameter("PhoneNumbers", phone);
        // 短信签名名称。请在控制台签名管理页面签名名称一列查看(必须是已添加、并通过审核的短信签名)。
        request.putQueryParameter("SignName", "海南众慧智能教育");
        // 短信模板ID
        request.putQueryParameter("TemplateCode", templateCode);
        // 短信模板变量对应的实际值,JSON格式。
        request.putQueryParameter("TemplateParam", json);
        CommonResponse commonResponse = client.getCommonResponse(request);
        String data = commonResponse.getData();
        String sData = data.replaceAll("'\'", "");
        log_print("sendSms", sData);
        return sData;
    }
    /**
     * 查询发送详情
     */
    private void querySendDetails(String bizId) throws ClientException {
        CommonRequest request = new CommonRequest();
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("QuerySendDetails");
        // 接收短信的手机号码
        request.putQueryParameter("PhoneNumber", "156xxxxxxxx");
        // 短信发送日期,支持查询最近30天的记录。格式为yyyyMMdd,例如20191010。
        request.putQueryParameter("SendDate", "20191010");
        // 分页记录数量
        request.putQueryParameter("PageSize", "10");
        // 分页当前页码
        request.putQueryParameter("CurrentPage", "1");
        // 发送回执ID,即发送流水号。
        request.putQueryParameter("BizId", bizId);
        CommonResponse response = client.getCommonResponse(request);
        log_print("querySendDetails", response.getData());
    }
    public static void main(String[] args) {
        ALiSendSms sendSmsDemo = new ALiSendSms();
        try {
            // 创建短信模板
//            String templateCode = sendSmsDemo.addSmsTemplate();
            String code = "8888";
            // 使用刚创建的短信模板发送短信
            String sData = sendSmsDemo.sendSms("17828262728", "SMS_333505709", "{\"code\":\""+code+"\"}");
            Gson gson = new Gson();
            Map map = gson.fromJson(sData, Map.class);
            String bizId = map.get("BizId").toString();
            // 根据短信发送流水号查询短信发送情况
            sendSmsDemo.querySendDetails(bizId);
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/utils/HWSendSms.java
@@ -1,7 +1,7 @@
package com.ruoyi.study.utils;
import com.cloud.apigateway.sdk.utils.Client;
import com.cloud.apigateway.sdk.utils.Request;
//import com.cloud.apigateway.sdk.utils.Client;
//import com.cloud.apigateway.sdk.utils.Request;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
@@ -85,39 +85,39 @@
            return;
        }
        Request request = new Request();
        request.setKey(appKey);
        request.setSecret(appSecret);
        request.setMethod("POST");
        request.setUrl(url);
        request.addHeader("Content-Type", "application/x-www-form-urlencoded");
        request.setBody(body);
        LOGGER.info("Print the body: {}", body);
        try {
            HttpRequestBase signedRequest = Client.sign(request, Constant.SIGNATURE_ALGORITHM_SDK_HMAC_SHA256);
            LOGGER.info("Print the authorization: {}", Arrays.toString(signedRequest.getHeaders("Authorization")));
            Header[] requestAllHeaders = signedRequest.getAllHeaders();
            for (Header h : requestAllHeaders) {
                LOGGER.info("req Header with name: {} and value: {}", h.getName(), h.getValue());
            }
            HttpResponse response = client.execute(signedRequest);
            LOGGER.info("Print the status line of the response: {}", response.getStatusLine().toString());
            Header[] resHeaders = response.getAllHeaders();
            for (Header h : resHeaders) {
                LOGGER.info("Processing Header with name: {} and value: {}", h.getName(), h.getValue());
            }
            HttpEntity resEntity = response.getEntity();
            if (resEntity != null) {
                LOGGER.info("Processing Body with name: {} and value: {}",
                        System.getProperty("line.separator"),
                    EntityUtils.toString(resEntity, "UTF-8"));
            }
        } catch (Exception e) {
            LOGGER.info(e.getMessage(), e);
            e.printStackTrace();
        }
//        Request request = new Request();
//        request.setKey(appKey);
//        request.setSecret(appSecret);
//        request.setMethod("POST");
//        request.setUrl(url);
//        request.addHeader("Content-Type", "application/x-www-form-urlencoded");
//        request.setBody(body);
//        LOGGER.info("Print the body: {}", body);
//        try {
//            HttpRequestBase signedRequest = Client.sign(request, Constant.SIGNATURE_ALGORITHM_SDK_HMAC_SHA256);
//            LOGGER.info("Print the authorization: {}", Arrays.toString(signedRequest.getHeaders("Authorization")));
//            Header[] requestAllHeaders = signedRequest.getAllHeaders();
//            for (Header h : requestAllHeaders) {
//                LOGGER.info("req Header with name: {} and value: {}", h.getName(), h.getValue());
//            }
//
//            HttpResponse response = client.execute(signedRequest);
//
//            LOGGER.info("Print the status line of the response: {}", response.getStatusLine().toString());
//            Header[] resHeaders = response.getAllHeaders();
//            for (Header h : resHeaders) {
//                LOGGER.info("Processing Header with name: {} and value: {}", h.getName(), h.getValue());
//            }
//            HttpEntity resEntity = response.getEntity();
//            if (resEntity != null) {
//                LOGGER.info("Processing Body with name: {} and value: {}",
//                        System.getProperty("line.separator"),
//                    EntityUtils.toString(resEntity, "UTF-8"));
//            }
//        } catch (Exception e) {
//            LOGGER.info(e.getMessage(), e);
//            e.printStackTrace();
//        }
    }
    public CloseableHttpClient createIgnoreSSLHttpClient() throws Exception {
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/utils/Sample.java
New file
@@ -0,0 +1,69 @@
//package com.ruoyi.study.utils;
//
//
//public class Sample {
//
//    /**
//     * <b>description</b> :
//     * <p>使用凭据初始化账号Client</p>
//     * @return Client
//     *
//     * @throws Exception
//     */
//    public static com.aliyun.teaopenapi.Client createClient() throws Exception {
//        // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378657.html。
//        com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client();
//        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
//                .setCredential(credential);
//        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
//        config.endpoint = "dysmsapi.aliyuncs.com";
//        return new com.aliyun.teaopenapi.Client(config);
//    }
//
//    /**
//     * <b>description</b> :
//     * <p>API 相关</p>
//     *
//     * @param path string Path parameters
//     * @return OpenApi.Params
//     */
//    public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
//        com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
//                // 接口名称
//                .setAction("SendSms")
//                // 接口版本
//                .setVersion("2017-05-25")
//                // 接口协议
//                .setProtocol("HTTPS")
//                // 接口 HTTP 方法
//                .setMethod("POST")
//                .setAuthType("AK")
//                .setStyle("RPC")
//                // 接口 PATH
//                .setPathname("/")
//                // 接口请求体内容格式
//                .setReqBodyType("json")
//                // 接口响应体内容格式
//                .setBodyType("json");
//        return params;
//    }
//
//    public static void main(String[] args_) throws Exception {
//
//        com.aliyun.teaopenapi.Client client = Sample.createClient();
//        com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
//        // query params
//        java.util.Map<String, Object> queries = new java.util.HashMap<>();
//        queries.put("PhoneNumbers", "17828262728");
//        queries.put("SignName", "海南众慧智能教育");
//        queries.put("TemplateCode", "SMS_333505709");
//        queries.put("TemplateParam", "{\"code\":\"1234\"}");
//        // runtime options
//        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//        com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest()
//                .setQuery(com.aliyun.openapiutil.Client.query(queries));
//        // 返回值实际为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。
//        Object resp = client.callApi(params, request, runtime);
//        System.out.println(new com.google.gson.Gson().toJson(resp));
//    }
//}