运用阿里云短信,进行注册流程

一、接收注册短信
1.userService

/**
     * 短信注册登录
     * @param phone
     * @throws ClientException
     * @throws JsonProcessingException
     */
    @Transactional
    public void message(String phone) throws  ClientException, JsonProcessingException{
        //根据手机号码查询用户信息
        List<User> record = this.userMapper.selectByExample(new UserExample(){{
            createCriteria().andPhoneEqualTo(phone);
        }});
        System.out.println("是否存在:"+record.size());
        if(record.size() == 0){
            //该手机号码未注册,发送登录短信
            this.messageService.register(phone);
        }else{
            //该手机号码已注册,发送注册短信
//            this.messageService.register(phone);
            throw new SimpleException("该手机号码已注册");
        }
    }

2.messageService

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.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import pedicure.exception.SimpleException;
import pedicure.module.Configuration;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public void register(String phone) throws ClientException, JsonProcessingException{
        String code = this.generateCode(phone);
        String template =Configuration.property(Configuration.ALIYUN_MESSAGE_REGISTER_TEMPLATE_CODE);
        this.aliyunSMS(phone,template,new HashMap(){{
            this.put("code",code);
        }});
    }

3.generateCode

public String generateCode(String phone){
        if(StringUtils.isBlank(phone)){
            throw  new SimpleException("未知的手机号码信息~~");
        }
        ValueOperations operations = this.redisTemplate.opsForValue();
        String key = String.format("%s:%s", Configuration.SYSTEM_MESSAGE_NAMESPACE,phone);

        //是否在短时间内以发送过验证码
        if(operations.get(key) != null){
            throw  new SimpleException("短信验证码获取频繁~~");
        }
        //生成短信验证码
        String code = String.valueOf(RandomUtils.nextInt(1000,10000));
        int active = 120;
        operations.set(key,code,active,TimeUnit.SECONDS);
        operations.set(key,code);
        return code;
    }

4.Configuration

public static String property(String key) {
        String value = null;
        try{
            if(PROPERTIES_FACTORY == null){
                ClassPathResource properties = new ClassPathResource("config/global.properties");
                if(!properties.exists()){
                    throw new SystemException("configuration [ classpath:config/global.properties ] file cannot be found");
                }
                PROPERTIES_FACTORY = new PropertiesFactoryBean();
                PROPERTIES_FACTORY.setFileEncoding("utf-8");
                PROPERTIES_FACTORY.setLocation(properties);
                PROPERTIES_FACTORY.afterPropertiesSet();
            }
            value = PROPERTIES_FACTORY.getObject().getProperty(key);
        }catch (IOException io){
            LOGGER.error(io.getMessage(),io);
        }
        if(StringUtils.isBlank(value)){
            throw new SystemException("configuration key [ "+key+" ] Non-existent");
        }
        return value;
    }

//public static final String ALIYUN_MESSAGE_REGISTER_TEMPLATE_CODE = "aliyun.message.registerTemplateCode";
//aliyun.message.registerTemplateCode=SMS_***

5.aliyunSMS

private void aliyunSMS(String phone,String template,Map param) throws  ClientException,JsonProcessingException{
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",Configuration.property(Configuration.ALIYUN_MESSAGE_ACCESS_KEY_ID), Configuration.property(Configuration.ALIYUN_MESSAGE_SECRET));
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", "dysmsapi.aliyuncs.com");
        IAcsClient acsClient = new DefaultAcsClient(profile);
        SendSmsRequest request = new SendSmsRequest();
        request.setPhoneNumbers(phone);
        request.setSignName(Configuration.property(Configuration.ALIYUN_MESSAGE_SIGN_NAME));
        request.setTemplateCode(template);
        request.setTemplateParam(this.mapper.writeValueAsString(param));
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        System.out.println(sendSmsResponse.getCode());
        String code = sendSmsResponse.getCode();
        switch (code) {
            case "OK":
                break;
            case "isv.MOBILE_NUMBER_ILLEGAL":
                throw new SimpleException("非法的手机号码 ~");
            case "isv.BUSINESS_LIMIT_CONTROL":
                throw new SimpleException("该号码发送频率已达上限,暂时无法服务 ~");
        }
    }
//public static final String ALIYUN_MESSAGE_ACCESS_KEY_ID = "aliyun.message.accessKeyId";
//aliyun.message.accessKeyId=***
// public static final String ALIYUN_MESSAGE_SECRET = "aliyun.message.secret";
//aliyun.message.secret=***
//public static final String ALIYUN_MESSAGE_SIGN_NAME = "aliyun.message.signName";
//aliyun.message.signName=

二、用户注册(使用redis数据库)
1.userService

@Transactional
    public User register(String phone,String code,String password){
        if (StringUtils.isBlank(phone)){
            throw new SimpleException("请输入手机号码");
        }
        if (StringUtils.isBlank(password)){
            throw new SimpleException("请输入密码");
        }
        String messageKey = String.format("%s:%s", Configuration.SYSTEM_MESSAGE_NAMESPACE,phone);
        String storageCode = (String) this.redisTemplate.opsForValue().get(messageKey);
        if (StringUtils.isBlank(code)){
            throw new SimpleException("无效的验证码,请重新获取~~");
        }
        if (!storageCode.equals(code)){
            throw new SimpleException("短信验证码不正确~~");
        }
        User user = new User().setPhone(phone).setNickname("手机用户"+phone).setHead(this.settingMapper.selectUserHead()).setSignature(this.settingMapper.selectUserSignature()).setSex(0).setGrade(1).setDelFlag(false).setCreateTime(new Date()).setUpdateTime(new Date());
        this.userMapper.insertSelective(user);
        Auth auth = new Auth().setUserId(user.getId()).setType(0).setDelFlag(false).setCreateTime(new Date()).setUpdateTime(new Date()).setCode(this.passwordDigest(user.getId(),password));
        this.authMapper.insertSelective(auth);
        Accountu accountu = new Accountu().setUserId(user.getId()).setAvaliable(new BigDecimal(0)).setEarning(new BigDecimal(0)).setDelFlag(false).setCreateTime(new Date()).setUpdateTime(new Date());
        this.accountuMapper.insertSelective(accountu);
        this.redisTemplate.delete(messageKey);//测试的时候建议及时删掉redis中的code,便于多次测试
        return user;
    }
//public static final String SYSTEM_MESSAGE_NAMESPACE = "pedicure:message";

欢迎大家补充

ps:这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值