diff --git a/bonus-auth/src/main/java/com/bonus/auth/service/SysPasswordService.java b/bonus-auth/src/main/java/com/bonus/auth/service/SysPasswordService.java index b2bac6c..cb617db 100644 --- a/bonus-auth/src/main/java/com/bonus/auth/service/SysPasswordService.java +++ b/bonus-auth/src/main/java/com/bonus/auth/service/SysPasswordService.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.IOException; +import java.util.Arrays; import java.util.concurrent.TimeUnit; /** @@ -107,7 +108,8 @@ public class SysPasswordService { String code = VerificationCodeUtils.generateVerificationCode(VerificationCodeUtils.CodeType.NUMERIC); String str = "您的验证码为" + code + ",尊敬的客户,以上验证码3分钟有效,微服务平台提醒您:转发可能导致账号被盗,请勿将验证码泄露于他人"; 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 (s.contains("ok")) { redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); diff --git a/bonus-common/bonus-common-core/lib/sms-util-1.0.jar b/bonus-common/bonus-common-core/lib/sms-util-1.0.jar new file mode 100644 index 0000000..7b09355 Binary files /dev/null and b/bonus-common/bonus-common-core/lib/sms-util-1.0.jar differ diff --git a/bonus-common/bonus-common-core/pom.xml b/bonus-common/bonus-common-core/pom.xml index 26fe105..280d494 100644 --- a/bonus-common/bonus-common-core/pom.xml +++ b/bonus-common/bonus-common-core/pom.xml @@ -164,6 +164,16 @@ 1.10.19 test + + + + com.ahsbd + sms-util + 1.0 + system + ${project.basedir}/lib/sms-util-1.0.jar + + diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/sms/SmsUtils.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/sms/SmsUtils.java index c80a381..f729823 100644 --- a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/sms/SmsUtils.java +++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/sms/SmsUtils.java @@ -1,13 +1,23 @@ 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.bonus.common.core.utils.StringUtils; +import com.bonus.common.core.utils.encryption.Sm4Utils; import com.bonus.common.core.utils.http.HttpRequestHelper; +import org.springframework.util.CollectionUtils; import java.net.URLEncoder; import java.util.HashMap; +import java.util.List; import java.util.Map; 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 * @return 是否发送成功 */ - public static String smsToken(String mobile, String content, String sendTime) { - Map headers = new HashMap<>(); - Map mapJson = new HashMap<>(6); - mapJson.put("ddtkey", SmsConfig.DDT_KEY); - mapJson.put("secretkey", SmsConfig.SECRET_KEY); - mapJson.put("mobile", mobile); - mapJson.put("content", SmsConfig.SMS_SIGNATURE + content); - mapJson.put("sendTime", sendTime); - mapJson.put("extno", ""); +// public static String smsToken(String mobile, String content, String sendTime) { +// Map headers = new HashMap<>(); +// Map mapJson = new HashMap<>(6); +// mapJson.put("ddtkey", SmsConfig.DDT_KEY); +// mapJson.put("secretkey", SmsConfig.SECRET_KEY); +// mapJson.put("mobile", mobile); +// mapJson.put("content", SmsConfig.SMS_SIGNATURE + content); +// mapJson.put("sendTime", sendTime); +// mapJson.put("extno", ""); +// +// // 将mapJson转换为URL查询参数格式 +// StringBuilder urlBuilder = new StringBuilder(SmsConfig.SMS_TOKEN + "?"); +// for (Map.Entry 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 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; - } + /** + * 发送消息到短信 + * + * @param phoneNumbers 电话号码列表,可能包含无效或重复的号码 + * @param msg 要发送的短信消息内容 + * @return 发送短信的结果,具体形式依赖于SmsUtils.smsToken的实现 + * 此方法首先检查电话号码列表是否为空,如果为空,则直接返回空字符串。 + * 接下来,它会移除列表中所有为空的电话号码, + * 然后对列表中超过11位的电话号码进行解密处理, + * 确保只有有效的电话号码被用来发送短信。 + */ + public static String sendMsgToSms(List 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(); + } } + } diff --git a/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/service/SmsService.java b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/service/SmsService.java index 2133f29..f3fa62e 100644 --- a/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/service/SmsService.java +++ b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/service/SmsService.java @@ -7,9 +7,11 @@ import com.bonus.common.core.utils.VerificationCodeUtils; import com.bonus.common.core.utils.sms.SmsUtils; import com.bonus.common.redis.service.RedisService; import com.bonus.common.security.config.VerificationCodeConfig; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.Arrays; import java.util.concurrent.TimeUnit; 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 */ @Component +@Slf4j public class SmsService { @Resource private VerificationCodeConfig verificationCodeConfig; @@ -37,7 +40,9 @@ public class SmsService { String code = VerificationCodeUtils.generateVerificationCode(NUMERIC); String str = verificationCodeConfig.getContent().replace("", code); str = str.replace("