用户注册之手机注册

手机注册

  • 服务商
    • 阿里云短信
    • 腾讯云短信
    • 百度云SMS
    • 容联云通讯
  • 接入步骤
    1. 注册开发者账号
    2. 创建应用
    3. 对接测试
    4. 上线运营
  • 接入步骤图

以下为容联云通讯的写法

注册开发者账号

  • 注册即可免费开发测试,无需认证充值,但无法上线
    • http://www.yuntongxun.com/user/reg/init
  • 短信验证码模板
    • 免费开发模板ID为1
    • 形式为
      • “【云通讯】您使用的是云通讯短信模块,您的验证码是{1},请于{2}分钟内正确输入。”
      • 其中{1}和{2}为短信模板的参数
  • 新增模板需认证、充值

创建应用

  • 注册完成系统即创建默认应用

 

  • 绑定测试号码(仅免费开发测试)
    • 控制台-管理-号码管理-测试号码

接口对接

  • SDK、DEMO下载
    • http://www.yuntongxun.com/doc/rest/sms/322_3.html
    • http://www.yuntongxun.com/doc/images/CCPRESTSMSDEMOJAVA_v2.6r.zip
  • 目录

  • 发送模板短信接口
    • 接口声明文件sdk\src\com\cloopen\rest\sdk\CCPRestSDK.java
    • 接口函数定义

public HashMap sendTemplateSMS(String to, String templateId, String[] datas)

  • 参数释义

参数名称

数据类型

说明

to

字符串

短信接收手机号码集合,用英文逗号分开,如 "13810001000, 最多一次发送200个

templateId

字符串

模板Id,如使用测试模板,模板id为"1"。如使用自己创建的模板,则使用自己创建的短信模板id

datas

字符串数组

内容数据,需定义成数组方式,如模板中有两个参数,定义方式为String{"3456","测试"}

上线运营

  • 完成个人或企业认证后应用即可自动上线,无需修改程序代码
  • 提交认证
    • 进入控制台-账号-账号信息-认证信息,按照页面提示操作即可
  • 流程图

详细步骤

  • 发送短信验证码
    1. dao已完成
    2. service:创建用户,生成验证码(1111-9999),发送验证码,缓存验证码到redis
    3. controller:调用service的方法
  • 验证短信验证码
    1. dao已完成
    2. service:比对验证码,更新用户状态
    3. controller:调用service的方法
  • userService中添加方法

void itriptxCreateByPhone(ItripUser user) throws Exception;
  • 实现itriptxCreateByPhone方法,用户注册成功信息,存进数据库为未激活状态,激活码通过smsService.send方法调用三方接口发送,并且存进Redis中

@Override
public void itriptxCreateByPhone(ItripUser user) throws Exception {
    // 添加用户信息
    itripUserMapper.insertItripUser(user);
    // 生成激活码
    String code = String.valueOf(MD5.getRandomCode());
    // 发送短信验证码
    smsService.send(user.getUserCode(), "1", new String[]{code, "2"});
    // 短信验证码存入redis
    redisAPI.set("activation:" + user.getUserCode(), code, 30 * 60);
}
  • 编写smsService

void send(String to, String templateId, String[] datas) throws Exception;
  • 实现send方法,对接三方接口,发送激活码


    @Override
    public void send(String to, String templateId, String[] datas) throws Exception {
        // 初始化sdk
        CCPRestSmsSDK sdk = new CCPRestSmsSDK();
        // 调用初始化方法
        sdk.init("app.cloopen.com", "8883");
        // 设置账户信息
        sdk.setAccount("自己的ACCOUNT SID", "自己的AUTH TOKEN");
        // 设置appid
        sdk.setAppId("自己的AppID");
        // 发送短信
        HashMap<String, Object> result = sdk.sendTemplateSMS(to, templateId, datas);
         //000000位发送成功
        if ("000000".equals(result.get("statusCode"))) {
            //正常返回输出data包体信息(map)
            HashMap<String, Object> data = (HashMap<String, Object>) result.get("data");
            Set<String> keySet = data.keySet();
            for (String key : keySet) {
                Object object = data.get(key);
                System.out.println(key + " = " + object);
            }
        } else {
            //异常返回输出错误码和错误信息
            System.out.println("错误码=" + result.get("statusCode") + " 错误信息= " + result.get("statusMsg"));
        }
    }
}
  • 编写activateByPhone方法

boolean activateByPhone(String phone, String code) throws Exception;
  • 实现activateByPhone方法,判断用户跟激活码是否正确,正确则修改数据库中用户的状态

@Override
public boolean activateByPhone(String phone, String code) throws Exception {
    String key = "activation:" + phone;
    if (redisAPI.exists(key))
        if (redisAPI.get(key).equals(code)) {
            ItripUser user = this.findByUsername(phone);
            if (EmptyUtils.isNotEmpty(user)) {
                user.setActivated(1);//激活用户
                user.setUserType(0);//自注册用户
                user.setFlatID(user.getId());
                itripUserMapper.updateItripUser(user);
                return true;
            }
        }
    return false;
}
  • 编写controller

  • 先用户注册是否合法以及是否存在,在调用service层存入数据库以及发送激活码

@RequestMapping(value = "/registerByPhone", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody
    Dto registerByPhone(@RequestBody ItripUserVO userVO) {
    if (!validPhone(userVO.getUserCode()))
        return DtoUtil.returnFail("请使用正确的手机号", ErrorCode.AUTH_ILLEGAL_USERCODE);
    try {
        ItripUser user = new ItripUser();
        user.setUserCode(userVO.getUserCode());
        if (null == userService.findByUsername(user.getUserCode())) {
            user.setUserName(userVO.getUserName());
            user.setUserType(0);
            user.setUserPassword(MD5.getMd5(user.getUserPassword(), 32));
            userService.itriptxCreateByPhone(user);
            return DtoUtil.returnSuccess();
        } else {
            return DtoUtil.returnFail("用户已存在,注册失败", ErrorCode.AUTH_USER_ALREADY_EXISTS);
        }
    } catch (Exception e) {
        e.printStackTrace();
        return DtoUtil.returnFail(e.getMessage(), ErrorCode.AUTH_UNKNOWN);
    }
}

调用service层判断激活码,不管成功与否,并且把结果返回给用户

@RequestMapping(value = "/activateByPhone", method = RequestMethod.PUT, produces = "application/json")
@ResponseBody
public Dto activateByPhone(@RequestParam String phone, @RequestParam String code) {
    try {
        if (userService.activateByPhone(phone, code)) {
            return DtoUtil.returnSuccess("激活成功");
        } else {
            return DtoUtil.returnSuccess("激活失败");
        }
    } catch (Exception e) {
        e.printStackTrace();
        return DtoUtil.returnFail("激活失败", ErrorCode.AUTH_ACTIVATE_FAILED);
    }
}


 

总结

  • JavaMail为企业级应用中的邮件服务提供了完整的解决方案
  • Spring对JavaMail提供了高级的抽象,提供了两个核心接口MailMessage和MailSender
  • 接入第三方手机短信服务
  • 注册开发者账号
  • 创建应用
  • 对接测试(SDK的使用)
  • 上线运营

猜你喜欢

转载自blog.csdn.net/GoldWashing/article/details/81697475
今日推荐