From 6ae372817543fc46f6afa00de44daa557036978b Mon Sep 17 00:00:00 2001
From: xin <1099200748@qq.com>
Date: Wed, 04 Jun 2025 21:41:48 +0800
Subject: [PATCH] 发送短信

---
 oying-system/src/main/resources/config/application-dev.yml                             |    2 
 oying-tools/src/main/java/com/oying/utils/SendMessageUtils.java                        |   58 +++++++--
 oying-common/src/main/java/com/oying/utils/HttpRequest.java                            |   28 +++-
 /dev/null                                                                              |  182 ------------------------------
 oying-tools/src/main/java/com/oying/utils/WinnerLookEnum.java                          |   50 ++++++++
 oying-system/src/main/resources/config/application-prod.yml                            |    2 
 oying-tools/src/main/java/com/oying/utils/WinnerLookProperties.java                    |   20 +++
 oying-system/src/main/java/com/oying/modules/security/rest/VerificationController.java |    7 +
 8 files changed, 142 insertions(+), 207 deletions(-)

diff --git a/oying-common/src/main/java/com/oying/utils/HttpRequest.java b/oying-common/src/main/java/com/oying/utils/HttpRequest.java
index 486223c..215eb3e 100644
--- a/oying-common/src/main/java/com/oying/utils/HttpRequest.java
+++ b/oying-common/src/main/java/com/oying/utils/HttpRequest.java
@@ -14,6 +14,7 @@
 import org.springframework.http.HttpMethod;
 import org.springframework.http.MediaType;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
 import javax.net.ssl.SSLContext;
@@ -22,6 +23,8 @@
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -79,20 +82,33 @@
         return headers;
     }
 
