From 898479dc05fe91c94fd54ad2c4d3fb70139dc494 Mon Sep 17 00:00:00 2001 From: wyq Date: Thu, 24 Apr 2025 16:55:14 +0800 Subject: [PATCH] 1 --- .../java/com/zbkj/front/config/SmsConfig.java | 40 ++++ .../src/main/resources/application-prod.yml | 5 + .../src/main/resources/application.yml | 7 + crmeb-service/pom.xml | 5 + .../service/service/impl/SmsServiceImpl.java | 223 ++++++++++++------ 5 files changed, 207 insertions(+), 73 deletions(-) create mode 100644 crmeb-front/src/main/java/com/zbkj/front/config/SmsConfig.java diff --git a/crmeb-front/src/main/java/com/zbkj/front/config/SmsConfig.java b/crmeb-front/src/main/java/com/zbkj/front/config/SmsConfig.java new file mode 100644 index 0000000..675713d --- /dev/null +++ b/crmeb-front/src/main/java/com/zbkj/front/config/SmsConfig.java @@ -0,0 +1,40 @@ +package com.zbkj.front.config; + + +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.teaopenapi.models.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author admin2 + */ + +@Configuration +public class SmsConfig { + + @Value("${sms.appkey}") + private String accessKeyId ; + @Value("${sms.secret}") + private String accessKeySecret ; + + private static final String ENDPOINT = "dysmsapi.aliyuncs.com"; + + @Bean + public Client smsClient() { + try { + Config config = new Config() + // 必填,您的 AccessKey ID + .setAccessKeyId(accessKeyId) + // 必填,您的 AccessKey Secret + .setAccessKeySecret(accessKeySecret); + // 访问的域名 + config.endpoint = ENDPOINT; + return new Client(config); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/crmeb-front/src/main/resources/application-prod.yml b/crmeb-front/src/main/resources/application-prod.yml index 37d6197..f4e205e 100644 --- a/crmeb-front/src/main/resources/application-prod.yml +++ b/crmeb-front/src/main/resources/application-prod.yml @@ -83,3 +83,8 @@ ruoyi: updateOrderRefundStatusUrl: https://oco.xsbuy.cn/stage-api/system/extendShop/updateOrderRefundStatus triggerDeliveryCheckUrl: https://oco.xsbuy.cn/stage-api/system/extendShop/triggerDeliveryCheck systemErrRobot: https://open.feishu.cn/open-apis/bot/v2/hook/c8cf1da1-c652-482d-9996-62bdb8da25fe +sms: + appkey: LTAI5tJdJ474w6EzLS6dBaRd + secret: fd2qfdKUn0NJbe6lVEWA66sxVSWhqN + template-code: SMS_174435568 + sign-name: 上海湘商 diff --git a/crmeb-front/src/main/resources/application.yml b/crmeb-front/src/main/resources/application.yml index 4e53b50..b2776ca 100644 --- a/crmeb-front/src/main/resources/application.yml +++ b/crmeb-front/src/main/resources/application.yml @@ -157,3 +157,10 @@ systemErrRobot: https://open.feishu.cn/open-apis/bot/v2/hook/dac8c464-cfc3-4323- alis: accessKey: LTAI5tRHmAmcSo3ytLajCLyK accessKeySecret: k3dhdkIa2eG8Q5hTGpyspVB0Aeo7SV + +sms: + appkey: LTAI5tJdJ474w6EzLS6dBaRd + secret: fd2qfdKUn0NJbe6lVEWA66sxVSWhqN + template-code: SMS_174435568 + sign-name: 上海湘商 + diff --git a/crmeb-service/pom.xml b/crmeb-service/pom.xml index abacdc8..b5607af 100644 --- a/crmeb-service/pom.xml +++ b/crmeb-service/pom.xml @@ -17,6 +17,11 @@ + + com.aliyun + dysmsapi20170525 + 2.0.10 + com.zbkj crmeb-common diff --git a/crmeb-service/src/main/java/com/zbkj/service/service/impl/SmsServiceImpl.java b/crmeb-service/src/main/java/com/zbkj/service/service/impl/SmsServiceImpl.java index 7f5d528..27c2dab 100644 --- a/crmeb-service/src/main/java/com/zbkj/service/service/impl/SmsServiceImpl.java +++ b/crmeb-service/src/main/java/com/zbkj/service/service/impl/SmsServiceImpl.java @@ -3,8 +3,12 @@ package com.zbkj.service.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.teautil.models.RuntimeOptions; import com.zbkj.common.request.SmsApplyTempRequest; import com.zbkj.common.request.SmsModifySignRequest; import com.zbkj.common.utils.CrmebUtil; @@ -21,18 +25,24 @@ import com.zbkj.common.vo.OnePassLoginVo; import com.zbkj.common.vo.SendSmsVo; import com.zbkj.service.service.*; import com.zbkj.service.util.OnePassUtil; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import javax.annotation.Resource; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -48,14 +58,20 @@ import java.util.stream.Collectors; * +---------------------------------------------------------------------- */ @Service +@Slf4j public class SmsServiceImpl implements SmsService { @Autowired private SystemConfigService systemConfigService; - + @Autowired + private com.aliyun.dysmsapi20170525.Client smsClient; @Autowired private RestTemplateUtil restTemplateUtil; + @Value("${sms.sign-name}") + private String signName; + @Value("${sms.template-code}") + private String templateCode; @Autowired private SmsRecordService smsRecordService; @@ -332,22 +348,23 @@ public class SmsServiceImpl implements SmsService { @Override public Boolean sendCommonCode(String phone) { ValidateFormUtil.isPhone(phone,"手机号码错误"); - Boolean checkAccount = onePassService.checkAccount(); - if (!checkAccount) { - throw new CrmebException("发送短信请先登录一号通账号"); - } - JSONObject info = onePassService.info(); - JSONObject smsObject = info.getJSONObject("sms"); - Integer open = smsObject.getInteger("open"); - if (!open.equals(1)) { - throw new CrmebException("发送短信请先开通一号通账号服务"); - } - if (smsObject.getInteger("num") <= 0) { - throw new CrmebException("一号通账号服务余量不足"); - } - if (redisUtil.exists(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone)) { - throw new CrmebException("您的短信发送过于频繁,请稍后再试"); - } + +// Boolean checkAccount = onePassService.checkAccount(); +// if (!checkAccount) { +// throw new CrmebException("发送短信请先登录一号通账号"); +// } +// JSONObject info = onePassService.info(); +// JSONObject smsObject = info.getJSONObject("sms"); +// Integer open = smsObject.getInteger("open"); +// if (!open.equals(1)) { +// throw new CrmebException("发送短信请先开通一号通账号服务"); +// } +// if (smsObject.getInteger("num") <= 0) { +// throw new CrmebException("一号通账号服务余量不足"); +// } +// if (redisUtil.exists(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone)) { +// throw new CrmebException("您的短信发送过于频繁,请稍后再试"); +// } return sendSms(phone, SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE, null); } @@ -501,7 +518,53 @@ public class SmsServiceImpl implements SmsService { } return jsonObject; } + public static Integer getRandomNumber() { + Random random = new Random(); + int randomNumber = random.nextInt(999999) % (999999 - 100000 + 1) + 100000; + return randomNumber; + } + public String sendBySms(String phone, String signName, String templateCode, Map param) { + + SendSmsRequest sendSmsRequest = new SendSmsRequest() + .setSignName(signName) + .setTemplateCode(templateCode) + .setPhoneNumbers(phone) + .setTemplateParam(JSON.toJSONString(param)); + RuntimeOptions runtime = new RuntimeOptions(); + try { + SendSmsResponse sendSmsResponse = smsClient.sendSmsWithOptions(sendSmsRequest, runtime); + System.out.println("短信内容================" + sendSmsResponse.getBody().getMessage()); + System.out.println("短信内容================" + sendSmsResponse.getBody().getCode()); + } catch (Exception error) { + log.error("错误信息===" ,error); + // 如有需要,请打印 error + log.error("错误信息===" + error.getMessage()); + } + + return null; + } + public static boolean isMobileNO(String mobileNum) { + String regex = "^((13[0-9])|(16[0-9])|(14[5,7])|(15[^4])|(17[0-8])|(18[0-9])|(19[0-9]))\\d{8}$"; + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(mobileNum); + return m.matches(); + } + private void checkPhone(String phone) { + if (!isMobileNO(phone)) { + throw new CrmebException("请填写正确手机号"); + } + String key=userService.getValidateCodeRedisKey(phone); + String limitKey=SmsConstants.SMS_VALIDATE_PHONE_NUM + phone; + Integer cacheObject = redisUtil.get(key); + if (cacheObject!=null) { + throw new CrmebException("60秒后重试"); + } + Integer limit = redisUtil.get(limitKey); + if (limit != null && limit >= 100) { + throw new CrmebException("操作频繁,稍后重试"); + } + } /** * 发送短信 * 验证码特殊处理其他的参数自行根据要求处理 @@ -511,62 +574,76 @@ public class SmsServiceImpl implements SmsService { * @return boolean */ private Boolean sendSms(String phone, Integer tag, HashMap pram) { - SendSmsVo sendSmsVo = new SendSmsVo(); - sendSmsVo.setMobile(phone); - if (tag.equals(SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE)) {// 验证码 特殊处理 code - //获取短信验证码过期时间 - String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE); - if (StrUtil.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) { - codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期 - } - Integer code = CrmebUtil.randomCount(111111, 999999); - HashMap justPram = new HashMap<>(); - justPram.put("code", code); - justPram.put("time", codeExpireStr); - - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID); - sendSmsVo.setContent(JSONObject.toJSONString(justPram)); - Boolean aBoolean = commonSendSms(sendSmsVo); - if (!aBoolean) { - throw new CrmebException("发送短信失败,请联系后台管理员"); - } - // 将验证码存入redis - redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES); - redisUtil.set(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone, 1, 60L); - return aBoolean; - } - // 以下部分实时性不高暂时还是使用队列发送 - sendSmsVo.setContent(JSONObject.toJSONString(pram)); - switch (tag) { - case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID); - break; - case SmsConstants.SMS_CONFIG_TYPE_ORDER_PAY_FALSE: // 订单未支付 order_id - sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID); - break; - } - return commonSendSms(sendSmsVo); + checkPhone(phone); + Integer randomNumber = getRandomNumber(); + Map map = new HashMap<>(16); + map.put("code", randomNumber); + sendBySms(phone, signName, templateCode, map); + String key=userService.getValidateCodeRedisKey(phone); + String limitKey=SmsConstants.SMS_VALIDATE_PHONE_NUM + phone; + Integer limit = redisUtil.get(limitKey); + limit = limit == null ? 0 : limit; + limit++; + redisUtil.set(key,randomNumber,60L, TimeUnit.SECONDS); + redisUtil.set(limitKey,limit,1L,TimeUnit.DAYS); +// +// SendSmsVo sendSmsVo = new SendSmsVo(); +// sendSmsVo.setMobile(phone); +// if (tag.equals(SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE)) {// 验证码 特殊处理 code +// //获取短信验证码过期时间 +// String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE); +// if (StrUtil.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) { +// codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期 +// } +// Integer code = CrmebUtil.randomCount(111111, 999999); +// HashMap justPram = new HashMap<>(); +// justPram.put("code", code); +// justPram.put("time", codeExpireStr); +// +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID); +// sendSmsVo.setContent(JSONObject.toJSONString(justPram)); +// Boolean aBoolean = commonSendSms(sendSmsVo); +// if (!aBoolean) { +// throw new CrmebException("发送短信失败,请联系后台管理员"); +// } +// // 将验证码存入redis +// redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES); +// redisUtil.set(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone, 1, 60L); +// return aBoolean; +// } +// // 以下部分实时性不高暂时还是使用队列发送 +// sendSmsVo.setContent(JSONObject.toJSONString(pram)); +// switch (tag) { +// case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID); +// break; +// case SmsConstants.SMS_CONFIG_TYPE_ORDER_PAY_FALSE: // 订单未支付 order_id +// sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID); +// break; +// } +// return commonSendSms(sendSmsVo); + return true; } /**