基于阿里云的java短信预约及登录功能实现

阿里云短信服务介绍:

java代码:

pom.xml
        <!--阿里短信通知-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.0.0</version>
        </dependency>
短信工具类:
public class SMSUtils {
    public static final String VALIDATE_CODE = "SMS_159620392";  //发送短信验证码
    public static final String ORDER_NOTICE = "SMS_159771588";  //体检预约成功通知

    /**
     * 发送短信
     */
    public static void sendShortMessage(String templateCode,String phoneNumbers,String param){
        //设置超时时间-可自行调整
        System.setProperty("sun.net.client.defaultConnectTimeout","10000");
        System.setProperty("sun.net.client.defaultReadTimeout","10000");
        //初始化ascClient需要的几个参数
        final String product = "Dysmsapi"; //短信API产品名固定,无需修改
        final String domain = "dysmsapi.aliyuncs.com";  //短信API产品域名(接口地址固定,无需修改)
        //替换成你的AK
        final String accessKeyId = "";  //你的accessKeyId
        final String accessKeySecret = "";  //同上
        //初始化ascClient,暂时不支持多region(请勿修改)
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",accessKeyId,accessKeySecret);
        DefaultProfile.addEndpoint("cnhangzhou","cn-hangzhou",product,domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        //组装请求对象
        SendSmsRequest request = new SendSmsRequest();
        //使用post提交
        request.setMethod(MethodType.POST);
        //必填:待发送的手机号。
        request.setPhoneNumbers(phoneNumbers);
        //必填,短信签名
        request.setSignName("xuyu");
        //必填:短信模板
        request.setTemplateCode(templateCode);
        //可选:模板中的变量替换JSON串,如模板内容为“亲爱的#{name},您的验证码为#{code}时”,此处的值为
        //如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如\r\n在JSON中需要表示为\\r\\n
        request.setTemplateParam("{\"code\":\""+param+"\"}");
        //可选:上行短信扩展码
        //request.setSmsUpExtendCode("90997");
        //可选:outId为提供给业务方扩展字段,最终在短信回执信息中将此值带回给调用者
        //request.setOutId("yourOutId");
        //请求失败这里会抛ClientException异常
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        if(sendSmsResponse.getCode() != null&&sendSmsResponse.getCode().equals("OK")){
            //请求完成
            System.out.println("请求成功");
        }
    }
}
生成随机验证码:
public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     * @param length 长度为4或者6
     */
    public static Integer generateValidateCode(int length){
        Integer code = null;
        if(length == 4){
            code = new Random().nextInt(9999);
            if(code < 1000){
                code = code + 1000;  //保证数字为4位
            }
        }else if(length == 6){
            code = new Random().nextInt(999999);
            if(code < 100000){
                code = code + 100000;  //保证数字为4位
            }
        }else{
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     */
    public static String generateValidateCode4String(int length){
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}
设置Redis保存数据的唯一性

public class RedisMessageConstant {
    public static final String SENDTYPE_ORDER = "001"; //用于缓存体见预约时发送的验证码
    public static final String SENDTYPE_LOGIN = "002";  //用于缓存手机号快速登录时发送的验证码
    public static final String SENDTYPE_GETPWD = "003";  //用于缓存找回密码时发送的验证码
}
发送验证码:
/**
 * 发送验证码 
 */
@RestController
@RequestMapping("/send")
public class validateCodeController {

    @Autowired
    private JedisPool jedisPool;

    //用户在线预约发送验证码
    @RequestMapping("/send4Order")
    public Result send4Order(String telephone){
        //随机生成4位数字验证码
        Integer validateCode = ValidateCodeUtils.generateValidateCode(4);
        //给用户发送验证码
        try{
            SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,validateCode.toString());
        }catch (Exception e){
            e.printStackTrace();
            return new Result(false, MessageConstant.OPER_FAILD);
        }
        //将验证码保存到Redis,存活时间5min,保证消息唯一的
        jedisPool.getResource().setex(telephone+ RedisMessageConstant.SENDTYPE_ORDER,300,validateCode);
        return new Result(true,MessageConstant.OPER_SUCCESS);
    }

    //用户登录发送验证码
    @RequestMapping("/send4Login")
    public Result send4Login(String telephone){
        //随机生成6位数字验证码
        Integer validateCode = ValidateCodeUtils.generateValidateCode(6);
        //给用户发送验证码
        try{
            SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,validateCode.toString());
        }catch (Exception e){
            e.printStackTrace();
            return new Result(false, MessageConstant.OPER_FAILD);
        }
        //将验证码保存到Redis,存活时间5min,保证消息唯一的
        jedisPool.getResource().setex(telephone+ RedisMessageConstant.SENDTYPE_LOGIN,300,validateCode);
        return new Result(true,MessageConstant.OPER_SUCCESS);
    }
}
验证验证码并处理:
@RestController
@RequestMapping("/order")
public class OrderControler {

