yshop阿里云短信验证码接入

项目需要使用验证码的方式实现登录或者注册,想起之前yshop项目也用过阿里云的短信验证码,在此记录下如何接入项目。

xml 复制代码
		<!--引入aliyun依赖-->
		<dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.4.1</version>
        </dependency>
java 复制代码
@Data
public class VerityParam {
    @NotBlank(message = "手机号必填")
    private String phone;
	//验证码登录/注册
    private String type;
}
java 复制代码
	/**
     * 阿里云短信验证码
     * @param param
     * @return
     */
    @AnonymousAccess
    @PostMapping("/register/verify")
    @ApiOperation(value = "短信验证码发送", notes = "短信验证码发送")
    public ApiResult<String> verify(@Validated @RequestBody VerityParam param) {
    	//查询手机号记录是否存在
        YxUser yxUser = userService.getOne(Wrappers.<YxUser>lambdaQuery()
                .eq(YxUser::getPhone,param.getPhone()),false);
        //手机号存在且为注册操作
        if (SmsTypeEnum.REGISTER.getValue().equals(param.getType()) && ObjectUtil.isNotNull(yxUser)) {
            return ApiResult.fail("手机号已注册");
        }
        //手机号不存在且为登录操作
        if (SmsTypeEnum.LOGIN.getValue().equals(param.getType()) && ObjectUtil.isNull(yxUser)) {
            return ApiResult.fail("账号不存在");
        }
        
        String codeKey = "code_" + param.getPhone();
        
        //6位数随机验证码
        String code = RandomUtil.randomNumbers(ShopConstants.YSHOP_SMS_SIZE);

        //多租户系统确认租户
        String tenantId = TenantContextHandler.getTenantId();
        //使用redis存储验证码
        redisUtil.set(tenantId + ":" + codeKey, code, ShopConstants.YSHOP_SMS_REDIS_TIME);

        //发送阿里云短信
        JSONObject json = new JSONObject();
        json.put("code",code);
        try {
            SmsUtils.sendSms(param.getPhone(),json.toJSONString());
        } catch (ClientException e) {
            redisUtil.del(codeKey);
            e.printStackTrace();
            return ApiResult.ok("发送失败:"+e.getErrMsg());
       }
        return ApiResult.ok("发送成功,请注意查收");
    }
java 复制代码
@Slf4j
@Configuration
public class SmsUtils {

    private static RedisUtils redisUtils;

    @Autowired
    public SmsUtils(RedisUtils redisUtils){
        SmsUtils.redisUtils = redisUtils;
    }
	/**
     * 发送短信
     * @param phoneNumbers 手机号
     * @param templateParam 短信模板变量对应的实际值,JSON格式
     * accessKeyId、secret、sign(SignName)需要自行设置
     */
    public static void sendSms(String phoneNumbers, String templateParam) throws ClientException {
    	//租户
        String tenantId = TenantContextHandler.getTenantId();
        //根据租户从redis中取相应的值
        String regionId = redisUtils.getY(tenantId + ":" +"sms_region");
        String accessKeyId = redisUtils.getY(tenantId + ":" + "sms_access_key");
        String accessKeySecret = redisUtils.getY(tenantId + ":" +"sms_access_secret");
        String sign = redisUtils.getY(tenantId + ":" +"sms_sign");
        String templateId = redisUtils.getY(tenantId + ":"+ "sms_templateId");
        //链接阿里云
        DefaultProfile profile = DefaultProfile.getProfile(
                regionId,
                accessKeyId,
                accessKeySecret);
        //构建成客户端
        IAcsClient client = new DefaultAcsClient(profile);
		//构建请求
        CommonRequest request = new CommonRequest();

        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        //区域
        request.putQueryParameter("RegionId", regionId);
        //手机号码
        request.putQueryParameter("PhoneNumbers", phoneNumbers);
        //签名名称
        request.putQueryParameter("SignName", sign);
        //模板的code
        request.putQueryParameter("TemplateCode", templateId);
        //构建一个短信验证码
        request.putQueryParameter("TemplateParam", templateParam);
        //向阿里云请求发送验证码
        CommonResponse response = client.getCommonResponse(request);
        System.out.println(response.getData());
    }
}
java 复制代码
	/**
     * 验证码登陆
     *
     * @param loginParam
     * @return
     */
    @AnonymousAccess
    @PostMapping(value = "/login/captcha")
    public ApiResult logincaptcha(@Validated @RequestBody HLoginParam loginParam) {
    
        //去请求原有的逻辑获取用户信息
        ApiResult<YxUser> yxUserApiResult = remoteMemberUserService.HLogin(loginParam);
		//用户不存在
        if (yxUserApiResult.getStatus() != 200) {
            throw new YshopException(yxUserApiResult.getMsg());
        }
        System.out.println(loginParam);
		//租户
        String tenantId = TenantContextHandler.getTenantId();
        //查询redis中是否有验证码记录
        Object codeObj = redisUtil.get(tenantId + ":" + "code_" + loginParam.getUsername());
        if (codeObj == null) {
            return ApiResult.fail("请先获取验证码");
        }
        String code = codeObj.toString();
        //比对redis中和输入的验证码
        if (!StrUtil.equals(code, loginParam.getPassword())) {
            return ApiResult.fail("验证码错误");
        }

        return getCaptchaMapApiResult(yxUserApiResult,loginParam.getPassword());

    }
相关推荐
米粉030512 分钟前
深入剖析Nginx:从入门到高并发架构实战
java·运维·nginx·架构
简诚15 分钟前
HttpURLConnection实现
java
呼拉拉呼拉23 分钟前
Redis故障转移
数据库·redis·缓存·高可用架构
什么都想学的阿超26 分钟前
【Redis系列 04】Redis高可用架构实战:主从复制与哨兵模式从零到生产
数据库·redis·架构
tuan_zhang34 分钟前
第七章:未名湖畔的樱花网关
程序人生·云计算
weixin_4180076039 分钟前
MQTTX连接阿里云的物联网配置
物联网·阿里云·云计算
androidwork1 小时前
Android LinearLayout、FrameLayout、RelativeLayout、ConstraintLayout大混战
android·java·kotlin·androidx
陈小桔1 小时前
限流算法java实现
java
黑客老李1 小时前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
BOB-wangbaohai1 小时前
阿里云ACP云计算备考笔记 (4)——企业应用服务
阿里云·云计算·云监控·云解析·云cdn·sls日志服务