爱旅行项目中实现手机注册

时间:2019-02-21
本文章向大家介绍爱旅行项目中实现手机注册,主要包括爱旅行项目中实现手机注册使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  1. 实现手机注册的流程图:
    客户端向应用服务器发出手机注册申请,在应用服务器生成短信验证码,通过短信服务商将短信发送到手机,并且回调通知给应用程序。
  2. 接入步骤
    1)注册开发者账号
    注册账号网址:www.yuntongxun.com/user/reg/init
    短信验证码模板:
    免费开发模板为1,形式为:【云通讯】你使用的是云通讯短信模板,你的验证码是{1},请于对{2}分钟内正确输入。
    2)创建应用
    3)对接测试
    4)上线运营
  3. 下载SDK 和DEMO
    下载网址:
    www.yuntongxun.com/doc/images/CCP_REST_SMS_DEMO_JAVA_v2.6r.zip
    开发文档:
    www.yuntongxun.com/doc/rest/sms/3_2_2_3.html
  4. 发送模板短信接口
public HashMap sendTemplateSMS(String to,String templateId,String[] datas)
参数名称 说明
to 短信接收手机号码集合,用英文逗号分开,最多一次发送200个
templateId 模板id,如使用测试模板,id为1,如使用自己创建的模板,则使用自己创建的短信模板id
datas 字符串数组,如模板中有两个占位符,定义方式为new String[]{“3456”,“2”}
  1. 实现手机注册
    a. 在itrip-auth项目的pom.xml文件中添加依赖
    该依赖来源:容联云官网下载
<dependency>
            <groupId>cn.itrip.ccprestsms</groupId>
            <artifactId>itrip-ccprestsms</artifactId>
            <version>1.0</version>
 </dependency>

b. 配置属性文件sms.properties

c. 在SmsService.java中添加短信发送接口

    /**
     * 发送短信
     * @param to 是要发送的手机号码,可以用逗号分隔,一次最多支持100个手机号
     * @param templateId 是模板ID,在【云通讯】平台上创建的短信模板的ID值;测试的时候可以使用系统的默认模板,id为1
     * @param datas 替换模板"您的验证码是{1},请于{2}分钟内正确输入"中的内容
     * @throws Exception
     */
    public void send(String to,String templateId,String[] datas) throws Exception;

d. 在SmsServiceImpl.java中实现以上短信发送

 public void send(String to, String templateId, String[] datas) throws Exception {
        HashMap<String,Object> result = null;
        //初始化SDK
        CCPRestSmsSDK restAPI=new CCPRestSmsSDK();
        //初始化服务器地址和端口
        restAPI.init(systemConfig.getSmsServerIP(), systemConfig.getSmsServerPort());
        //初始化主帐号和主帐号令牌,对应官网开发者主账号下的ACCOUNT SID和AUTH TOKEN
        restAPI.setAccount(systemConfig.getSmsAccountSid(),systemConfig.getSmsAuthToken());
        //初始化应用ID
        restAPI.setAppId(systemConfig.getSmsAppID());

        //调用发送模板短信的接口发送短信   to:是要发送的手机号码 ;templateId:是模板ID;datas:要替换的内容数组。
        result = restAPI.sendTemplateSMS(to,templateId,datas);
        System.out.println("SDKTestGetSubAccounts result=" + result);

        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"));
            //logger.error("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));
            throw new Exception("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));
        }
    }

e. 在UserService.java中添加接口

 /**
     * 使用手机号创建用户账号
     * @param user
     * @throws Exception
     */
    public void itriptxCreateUserByPhone(ItripUser user) throws Exception;

f.在UserServiceImpl.java中实现手机号创建用户账号

public void itriptxCreateUserByPhone(ItripUser user) throws Exception {
        //生成验证码
        String code = String.valueOf(MD5.getRandomCode());
        //发送验证码
        smsService.send(user.getUserCode(),"1",new String[]{code,"1"});
        //缓存验证码到Redis
        redisAPI.set("activition:"+user.getUserCode(),2*60,code);
        //保存用户信息
        itripUserMapper.insertItripUser(user);
    }

g. UserController.java

@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);
        }

        //vo对象转换成pojo
        ItripUser user=new ItripUser();
        user.setUserCode(userVO.getUserCode());
        user.setUserPassword(userVO.getUserPassword());
        user.setUserType(0);  //用户类型(标识:0 自注册用户 1 微信登录 2 QQ登录 3 微博登录)
        user.setUserName(userVO.getUserName());
        try {
            if(null==userService.findByUsername(user.getUserCode())){
                user.setUserPassword(MD5.getMd5(user.getUserPassword(), 32));
                userService.itriptxCreateUserByPhone(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);
        }
    }

/**
     * 验证是否合法的手机号
     * @param phone
     * @return
     */
    private boolean validPhone(String phone) {
        String regex="^1[3578]{1}\\d{9}$";
        return Pattern.compile(regex).matcher(phone).find();
    }

h.接下需要完成验证,修改UserService.java

/**
     * 短信验证手机号
     * @param phoneNumber
     * @return
     * @throws Exception
     */
    public boolean validatePhone(String phoneNumber,String code) throws Exception;

i. 实现短信验证接口

public boolean validatePhone(String phoneNumber, String code) throws Exception {
        String key = "activition:"+phoneNumber;
        if(redisAPI.exist(key)){
            if(redisAPI.get(key).equals(code)){
                ItripUser user = this.findByUsername(phoneNumber);
                if(EmptyUtils.isNotEmpty(user)){
                    user.setActivated(1);//激活用户
                    user.setFlatID(user.getId());
                    itripUserMapper.updateItripUser(user);
                    return true;
                }
            }
        }
        return false;
    }

j.修改UserController.java

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