1.短信功能调整

2.接口返回信息调整
This commit is contained in:
2023-08-28 10:50:28 +08:00
parent ff178a3ee5
commit e84b6d6698
7 changed files with 244 additions and 126 deletions

View File

@@ -1,13 +1,7 @@
package com.njcn.user.service.impl;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.common.pojo.constant.PatternRegex;
@@ -29,6 +23,7 @@ import com.njcn.user.pojo.po.User;
import com.njcn.user.pojo.po.UserSet;
import com.njcn.user.pojo.po.app.AppSendMsg;
import com.njcn.user.service.*;
import com.njcn.user.util.SmsUtil;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@@ -66,6 +61,8 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
private final AppInfoSetFeignClient appInfoSetFeignClient;
private final SmsUtil smsUtil;
@Override
@Transactional(rollbackFor = Exception.class)
public String setMessage(String phone, String devCode, String type) {
@@ -73,40 +70,9 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
throw new BusinessException(UserResponseEnum.REGISTER_PHONE_WRONG);
}
SendSmsResponse sendSmsResponse = null;
String msgTemplate = null;
String msgTemplate = SmsUtil.getMessageTemplate(type);
String vcode = null;
try {
switch (type) {
case "0":
msgTemplate = MessageEnum.getTemplateByCode(0);
break;
case "1":
msgTemplate = MessageEnum.getTemplateByCode(1);
break;
case "2":
msgTemplate = MessageEnum.getTemplateByCode(2);
break;
case "3":
msgTemplate = MessageEnum.getTemplateByCode(3);
break;
case "4":
msgTemplate = MessageEnum.getTemplateByCode(4);
break;
case "5":
msgTemplate = MessageEnum.getTemplateByCode(5);
break;
case "6":
msgTemplate = MessageEnum.getTemplateByCode(6);
break;
case "7":
msgTemplate = MessageEnum.getTemplateByCode(7);
break;
case "8":
msgTemplate = MessageEnum.getTemplateByCode(8);
break;
default:
throw new BusinessException(UserResponseEnum.CODE_TYPE_ERROR);
}
//type为4账号替换为新手机号
if (!msgTemplate.equalsIgnoreCase(MessageEnum.REGISTER.getTemplateCode())) {
User user = this.lambdaQuery().eq(User::getPhone,phone).one();
@@ -125,36 +91,9 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
}
}
}
//开始执行短信发送
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的几个参数
//短信API产品名称短信产品名固定无需修改
final String product = "Dysmsapi";
//短信API产品域名接口地址固定无需修改
final String domain = "dysmsapi.aliyuncs.com";
//替换成你的AK
//你的accessKeyId,参考本文档步骤2
final String accessKeyId = "LTAI4FxsR76x2dq3w9c5puUe";
//你的accessKeySecret参考本文档步骤2
final String accessKeySecret = "GxkTR8fsrvHtixTlD9UPmOGli35tZs";
//初始化ascClient,暂时不支持多region请勿修改
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName("灿能云");
//必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
request.setTemplateCode(msgTemplate);
vcode = getMessageCode();
String code = "{\"code\":\"" + vcode + "\"}";
request.setTemplateParam(code);
//请求失败这里会抛ClientException异常
sendSmsResponse = acsClient.getAcsResponse(request);
//获取短信发送结果
sendSmsResponse = smsUtil.sendSms(phone,msgTemplate,"code",vcode);
String key = RedisKeyEnum.SMS_LOGIN_KEY.getKey() + phone;
if (sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
//成功发送短信验证码后保存进redis验证码失效为5分钟
@@ -169,6 +108,9 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
//短信入库
addSendMessage(phone,vcode,msgTemplate,sendSmsResponse);
}
if (Objects.isNull(sendSmsResponse)){
throw new BusinessException(UserResponseEnum.MESSAGE_SEND_FAIL);
}
return sendSmsResponse.getCode();
}
@@ -182,6 +124,8 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
throw new BusinessException(UserResponseEnum.DEV_CODE_WRONG);
}
judgeCode(phone, code);
String password = null;
SendSmsResponse sendSmsResponse = null;
//先根据手机号查询是否已被注册
User user = this.lambdaQuery().eq(User::getPhone,phone).one();
if (!Objects.isNull(user)){
@@ -203,7 +147,20 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
appInfoSet.setDataInfo(1);
appInfoSetFeignClient.add(appInfoSet);
//发送用户初始密码
sendPasswordMessage(phone,newUser.getId());
try {
password = redisUtil.getStringByKey(newUser.getId());
sendSmsResponse = smsUtil.sendSms(phone,MessageEnum.getTemplateByCode(3),"pwd",password);
if (sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
//成功发送短信验证码后,删除用户密码信息
redisUtil.delete(newUser.getId());
} else {
throw new BusinessException(UserResponseEnum.SEND_CODE_FAIL);
}
addSendMessage(phone,password,MessageEnum.getTemplateByCode(3),sendSmsResponse);
} catch (ClientException e) {
logger.error("发送短信异常,异常为:"+e.getMessage());
addSendMessage(phone,password,MessageEnum.getTemplateByCode(3),sendSmsResponse);
}
//删除验证码
deleteCode(phone);
}
@@ -281,7 +238,6 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
if (!Objects.isNull(user)){
throw new BusinessException(UserResponseEnum.REGISTER_PHONE_REPEAT);
}
user = new User();
User user2 = this.lambdaQuery().eq(User::getId,userId).one();
user2.setName(phoneNew);
user2.setLoginName(phoneNew);
@@ -299,7 +255,6 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
this.update(lambdaUpdateWrapper);
}
/**
* 自定义获取验证码,固定为字母和数字的组合
*/
@@ -328,60 +283,6 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
redisUtil.delete(key);
}
/**
* 发送默认密码短信给用户
* @param phone
* @param userId
*/
public void sendPasswordMessage(String phone, String userId) {
SendSmsResponse sendSmsResponse = null;
String password = null;
String msgTemplate = MessageEnum.getTemplateByCode(3);
//开始执行短信发送
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的几个参数
//短信API产品名称短信产品名固定无需修改
final String product = "Dysmsapi";
//短信API产品域名接口地址固定无需修改
final String domain = "dysmsapi.aliyuncs.com";
//替换成你的AK
//你的accessKeyId,参考本文档步骤2
final String accessKeyId = "LTAI4FxsR76x2dq3w9c5puUe";
//你的accessKeySecret参考本文档步骤2
final String accessKeySecret = "GxkTR8fsrvHtixTlD9UPmOGli35tZs";
//初始化ascClient,暂时不支持多region请勿修改
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
try {
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName("灿能云");
//必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
request.setTemplateCode(msgTemplate);
password = redisUtil.getStringByKey(userId);
String code = "{\"pwd\":\"" + password + "\"}";
request.setTemplateParam(code);
//请求失败这里会抛ClientException异常
sendSmsResponse = acsClient.getAcsResponse(request);
if (sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
//成功发送短信验证码后,删除用户密码信息
redisUtil.delete(userId);
} else {
throw new BusinessException(UserResponseEnum.SEND_CODE_FAIL);
}
addSendMessage(phone,password,msgTemplate,sendSmsResponse);
} catch (ClientException e) {
logger.error("发送短信异常,异常为:"+e.getMessage());
addSendMessage(phone,password,msgTemplate,sendSmsResponse);
}
}
private User cloneUserBoToUser(String phone, String devCode, UserSet userSet) {
User user = new User();
//设置用户id
@@ -423,8 +324,13 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
appSendMsg.setPhone(phone);
appSendMsg.setMessage(vcode);
appSendMsg.setSendTime(LocalDateTime.now());
appSendMsg.setSendStatus(sendSmsResponse.getCode() == null ? "无状态" : sendSmsResponse.getCode());
appSendMsg.setRemark(sendSmsResponse.getMessage());
if (Objects.isNull(sendSmsResponse)){
appSendMsg.setSendStatus("无状态");
appSendMsg.setRemark(null);
} else {
appSendMsg.setSendStatus(sendSmsResponse.getCode() == null ? "无状态" : sendSmsResponse.getCode());
appSendMsg.setRemark(sendSmsResponse.getMessage());
}
appSendMsg.setTemplate(template);
appSendMsgService.save(appSendMsg);
}

