wyq 6 months ago
parent 0352e3d528
commit 898479dc05
  1. 40
      crmeb-front/src/main/java/com/zbkj/front/config/SmsConfig.java
  2. 5
      crmeb-front/src/main/resources/application-prod.yml
  3. 7
      crmeb-front/src/main/resources/application.yml
  4. 5
      crmeb-service/pom.xml
  5. 223
      crmeb-service/src/main/java/com/zbkj/service/service/impl/SmsServiceImpl.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);
}
}
}

@ -83,3 +83,8 @@ ruoyi:
updateOrderRefundStatusUrl: https://oco.xsbuy.cn/stage-api/system/extendShop/updateOrderRefundStatus updateOrderRefundStatusUrl: https://oco.xsbuy.cn/stage-api/system/extendShop/updateOrderRefundStatus
triggerDeliveryCheckUrl: https://oco.xsbuy.cn/stage-api/system/extendShop/triggerDeliveryCheck 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 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: 上海湘商

@ -157,3 +157,10 @@ systemErrRobot: https://open.feishu.cn/open-apis/bot/v2/hook/dac8c464-cfc3-4323-
alis: alis:
accessKey: LTAI5tRHmAmcSo3ytLajCLyK accessKey: LTAI5tRHmAmcSo3ytLajCLyK
accessKeySecret: k3dhdkIa2eG8Q5hTGpyspVB0Aeo7SV accessKeySecret: k3dhdkIa2eG8Q5hTGpyspVB0Aeo7SV
sms:
appkey: LTAI5tJdJ474w6EzLS6dBaRd
secret: fd2qfdKUn0NJbe6lVEWA66sxVSWhqN
template-code: SMS_174435568
sign-name: 上海湘商

@ -17,6 +17,11 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.10</version>
</dependency>
<dependency> <dependency>
<groupId>com.zbkj</groupId> <groupId>com.zbkj</groupId>
<artifactId>crmeb-common</artifactId> <artifactId>crmeb-common</artifactId>

