安徽省公司短信平台

This commit is contained in:
sxu 2025-05-07 16:05:24 +08:00
parent 5b52697a78
commit 40576bf75b
6 changed files with 95 additions and 28 deletions

View File

@ -19,6 +19,7 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@ -107,7 +108,8 @@ public class SysPasswordService {
String code = VerificationCodeUtils.generateVerificationCode(VerificationCodeUtils.CodeType.NUMERIC); String code = VerificationCodeUtils.generateVerificationCode(VerificationCodeUtils.CodeType.NUMERIC);
String str = "您的验证码为" + code + "尊敬的客户以上验证码3分钟有效微服务平台提醒您转发可能导致账号被盗请勿将验证码泄露于他人"; String str = "您的验证码为" + code + "尊敬的客户以上验证码3分钟有效微服务平台提醒您转发可能导致账号被盗请勿将验证码泄露于他人";
String verifyKey = CacheConstants.VERIFICATION_CODE + phone; String verifyKey = CacheConstants.VERIFICATION_CODE + phone;
String s = SmsUtils.smsToken(phone, str, ""); //String s = SmsUtils.smsToken(phone, str, "");
String s = SmsUtils.sendMsgToSms(Arrays.asList(phone), str);
if (StringUtils.isNotEmpty(s)) { if (StringUtils.isNotEmpty(s)) {
if (s.contains("ok")) { if (s.contains("ok")) {
redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);

Binary file not shown.

View File

@ -164,6 +164,16 @@
<version>1.10.19</version> <version>1.10.19</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- 省公司短信平台sms-util -->
<dependency>
<groupId>com.ahsbd</groupId>
<artifactId>sms-util</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/sms-util-1.0.jar</systemPath>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,13 +1,23 @@
package com.bonus.common.core.utils.sms; package com.bonus.common.core.utils.sms;
import cn.hutool.json.JSONObject;
import com.ah.sbd.SmsTool;
import com.ah.sbd.utils.param.BatchSmsByContentParam;
import com.ah.sbd.utils.param.SmsParam;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.bonus.common.core.utils.StringUtils;
import com.bonus.common.core.utils.encryption.Sm4Utils;
import com.bonus.common.core.utils.http.HttpRequestHelper; import com.bonus.common.core.utils.http.HttpRequestHelper;
import org.springframework.util.CollectionUtils;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
public class SmsUtils { public class SmsUtils {
// 安徽省公司短信平台key
public static final String ANHUI_COMPANY_SMS_KEY = "Wq1FZobZC5iJIAGKWh6gpKUmdGKBOQq7koHmx+Vg49g/dSjSFlw+2qRQmMmyXvJT";
/** /**
* 发送短信验证码 * 发送短信验证码
* *
@ -16,33 +26,71 @@ public class SmsUtils {
* @param sendTime 为空表示立即发送定时发送格式20101024090810 * @param sendTime 为空表示立即发送定时发送格式20101024090810
* @return 是否发送成功 * @return 是否发送成功
*/ */
public static String smsToken(String mobile, String content, String sendTime) { // public static String smsToken(String mobile, String content, String sendTime) {
Map<String, String> headers = new HashMap<>(); // Map<String, String> headers = new HashMap<>();
Map<String, Object> mapJson = new HashMap<>(6); // Map<String, Object> mapJson = new HashMap<>(6);
mapJson.put("ddtkey", SmsConfig.DDT_KEY); // mapJson.put("ddtkey", SmsConfig.DDT_KEY);
mapJson.put("secretkey", SmsConfig.SECRET_KEY); // mapJson.put("secretkey", SmsConfig.SECRET_KEY);
mapJson.put("mobile", mobile); // mapJson.put("mobile", mobile);
mapJson.put("content", SmsConfig.SMS_SIGNATURE + content); // mapJson.put("content", SmsConfig.SMS_SIGNATURE + content);
mapJson.put("sendTime", sendTime); // mapJson.put("sendTime", sendTime);
mapJson.put("extno", ""); // mapJson.put("extno", "");
//
// // 将mapJson转换为URL查询参数格式
// StringBuilder urlBuilder = new StringBuilder(SmsConfig.SMS_TOKEN + "?");
// for (Map.Entry<String, Object> entry : mapJson.entrySet()) {
// try {
// String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
// String encodedValue = URLEncoder.encode(entry.getValue().toString(), "UTF-8");
// urlBuilder.append(encodedKey).append("=").append(encodedValue).append("&");
// } catch (Exception e) {
// e.printStackTrace();
// return null;
// }
// }
// // 移除最后一个&符号
// urlBuilder.setLength(urlBuilder.length() - 1);
// String urlWithParams = urlBuilder.toString();
//
// String json = JSON.toJSONString(mapJson);
// return HttpRequestHelper.postJson(SmsConfig.DOMAIN, urlWithParams, json, headers);
// }
// 将mapJson转换为URL查询参数格式 /**
StringBuilder urlBuilder = new StringBuilder(SmsConfig.SMS_TOKEN + "?"); * 发送消息到短信
for (Map.Entry<String, Object> entry : mapJson.entrySet()) { *
try { * @param phoneNumbers 电话号码列表可能包含无效或重复的号码
String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8"); * @param msg 要发送的短信消息内容
String encodedValue = URLEncoder.encode(entry.getValue().toString(), "UTF-8"); * @return 发送短信的结果具体形式依赖于SmsUtils.smsToken的实现
urlBuilder.append(encodedKey).append("=").append(encodedValue).append("&"); * 此方法首先检查电话号码列表是否为空如果为空则直接返回空字符串
} catch (Exception e) { * 接下来它会移除列表中所有为空的电话号码
e.printStackTrace(); * 然后对列表中超过11位的电话号码进行解密处理
return null; * 确保只有有效的电话号码被用来发送短信
*/
public static String sendMsgToSms(List<String> phoneNumbers, String msg) {
// 检查电话号码列表和消息内容是否有效
if (CollectionUtils.isEmpty(phoneNumbers) || StringUtils.isBlank(msg)) {
return "";
} }
}
// 移除最后一个&符号
urlBuilder.setLength(urlBuilder.length() - 1);
String urlWithParams = urlBuilder.toString();
String json = JSON.toJSONString(mapJson); // 过滤掉无效的电话号码
return HttpRequestHelper.postJson(SmsConfig.DOMAIN, urlWithParams, json, headers); phoneNumbers.removeIf(StringUtils::isEmpty);
// 对超过11位的电话号码进行解密处理
phoneNumbers.replaceAll(phoneNumber ->
phoneNumber.length() > 11 ? Sm4Utils.decrypt(phoneNumber) : phoneNumber
);
// 根据电话号码数量发送短信
if (phoneNumbers.isEmpty()) {
return "";
} else if (phoneNumbers.size() == 1) {
JSONObject sendResult = SmsTool.sendSms(new SmsParam(phoneNumbers.get(0), msg), ANHUI_COMPANY_SMS_KEY);
return sendResult.toString();
} else {
JSONObject sendResult = SmsTool.sendSms(new BatchSmsByContentParam(phoneNumbers, msg), ANHUI_COMPANY_SMS_KEY);
return sendResult.toString();
} }
}
} }

View File

@ -7,9 +7,11 @@ import com.bonus.common.core.utils.VerificationCodeUtils;
import com.bonus.common.core.utils.sms.SmsUtils; import com.bonus.common.core.utils.sms.SmsUtils;
import com.bonus.common.redis.service.RedisService; import com.bonus.common.redis.service.RedisService;
import com.bonus.common.security.config.VerificationCodeConfig; import com.bonus.common.security.config.VerificationCodeConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static com.bonus.common.core.utils.VerificationCodeUtils.CodeType.NUMERIC; import static com.bonus.common.core.utils.VerificationCodeUtils.CodeType.NUMERIC;
@ -18,6 +20,7 @@ import static com.bonus.common.core.utils.VerificationCodeUtils.CodeType.NUMERIC
* @author bonus * @author bonus
*/ */
@Component @Component
@Slf4j
public class SmsService { public class SmsService {
@Resource @Resource
private VerificationCodeConfig verificationCodeConfig; private VerificationCodeConfig verificationCodeConfig;
@ -37,7 +40,9 @@ public class SmsService {
String code = VerificationCodeUtils.generateVerificationCode(NUMERIC); String code = VerificationCodeUtils.generateVerificationCode(NUMERIC);
String str = verificationCodeConfig.getContent().replace("<code>", code); String str = verificationCodeConfig.getContent().replace("<code>", code);
str = str.replace("<time>", verificationCodeConfig.getTime().toString()); str = str.replace("<time>", verificationCodeConfig.getTime().toString());
String s = SmsUtils.smsToken(to, str, ""); //String s = SmsUtils.smsToken(to, str, "");
String s = SmsUtils.sendMsgToSms(Arrays.asList(to), str);
log.error("省公司短信平台发送短信返回结果=" + s);
if (StringUtils.isNotEmpty(s)) { if (StringUtils.isNotEmpty(s)) {
if (s.contains("ok")) { if (s.contains("ok")) {
String verifyKey = CacheConstants.VERIFICATION_CODE + StringUtils.nvl(to, ""); String verifyKey = CacheConstants.VERIFICATION_CODE + StringUtils.nvl(to, "");

View File

@ -35,6 +35,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Validator; import javax.validation.Validator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -600,7 +601,8 @@ public class SysUserServiceImpl implements ISysUserService {
Integer i = userMapper.approvalStatus(userId); Integer i = userMapper.approvalStatus(userId);
if (i > 0) { if (i > 0) {
if (StringUtils.isNotEmpty(sysUser.getPhonenumber())) { if (StringUtils.isNotEmpty(sysUser.getPhonenumber())) {
SmsUtils.smsToken(sysUser.getPhonenumber(), "您的账号:" + sysUser.getUserName() + "已通过审批,请登录系统", ""); //SmsUtils.smsToken(sysUser.getPhonenumber(), "您的账号:" + sysUser.getUserName() + "已通过审批,请登录系统", "");
SmsUtils.sendMsgToSms(Arrays.asList(sysUser.getPhonenumber()), "您的账号:" + sysUser.getUserName() + "已通过审批,请登录系统");
} }
if (StringUtils.isNotEmpty(sysUser.getEmail())) { if (StringUtils.isNotEmpty(sysUser.getEmail())) {
sendSimpleEmail(sysUser.getEmail(), "您的账号:" + sysUser.getUserName() + "已通过审批,请登录系统"); sendSimpleEmail(sysUser.getEmail(), "您的账号:" + sysUser.getUserName() + "已通过审批,请登录系统");