-    private static HttpHeaders get() {
+    private static HttpHeaders getMsg() {
         HttpHeaders headers = new HttpHeaders();
-        headers.set("accept", "*/*");
-        headers.set("connection", "Keep-Alive");
-        headers.set("user-agent",
-                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+        List<MediaType> mediaTypes = new ArrayList<>();
+        mediaTypes.add(MediaType.ALL);
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); // 表单格式
+        headers.setAccept(mediaTypes);
+        headers.setConnection("Keep-Alive");
+        headers.set("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
         return headers;
+    }
+
+    /**
+     * 短信
+     * http返回String xml
+     */
+    public static String exchangeMsg(HttpMethod httpMethod, String url, MultiValueMap<String, String> map) {
+        HttpHeaders headers = getMsg();
+        HttpEntity<Object> httpEntity = new HttpEntity<>(map, headers);
+        RestTemplate restTemplate = new RestTemplate(getFactory());
+        return restTemplate.exchange(url, httpMethod, httpEntity, String.class).getBody();
     }
 
     /**
      * http返回String
      */
     public static String exchangeString(HttpMethod httpMethod, String url, Map<String, Object> map) {
-        HttpHeaders headers = get();
+        HttpHeaders headers = getHeaders();
         HttpEntity<Object> httpEntity = new HttpEntity<>(map, headers);
         RestTemplate restTemplate = new RestTemplate();
         return restTemplate.exchange(url, httpMethod, httpEntity, String.class).getBody();
diff --git a/oying-system/src/main/java/com/oying/modules/security/rest/VerificationController.java b/oying-system/src/main/java/com/oying/modules/security/rest/VerificationController.java
index 20fdd29..612c2b6 100644
--- a/oying-system/src/main/java/com/oying/modules/security/rest/VerificationController.java
+++ b/oying-system/src/main/java/com/oying/modules/security/rest/VerificationController.java
@@ -4,6 +4,8 @@
 import com.oying.annotation.rest.AnonymousGetMapping;
 import com.oying.utils.R;
 import com.oying.utils.RedisUtils;
+import com.oying.utils.SendMessageUtils;
+import com.oying.utils.WinnerLookProperties;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -31,15 +33,18 @@
     private String key;
     @Value("${sms.time}")
     private Long time;
+    private final WinnerLookProperties properties;
 
     @AnonymousGetMapping
     @ApiOperation("短信验证码")
-    public ResponseEntity<Object> toPayAsPc(@RequestParam String phone) {
+    public ResponseEntity<Object> verification(@RequestParam String phone) {
         String uuid = key + IdUtil.simpleUUID();
         System.out.println(phone);
         //创建验证码
         String verification = (int) ((Math.random() * 9 + 1) * 100000) + "";
         redisUtils.set(uuid, verification, time);
+        String message = "您的验证码为:" + verification + ",请勿泄露于他人!";
+        SendMessageUtils.sendMsg(phone, message, properties);
         return ResponseEntity.ok(R.success(uuid));
     }
 }
diff --git a/oying-system/src/main/resources/config/application-dev.yml b/oying-system/src/main/resources/config/application-dev.yml
index 31dbb3f..a23cc5f 100644
--- a/oying-system/src/main/resources/config/application-dev.yml
+++ b/oying-system/src/main/resources/config/application-dev.yml
@@ -178,6 +178,6 @@
   endpoint: https://obs.cn-southwest-2.myhuaweicloud.com
 
 winner-look:
-  url: https://118.178.116.15:8443/
+  url-send-msg: https://118.178.116.15:8443/winnerrxd/api/trigger/SendMsg
   user-code: CQLYSXYJ
   user-pass: lych1205!
diff --git a/oying-system/src/main/resources/config/application-prod.yml b/oying-system/src/main/resources/config/application-prod.yml
index 5346f8f..f2e0fab 100644
--- a/oying-system/src/main/resources/config/application-prod.yml
+++ b/oying-system/src/main/resources/config/application-prod.yml
@@ -188,6 +188,6 @@
   endpoint: https://obs.cn-southwest-2.myhuaweicloud.com
 
 winner-look:
-  url: https://118.178.116.15:8443/
+  url-send-msg: https://118.178.116.15:8443/winnerrxd/api/trigger/SendMsg
   user-code: CQLYSXYJ
   user-pass: lych1205!
diff --git a/oying-tools/src/main/java/com/oying/utils/SendMessageUtils.java b/oying-tools/src/main/java/com/oying/utils/SendMessageUtils.java
index a6ab18b..6fbc7b3 100644
--- a/oying-tools/src/main/java/com/oying/utils/SendMessageUtils.java
+++ b/oying-tools/src/main/java/com/oying/utils/SendMessageUtils.java
@@ -1,35 +1,61 @@
 package com.oying.utils;
 
+import com.oying.exception.BadRequestException;
 import lombok.Data;
-import org.springframework.beans.factory.annotation.Value;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpMethod;
 
 import java.util.HashMap;
+
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.ObjectUtils;
+
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @author xin
  * @description
  * @date 2025/6/4 01:10
  */
+@Slf4j
 @Data
 public class SendMessageUtils {
-    @Value("${winner-look.url}")
-    private String url;
-    @Value("${winner-look.user-code}")
-    private String userCode;
-    @Value("${winner-look.user-pass}")
-    private String userPass;
 
-    public static void main(String[] args)  {
-        String url = "https://118.178.116.15:8443/winnerrxd/api/trigger/SendMsg";
-        Map<String, Object> paramMap = new HashMap<>();
-        paramMap.put("userCode", "CQLYSXYJ");
-        paramMap.put("userPass", "lych1205!");
-        paramMap.put("DesNo", "15213186640");
-        paramMap.put("Msg", "短信内容【立研】");
-        paramMap.put("smsType", "101");
-        System.out.println(HttpRequest.exchangeString(HttpMethod.POST, url, paramMap));
+    public static void sendMsg(String phone, String message, WinnerLookProperties properties) {
+        Map<String, String> params = new HashMap<>();
+        params.put("userCode", properties.getUserCode());
+        params.put("userPass", properties.getUserPass());
+        params.put("DesNo", phone);
+        params.put("Msg", message + "【立研】");
+        params.put("smsType", "101");
+        String str = HttpRequest.exchangeMsg(HttpMethod.POST, properties.getUrlSendMsg(), convert(params));
+        if (ObjectUtils.isEmpty(extractWithRegex(str))) {
+            log.error("短信调用异常 {}", str);
+            throw new BadRequestException("短信调用异常");
+        }
+        int i = Integer.parseInt(str);
+        if (i < 0) {
+            throw new BadRequestException(WinnerLookEnum.find(i));
+        }
     }
 
+    public static String extractWithRegex(String xml) {
+        Pattern pattern = Pattern.compile(
+                "<string[^>]*>([^<]*)</string>"
+        );
+        Matcher matcher = pattern.matcher(xml);
+        return matcher.find() ? matcher.group(1) : null;
+    }
+
+    /**
+     * Map转MultiValueMap
+     */
+    public static <K, V> MultiValueMap<K, V> convert(Map<K, V> map) {
+        MultiValueMap<K, V> multiValueMap = new LinkedMultiValueMap<>();
+        map.forEach(multiValueMap::add);
+        return multiValueMap;
+    }
 }
diff --git a/oying-tools/src/main/java/com/oying/utils/Test.java b/oying-tools/src/main/java/com/oying/utils/Test.java
deleted file mode 100644
index 411771f..0000000
--- a/oying-tools/src/main/java/com/oying/utils/Test.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package com.oying.utils;
-
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.security.cert.CertificateException;
-import java.util.HashMap;
-import java.util.Map;
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-import java.security.cert.X509Certificate;
-
-/**
- * @author xin
- * @description
- * @date 2025/6/4 01:48
- */
-public class Test {
-
-    public static void main(String[] args) {
-        String url = "https://118.178.116.15:8443/winnerrxd/api/trigger/SendMsg ";
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("userCode", "CQLYSXYJ");
-        paramMap.put("userPass", "lych1205!");
-        paramMap.put("DesNo", "15213186640");
-        paramMap.put("Msg", "短信内容【立研】");
-        paramMap.put("smsType","短信类型");
-        try {
-//GET请求
-            httpsGet(url, paramMap);
-//POST请求
-            httpsPost(url, paramMap);
-        } catch (Exception e) {
-            e.printStackTrace();
-            System.err.println("调用https失败:"+e);
-        }
-    }
-    private static class TrustAnyTrustManager implements X509TrustManager {
-
-        public void checkClientTrusted(X509Certificate[] chain, String authType)
-                throws CertificateException {
-        }
-        public void checkServerTrusted(X509Certificate[] chain, String authType)
-                throws CertificateException {
-        }
-        public X509Certificate[] getAcceptedIssuers() {
-            return new X509Certificate[] {};
-        }
-    }
-    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
-        public boolean verify(String hostname, SSLSession session) {
-            return true;
-        }
-    }
-    public static String httpsGet(String url,Map<String, String> params) throws
-            Exception
-    {
-        String result = "";
-        BufferedReader in = null;
-        try {
-
-            String urlStr = url + "?" + getParamStr(params);
-
-            System.out.println("GET请求的URL为:"+urlStr);
-            SSLContext sc = SSLContext.getInstance("SSL");
-            sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },
-                    new java.security.SecureRandom());
-            URL realUrl = new URL(urlStr);
-            // 打开和URL之间的连接
-            HttpsURLConnection connection = (HttpsURLConnection)
-                    realUrl.openConnection();
-            //设置https相关属性
-            connection.setSSLSocketFactory(sc.getSocketFactory());
-            connection.setHostnameVerifier(new TrustAnyHostnameVerifier());
-            connection.setDoOutput(true);
-
-            // 设置通用的请求属性
-            connection.setRequestProperty("accept", "*/*");
-            connection.setRequestProperty("connection", "Keep-Alive");
-            connection.setRequestProperty("user-agent",
-                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
-            // 建立实际的连接
-            connection.connect();
-
-            // 定义 BufferedReader输入流来读取URL的响应
-            in = new BufferedReader(new
-                    InputStreamReader(connection.getInputStream(),"UTF-8"));
-            String line;
-            while ((line = in.readLine()) != null) {
-                result += line;
-            }
-
-            System.out.println("获取的结果为:"+result);
-        } catch (Exception e) {
-            System.out.println("发送GET请求出现异常!" + e);
-            //e.printStackTrace();
-            throw e;
-        }
-        // 使用finally块来关闭输入流
-        finally {
-            try {
-                if (in != null) {
-                    in.close();
-                }
-            } catch (Exception e2) {
-                //e2.printStackTrace();
-                throw e2;
-            }
-        }
-        return result;
-
-    }
-    public static String httpsPost(String url, Map<String, String> params)
-            throws Exception{
-        String result = "";
-        BufferedReader in = null;
-        String content = getParamStr(params);
-        try {
-            System.out.println("POST请求的URL为:"+url);
-            SSLContext sc = SSLContext.getInstance("SSL");
-            sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },
-                    new java.security.SecureRandom());
-            URL console = new URL(url);
-            HttpsURLConnection connection = (HttpsURLConnection)
-                    console.openConnection();
-            connection.setSSLSocketFactory(sc.getSocketFactory());
-            connection.setHostnameVerifier(new TrustAnyHostnameVerifier());
-            connection.setDoOutput(true);
-            connection.connect();
-            DataOutputStream out = new
-                    DataOutputStream(connection.getOutputStream());
-            out.write(content.getBytes("UTF-8"));
-            // 刷新、关闭
-            out.flush();
-            out.close();
-            // 定义 BufferedReader输入流来读取URL的响应
-            in = new BufferedReader(new
-                    InputStreamReader(connection.getInputStream(),"UTF-8"));
-            String line;
-            while ((line = in.readLine()) != null) {
-                result += line;
-            }
-            System.out.println("获取的结果为:"+result);
-        } catch (Exception e) {
-            System.out.println("发送POST请求出现异常!" + e);
-            //e.printStackTrace();
-            throw e;
-        }
-        // 使用finally块来关闭输入流
-        finally {
-            try {
-                if (in != null) {
-                    in.close();
-                }
-            } catch (Exception e2) {
-                //e2.printStackTrace();
-                throw e2;
-            }
-        }
-        return result;
-    }
-
-    private static String getParamStr(Map<String, String> params)
-    {
-        String paramStr="";
-        if(params != null && params.size() >0){
-            // 获取参数列表组成参数字符串
-            for (String key : params.keySet()) {
-                paramStr+=key+"="+params.get(key)+"&";
-            }
-            //去除最后一个"&"
-            paramStr=paramStr.substring(0, paramStr.length()-1);
-        }
-        return paramStr;
-    }
-
-}
diff --git a/oying-tools/src/main/java/com/oying/utils/WinnerLookEnum.java b/oying-tools/src/main/java/com/oying/utils/WinnerLookEnum.java
new file mode 100644
index 0000000..8d8ac90
--- /dev/null
+++ b/oying-tools/src/main/java/com/oying/utils/WinnerLookEnum.java
@@ -0,0 +1,50 @@
+package com.oying.utils;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum WinnerLookEnum {
+    ONE(-1, "应用程序错误"),
+    THREE(-3, "用户名或密码错误"),
+    FOUR(-4, "短信内容和备案的模板不一样"),
+    FIVE(-5, "签名不正确"),
+    SEVEN(-7, "余额不足"),
+    EIGHT(-8, "无可用通道或不在通道时间范围"),
+    NINE(-9, "无效号码"),
+    TEN(-10, "签名内容不符合长度"),
+    ELEVEN(-11, "用户有效期过期"),
+    TWELVE(-12, "黑名单"),
+    SIXTEEN(-16, "接口请求过于频繁,余额接口 5s 秒一次,其他接口适当调整"),
+    SEVENTEEN(-17, "非法 IP"),
+    EIGHTEEN(-18, "Msg 内容格式错误"),
+    NINETEEN(-19, "短信数量错误,小于 1 /大于 500(个性化)/大于 1000(群发)"),
+    TWENTY(-20, "号码错误或者黑名单"),
+    TWENTY_THREE(-23, "解密失败"),
+    TWENTY_FOUR(-24, "短信包含用户敏感信息"),
+    TWENTY_FIVE(-25, "用户被冻结"),
+    TWENTY_SIX(-26, "无效数据"),
+    TWENTY_SEVEN(-27, "请求参数错误"),
+    TWENTY_EIGHT(-28, "无效数据"),
+    FORTY_ONE(-41, "指定短信模板类型错误或短信类型参数错误"),
+    FORTY_FOUR(-44, "自定义扩展号不符合规则(1-16 位数字)"),
+    FORTY_SIX(-46, "用户黑名单"),
+    FORTY_SEVEN(-47, "系统黑名单"),
+    FORTY_EIGHT(-48, "号码超频拦截"),
+    FIFTY_ONE(-51, "超过设置的每月短信条数的限制"),
+    FIFTY_FIVE(-54, "短信包含系统敏感信息"),
+    ZERO(0, "未知错误");
+
+    private final int key;
+    private final String value;
+
+    public static String find(Integer key) {
+        for (WinnerLookEnum value : WinnerLookEnum.values()) {
+            if (value.getKey() == key) {
+                return value.getValue();
+            }
+        }
+        return ZERO.getValue();
+    }
+}
diff --git a/oying-tools/src/main/java/com/oying/utils/WinnerLookProperties.java b/oying-tools/src/main/java/com/oying/utils/WinnerLookProperties.java
new file mode 100644
index 0000000..4aa16ff
--- /dev/null
+++ b/oying-tools/src/main/java/com/oying/utils/WinnerLookProperties.java
@@ -0,0 +1,20 @@
+package com.oying.utils;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author xin
+ * @description
+ * @date 2025/6/4 14:32
+ */
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "winner-look")
+public class WinnerLookProperties {
+
+    private String urlSendMsg;
+    private String userCode;
+    private String userPass;
+}

--
Gitblit v1.9.3