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