package com.inspur.customer.service.authcode; import com.alibaba.cola.dto.Response; import com.inspur.customer.client.authcode.AuthCodeService; import com.inspur.customer.object.user.authcode.AuthCodeCheckDTO; import com.inspur.customer.object.user.authcode.AuthCodeCheckResponse; import com.inspur.customer.object.user.authcode.AuthCodeDTO; import com.inspur.inform.client.CommonInformService; import com.inspur.inform.object.message.AbstractBaseInformMessage; import com.inspur.inform.object.message.EmailInformMessage; import com.inspur.inform.object.message.SmsInformMessage; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.data.redis.core.RedisTemplate; import javax.annotation.Resource; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 验证码相关功能实现类 * @version v1.0 * @author joe wan * @date 2022/6/29 17:22 */ @Slf4j @DubboService(interfaceClass = AuthCodeService.class) public class AuthCodeServiceImpl implements AuthCodeService { private static final String AUTH_CODE_MESSAGE_TEMPLATE = "auth_code"; private static final String AUTH_CODE_CACHE_KEY = "msr:authCode:"; @DubboReference private CommonInformService commonInformService; @Resource private RedisTemplate redisTemplate; /** * 电话、邮件发送验证码 * @return com.alibaba.cola.dto.Response * @author joe wan * @date 2022/6/29 17:20 */ @Override public Response sendAuthCode(AuthCodeDTO authCodeDTO){ try{ //生成一个6位验证码 String authCode = StringUtils.left(String.valueOf(((Math.random() * 9 + 1) * 100000)), 6); Boolean sendResult = commonInformService.sendMessage(AUTH_CODE_MESSAGE_TEMPLATE, getMessage(authCode, authCodeDTO)); if (Boolean.TRUE.equals(sendResult)) { redisTemplate.opsForValue().set(AUTH_CODE_CACHE_KEY + authCodeDTO.getEmail(), authCode, 5, TimeUnit.MINUTES); return Response.buildSuccess(); } else { return Response.buildFailure("500", "send auth code fail"); } } catch (Exception e){ log.error("auth code message: {}", authCodeDTO); log.error("fail message: {}", e.getMessage(), e); return Response.buildFailure("500","send auth code fail"); } } private AbstractBaseInformMessage getMessage(String authCode, AuthCodeDTO authCodeDTO) { if (StringUtils.isNotBlank(authCodeDTO.getEmail())) { log.info("email auth code"); EmailInformMessage emailInformMessage = new EmailInformMessage(); Map params = new HashMap<>(1); params.put("\\{MSR_AUTH_CODE}", String.valueOf(authCode)); emailInformMessage.setContentParams(params); emailInformMessage.setAddressees(Collections.singletonList(authCodeDTO.getEmail())); return emailInformMessage; } else { log.info("sms auth code"); SmsInformMessage smsInformMessage = new SmsInformMessage(); Map params = new HashMap<>(1); params.put("MSRcode", String.valueOf(authCode)); smsInformMessage.setContentParams(params); smsInformMessage.setAddressees(Collections.singletonList(authCodeDTO.getPhoneNum())); return smsInformMessage; } } /** * 电话、邮件验证码check * @return com.inspur.customer.object.user.authcode.AuthCodeCheckResponse * @author joe wan * @date 2022/6/30 17:56 */ @Override public AuthCodeCheckResponse checkAuthCode(AuthCodeCheckDTO authCodeCheckDTO){ AuthCodeCheckResponse result = new AuthCodeCheckResponse(); if (StringUtils.isNotBlank(authCodeCheckDTO.getPhoneNumAuthCode())) { String authcodePhone = redisTemplate.opsForValue().get(AUTH_CODE_CACHE_KEY + authCodeCheckDTO.getPhoneNum()); if (authCodeCheckDTO.getPhoneNumAuthCode().equals(authcodePhone)) { result.setCheckPhoneNum(true); } } if (StringUtils.isNotBlank(authCodeCheckDTO.getEmailAuthCode())) { String authcodeEmail = redisTemplate.opsForValue().get(AUTH_CODE_CACHE_KEY + authCodeCheckDTO.getEmail()); if (authCodeCheckDTO.getEmailAuthCode().equals(authcodeEmail)) { result.setCheckEmail(true); } } return result; } }