|
|
|
|
@ -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<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 |
|
|
|
|
*/ |
|
|
|
|
private Boolean sendSms(String phone, Integer tag, HashMap<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|