    @Autowired
    private JedisPool jedisPool;

    @Reference
    private OrderService orderService;

    @RequestMapping("/submit")
    public Result submit(@RequestBody Map map){
        String telephone = (String) map.get("telephone");
        //从Redis中获取保存的验证码
        String validateCodeInRedis = jedisPool.getResource().get(telephone+ RedisMessageConstant.SENDTYPE_ORDER);
        String validateCode = (String)map.get("validateCode");
        //将用户输入的验证码和Redis中保存的验证码进行比对
        if(validateCodeInRedis != null && validateCode != null && validateCode.equals(validateCodeInRedis)){
            //如果比对成功,调用服务完成预约业务处理
            map.put("orderType", Order.ORDERTYPE_WEINXIN);  //设置预约类型:微信,电话
            Result result = orderService.order(map);  //通过Dubbo远程调用服务实现在线预约业务处理
            if(result.isFlag()){
                //
                SMSUtils.sendShortMessage(SMSUtils.ORDER_NOTICE,telephone,(String)map.get("orderDate"));
            }
            return result;
        }else {
            //如果比对不成功,返回结果给页面
            return new Result(false, MessageConstant.CODE_FAILD);
        }
    }
}
/**
 * 会员相关操作
 */
@RestController
@RequestMapping("/member")
public class MemberController {

    @Autowired
    private JedisPool jedisPool;

    @Autowired
    private MemberService memberService;

    //手机号快速登录
    @RequestMapping("/login")
    public Result login(HttpServletResponse response, @RequestBody Map map){
        String telephone = (String)map.get("telephone");
        String validateCode = (String) map.get("validateCode");
        //从Redis中获取保存的验证码
        String validateCodeRedis = jedisPool.getResource().get(telephone+ RedisMessageConstant.SENDTYPE_LOGIN);
        if(validateCode != null && validateCodeRedis != null &&validateCode.equals(validateCodeRedis)){
            //验证码输入正确
            //判断当前用户是否是会员
            Member member = memberService.findByTelephone(telephone);
            if(member == null){
                //不是会员,自动注册
                Member m = new Member();
                m.setName("sss");
                m.setTelephone("123456");
                memberService.add(m);
                //向客户端浏览器写入Cookie,内容为手机号(为了跟踪用户,以后登录都会带着cookie过来,我们只需检查cookie并取出手机号)
                Cookie cookie = new Cookie("member_telephone",telephone);
                cookie.setPath("/");
                cookie.setMaxAge(60*60*24*30);  //有效期30天
                response.addCookie(cookie);
                //保存会员信息到Redis中
                String json = JSON.toJSON(m).toString();
                jedisPool.getResource().setex(telephone,30*60,json);
            }
        }else{
            return new Result(false, MessageConstant.CODE_FAILD);
        }
        return new Result(true,MessageConstant.OPER_SUCCESS);
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用阿里云发送,你需要进行以下步骤: 1. 注册阿里云账号,并开通服务。 2. 创建模板,并审核通过。 3. 获取 AccessKeyId 和 AccessKeySecret。 4. 导入阿里云 SDK。 5. 编写发送Java 代码。 以下是一个简单的 Java 代码示例,可以用于发送: ```java import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.sms.model.v20160927.SendSmsRequest; import com.aliyuncs.sms.model.v20160927.SendSmsResponse; public class AliyunSms { public static void main(String[] args) { String accessKeyId = "your_accessKeyId"; String accessKeySecret = "your_accessKeySecret"; // 设置超时时间和 regionId IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Sms", "sms.aliyuncs.com"); // 构造请求 SendSmsRequest request = new SendSmsRequest(); request.setPhoneNumbers("手机号码"); request.setSignName("签名"); request.setTemplateCode("模板ID"); request.setTemplateParam("{\"code\":\"12345\"}"); // 发送请求 IAcsClient client = new DefaultAcsClient(profile); try { SendSmsResponse response = client.getAcsResponse(request); System.out.println("发送成功!"); } catch (ServerException e) { e.printStackTrace(); System.out.println("发送失败!"); } catch (ClientException e) { e.printStackTrace(); System.out.println("发送失败!"); } } } ``` 其中,需要将 `your_accessKeyId` 和 `your_accessKeySecret` 替换为你自己的 AccessKeyId 和 AccessKeySecret,同时将 `手机号码`、`签名` 和 `模板ID` 替换为你自己创建的模板相关息。`{\"code\":\"12345\"}` 是模板中需要替换的内容,可以根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值