View File

@@ -0,0 +1,125 @@
package com.njcn.user.util;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.user.config.Message;
import com.njcn.user.enums.MessageEnum;
import com.njcn.user.enums.UserResponseEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
/**
* 类的介绍:
*
* @author xuyang
* @version 1.0.0
* @createTime 2023/8/25 13:51
*/
@Data
@Configuration
@AllArgsConstructor
public class SmsUtil {
private final Message message;
/**
* 短信API产品名称短信产品名固定无需修改
*/
private static final String PRODUCT = "Dysmsapi";
/**
* 短信API产品域名接口地址固定无需修改
*/
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
/**
* 区域
*/
private static final String AREA = "cn-hangzhou";
/**
* 超时时间参数
*/
private static final String DEFAULTCONNECTTIMEOUT = "sun.net.client.defaultConnectTimeout";
/**
* 过期时间
*/
private static final String DEFAULTREADTIMEOUT = "sun.net.client.defaultReadTimeout";
public static String getMessageTemplate(String type) {
String msgTemplate = null;
switch (type) {
case "0":
msgTemplate = MessageEnum.getTemplateByCode(0);
break;
case "1":
msgTemplate = MessageEnum.getTemplateByCode(1);
break;
case "2":
msgTemplate = MessageEnum.getTemplateByCode(2);
break;
case "3":
msgTemplate = MessageEnum.getTemplateByCode(3);
break;
case "4":
msgTemplate = MessageEnum.getTemplateByCode(4);
break;
case "5":
msgTemplate = MessageEnum.getTemplateByCode(5);
break;
case "6":
msgTemplate = MessageEnum.getTemplateByCode(6);
break;
case "7":
msgTemplate = MessageEnum.getTemplateByCode(7);
break;
case "8":
msgTemplate = MessageEnum.getTemplateByCode(8);
break;
default:
throw new BusinessException(UserResponseEnum.CODE_TYPE_ERROR);
}
return msgTemplate;
}
/**
* 发送消息
* @param phone 手机号
* @param template 模板号
* @param param 短信模板中定义的参数名称
* @param value 参数实际值
* @return sendSmsResponse 发送消息结果
* @throws ClientException
*/
public SendSmsResponse sendSms(String phone, String template, String param, String value) throws ClientException {
System.setProperty(DEFAULTCONNECTTIMEOUT, message.getTime());
System.setProperty(DEFAULTREADTIMEOUT, message.getTime());
//初始化ascClient,暂时不支持多region请勿修改
IClientProfile profile = DefaultProfile.getProfile(AREA, message.getAccessKeyId(), message.getAccessKeySecret());
DefaultProfile.addEndpoint(AREA, AREA, PRODUCT, DOMAIN);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(message.getAutoGraph());
//必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
request.setTemplateCode(template);
String code = "{\""+param+"\":\"" + value + "\"}";
request.setTemplateParam(code);
//请求失败这里会抛ClientException异常
return acsClient.getAcsResponse(request);
}
}