@ -3,8 +3,12 @@ package com.zbkj.service.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; 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.SmsApplyTempRequest;
import com.zbkj.common.request.SmsModifySignRequest; import com.zbkj.common.request.SmsModifySignRequest;
import com.zbkj.common.utils.CrmebUtil; 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.common.vo.SendSmsVo;
import com.zbkj.service.service.*; import com.zbkj.service.service.*;
import com.zbkj.service.util.OnePassUtil; import com.zbkj.service.util.OnePassUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -48,14 +58,20 @@ import java.util.stream.Collectors;
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
*/ */
@Service @Service
@Slf4j
public class SmsServiceImpl implements SmsService { public class SmsServiceImpl implements SmsService {
@Autowired @Autowired
private SystemConfigService systemConfigService; private SystemConfigService systemConfigService;
@Autowired
private com.aliyun.dysmsapi20170525.Client smsClient;
@Autowired @Autowired
private RestTemplateUtil restTemplateUtil; private RestTemplateUtil restTemplateUtil;
@Value("${sms.sign-name}")
private String signName;
@Value("${sms.template-code}")
private String templateCode;
@Autowired @Autowired
private SmsRecordService smsRecordService; private SmsRecordService smsRecordService;
@ -332,22 +348,23 @@ public class SmsServiceImpl implements SmsService {
@Override @Override
public Boolean sendCommonCode(String phone) { public Boolean sendCommonCode(String phone) {
ValidateFormUtil.isPhone(phone,"手机号码错误"); ValidateFormUtil.isPhone(phone,"手机号码错误");
Boolean checkAccount = onePassService.checkAccount();
if (!checkAccount) { // Boolean checkAccount = onePassService.checkAccount();
throw new CrmebException("发送短信请先登录一号通账号"); // if (!checkAccount) {
} // throw new CrmebException("发送短信请先登录一号通账号");
JSONObject info = onePassService.info(); // }
JSONObject smsObject = info.getJSONObject("sms"); // JSONObject info = onePassService.info();
Integer open = smsObject.getInteger("open"); // JSONObject smsObject = info.getJSONObject("sms");
if (!open.equals(1)) { // Integer open = smsObject.getInteger("open");
throw new CrmebException("发送短信请先开通一号通账号服务"); // if (!open.equals(1)) {
} // throw new CrmebException("发送短信请先开通一号通账号服务");
if (smsObject.getInteger("num") <= 0) { // }
throw new CrmebException("一号通账号服务余量不足"); // if (smsObject.getInteger("num") <= 0) {
} // throw new CrmebException("一号通账号服务余量不足");
if (redisUtil.exists(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone)) { // }
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); return sendSms(phone, SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE, null);
} }
@ -501,7 +518,53 @@ public class SmsServiceImpl implements SmsService {
} }
return jsonObject; 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<String,Object> 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 * @return boolean
*/ */
private Boolean sendSms(String phone, Integer tag, HashMap<String, Object> pram) { private Boolean sendSms(String phone, Integer tag, HashMap<String, Object> pram) {
SendSmsVo sendSmsVo = new SendSmsVo(); checkPhone(phone);
sendSmsVo.setMobile(phone); Integer randomNumber = getRandomNumber();
if (tag.equals(SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE)) {// 验证码 特殊处理 code Map<String, Object> map = new HashMap<>(16);
//获取短信验证码过期时间 map.put("code", randomNumber);
String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE); sendBySms(phone, signName, templateCode, map);
if (StrUtil.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) { String key=userService.getValidateCodeRedisKey(phone);
codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期 String limitKey=SmsConstants.SMS_VALIDATE_PHONE_NUM + phone;
} Integer limit = redisUtil.get(limitKey);
Integer code = CrmebUtil.randomCount(111111, 999999); limit = limit == null ? 0 : limit;
HashMap<String, Object> justPram = new HashMap<>(); limit++;
justPram.put("code", code); redisUtil.set(key,randomNumber,60L, TimeUnit.SECONDS);
justPram.put("time", codeExpireStr); redisUtil.set(limitKey,limit,1L,TimeUnit.DAYS);
//
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID); // SendSmsVo sendSmsVo = new SendSmsVo();
sendSmsVo.setContent(JSONObject.toJSONString(justPram)); // sendSmsVo.setMobile(phone);
Boolean aBoolean = commonSendSms(sendSmsVo); // if (tag.equals(SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE)) {// 验证码 特殊处理 code
if (!aBoolean) { // //获取短信验证码过期时间
throw new CrmebException("发送短信失败,请联系后台管理员"); // String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE);
} // if (StrUtil.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) {
// 将验证码存入redis // codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期
redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES); // }
redisUtil.set(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone, 1, 60L); // Integer code = CrmebUtil.randomCount(111111, 999999);
return aBoolean; // HashMap<String, Object> justPram = new HashMap<>();
} // justPram.put("code", code);
// 以下部分实时性不高暂时还是使用队列发送 // justPram.put("time", codeExpireStr);
sendSmsVo.setContent(JSONObject.toJSONString(pram)); //
switch (tag) { // sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID);
case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id // sendSmsVo.setContent(JSONObject.toJSONString(justPram));
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID); // Boolean aBoolean = commonSendSms(sendSmsVo);
break; // if (!aBoolean) {
case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name // throw new CrmebException("发送短信失败,请联系后台管理员");
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID); // }
break; // // 将验证码存入redis
case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name // redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES);
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); // redisUtil.set(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone, 1, 60L);
break; // return aBoolean;
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; // sendSmsVo.setContent(JSONObject.toJSONString(pram));
case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id // switch (tag) {
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID); // case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id
break; // sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID);
case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id // break;
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID); // case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name
break; // sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID);
case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id // break;
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); // case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name
break; // sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID);
case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price // break;
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID); // case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id
break; // sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID);
case SmsConstants.SMS_CONFIG_TYPE_ORDER_PAY_FALSE: // 订单未支付 order_id // break;
sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID); // case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id
break; // sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID);
} // break;
return commonSendSms(sendSmsVo); // 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;
} }
/** /**

Loading…
Cancel
Save