手机邮箱注册技术分析及运用-网站如何发送验证码到手机注册账号

手机邮箱注册技术分析及运用-如何用邮箱注册账号,请参考以下文章:
https://blog.csdn.net/weixin_42828741/article/details/82625077

本文主要讲述如何使用手机注册账号~

目前了解到的服务商有以下几种:
阿里云短信
-腾讯云短信
-百度云SMS
-容联云通讯(本文介绍的是这种)

接入步骤(以容联云通讯为例测试)
1.注册开发者账号
注册即可免费开发测试,无需认证充值,但无法上线
http://www.yuntongxun.com/user/reg/init
短信验证码模板
免费开发模板ID为1
形式为
“【云通讯】您使用的是云通讯短信模块,您的验证码是{1},请于{2}分钟内正确输入。”
其中{1}和{2}为短信模板的参数,其他数据不能修改,如需自定义短信内容需认证、充值
这里写图片描述

2.创建应用
2-1注册完成系统即创建默认应用,成功后可以看到以下信息:
这里写图片描述
2-2绑定测试号码(仅免费开发测试)
控制台-管理-号码管理-测试号码

3.对接测试
3-1SDK、DEMO下载
http://www.yuntongxun.com/doc/rest/sms/3_2_2_3.html (参考网址,Demo分为PHP和Java)
http://www.yuntongxun.com/doc/images/CCP_REST_SMS_DEMO_JAVA_v2.6r.zip (下载包直接点击这个链接即可)

3-2目录说明:
目录说明

3-3发送模板短信接口
接口声明文件
sdk\src\com\cloopen\rest\sdk\CCPRestSDK.java

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

3-4接口函数定义
to: 字符串类型,短信接收手机号码集合,用英文逗号分开,如 “13810001000, 最多一次发送200个。
templateId: 字符串类型,模板Id,如使用测试模板,模板id为”1”,如使用自己创建的模板,则使用自己创建的短信模板id即可。
datas: 字符串数组类型,内容数据,需定义成数组方式,如模板中有两个参数,定义方式为String{“3456”,”测试”}。
接口调用示例:

import com.cloopen.rest.sdk.CCPRestSDK; 
 import com.cloopen.rest.sdk.CCPRestSDK.BodyType; 

public class SDKTestSendTemplateSMS {
     public static void main(String[] args) {
 HashMap<String, Object> result = null; 
 CCPRestSDK restAPI = new CCPRestSDK();
 restAPI.init("app.cloopen.com", "8883");
 // 初始化服务器地址和端口,生产环境配置成app.cloopen.com,端口是8883. 
 restAPI.setAccount("accountSid", "accountToken");
 // 初始化主账号名称和主账号令牌,登陆云通讯网站后,可在控制首页中看到开发者主账号ACCOUNT SID和主账号令牌AUTH TOKEN。
 restAPI.setAppId("AppId");
 // 请使用管理控制台中已创建应用的APPID。
 result = restAPI.sendTemplateSMS("号码1,号码2等","模板Id" ,new String[]{"模板内容1","模板内容2"});
 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"));
 }
 }
 }
 可参考demo中的接口调用文件:
 demo\src\com\cloopen\rest\demoSDKTestSendTemplateSMS.Java

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

手机注册流程

这里写图片描述

一、发送短信验证码
1.DAO 已完成
2.SERVICE 创建用户、生成验证码(1111-9999)、发送验证码、缓存验证码到Redis
3.CONTROLLER 调用SERVICE的方法
以下为参考代码:

service层:
1.SmsService.java

package service;

/**
 * 短信发送接口 
 * @author hduser
 *
 */
public interface SmsService {

    /**
     * 发送短信
     * @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;
}

2.SmsServiceImpl.java

package service;

import java.util.HashMap;
import java.util.Set;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import cn.itrip.common.SystemConfig;

import com.cloopen.rest.sdk.CCPRestSmsSDK;

@Service("smsService")
public class SmsServiceImpl implements SmsService {

    private Logger logger=Logger.getLogger(SmsServiceImpl.class);
    @Resource
    private SystemConfig systemConfig;
    @Override
    public void send(String to, String templateId, String[] datas) throws Exception {
        HashMap<String, Object> result = null;

        //初始化SDK
        CCPRestSmsSDK restAPI = new CCPRestSmsSDK();

        //******************************注释*********************************************
        //*初始化服务器地址和端口                                                       *
        //*沙盒环境(用于应用开发调试):restAPI.init("sandboxapp.cloopen.com", "8883");*
        //*生产环境(用户应用上线使用):restAPI.init("app.cloopen.com", "8883");       *
        //*******************************************************************************
        restAPI.init(systemConfig.getSmsServerIP(), systemConfig.getSmsServerPort());

        //******************************注释*********************************************
        //*初始化主帐号和主帐号令牌,对应官网开发者主账号下的ACCOUNT SID和AUTH TOKEN     *
        //*ACOUNT SID和AUTH TOKEN在登陆官网后,在“应用-管理控制台”中查看开发者主账号获取*
        //*参数顺序:第一个参数是ACOUNT SID,第二个参数是AUTH TOKEN。                   *
        //*******************************************************************************
        restAPI.setAccount(systemConfig.getSmsAccountSid(),systemConfig.getSmsAuthToken());


        //******************************注释*********************************************
        //*初始化应用ID                                                                 *
        //*测试开发可使用“测试Demo”的APP ID,正式上线需要使用自己创建的应用的App ID     *
        //*应用ID的获取:登陆官网,在“应用-应用列表”,点击应用名称,看应用详情获取APP ID*
        //*******************************************************************************
        restAPI.setAppId(systemConfig.getSmsAppID());


        //******************************注释****************************************************************
        //*调用发送模板短信的接口发送短信                                                                  *
        //*参数顺序说明:                                                                                  *
        //*第一个参数:是要发送的手机号码,可以用逗号分隔,一次最多支持100个手机号                          *
        //*第二个参数:是模板ID,在平台上创建的短信模板的ID值;测试的时候可以使用系统的默认模板,id为1。    *
        //*系统默认模板的内容为“【云通讯】您使用的是云通讯短信模板,您的验证码是{1},请于{2}分钟内正确输入”*
        //*第三个参数是要替换的内容数组。                                                                                                                             *
        //**************************************************************************************************

        //**************************************举例说明***********************************************************************
        //*假设您用测试Demo的APP ID,则需使用默认模板ID 1,发送手机号是13800000000,传入参数为6532和5,则调用方式为           *
        //*result = restAPI.sendTemplateSMS("13800000000","1" ,new String[]{"6532","5"});                                                                         *
        //*则13800000000手机号收到的短信内容是:【云通讯】您使用的是云通讯短信模板,您的验证码是6532,请于5分钟内正确输入     *
        //*********************************************************************************************************************
        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"));
        }

    }

}

3.

package cn.itrip.auth.service;

import java.util.List;
import java.util.Set;

import cn.itrip.beans.pojo.ItripUser;

/**
 * 用户管理接口
 * @author hduser
 *
 */
public interface UserService {

    public void itriptxCreateUser(ItripUser user) throws Exception;
    public void itripCreateUser(ItripUser user) throws Exception;
    public void updateUser(ItripUser user) throws Exception;

    public void deleteUser(Long userId) throws Exception;

    public void changePassword(Long userId, String newPassword) throws Exception;

    ItripUser findOne(Long userId) throws Exception;

    List<ItripUser> findAll() throws Exception;

    public ItripUser findByUsername(String username) throws Exception;

    public Set<String> findRoles(String username);

    public Set<String> findPermissions(String username);

    public ItripUser login(String name, String password) throws Exception;
    /**
     * 邮箱激活
     * @param email 用户注册油箱
     * @param code 激活码
     * @return 
     * @throws Exception 
     */
    public boolean activate(String email,String code) throws Exception;

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

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

4.

package cn.itrip.auth.service;


import cn.itrip.common.MD5;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import cn.itrip.auth.exception.UserLoginFailedException;
import cn.itrip.beans.pojo.ItripUser;
import cn.itrip.common.EmptyUtils;
import cn.itrip.common.RedisAPI;
import cn.itrip.dao.user.ItripUserMapper;

import java.util.*;

import javax.annotation.Resource;

/**
 * 用户管理接口的实现
 * @author hduser
 *
 */
@Service("useService")
public class UserServiceImpl implements UserService {

    private Logger logger=Logger.getLogger(UserServiceImpl.class);
    @Resource
    private ItripUserMapper itripUserMapper;
    @Resource
    private RedisAPI redisAPI;
    @Resource
    private MailService mailService;
    @Resource
    private SmsService smsService;
    private int expire=1;//过期时间(分钟)
    /**
     * 创建用户
     * @param user
     * @throws Exception 
     */
    public void itriptxCreateUser(ItripUser user) throws Exception { 
        //发送激活邮件
        String activationCode = MD5.getMd5(new Date().toLocaleString(), 32);
        mailService.sendActivationMail(user.getUserCode(), activationCode);
        //保存用户信息
        itripUserMapper.insertItripUser(user);
    }
    /**
     * 创建手机账号
     */
    @Override
    public void itriptxCreateUserByPhone(ItripUser user) throws Exception {     
        //发送短信验证码
        String code=String.valueOf(MD5.getRandomCode());        
        smsService.send(user.getUserCode(), "1", new String[]{code,String.valueOf(expire)});
        //缓存验证码
        String key="activation:"+user.getUserCode();
        redisAPI.set(key, expire*60, code); 
        //保存用户信息
        itripUserMapper.insertItripUser(user);
    }
    public void updateUser(ItripUser user) throws Exception {
        itripUserMapper.updateItripUser(user);
    }

    public void deleteUser(Long userId) throws Exception {
        itripUserMapper.deleteItripUserById(userId);
    }

    /**
     * 修改密码
     * @param userId
     * @param newPassword
     * @throws Exception 
     */
    public void changePassword(Long userId, String newPassword) throws Exception {
        ItripUser user =itripUserMapper.getItripUserById(userId);
        user.setUserPassword(newPassword);        
        itripUserMapper.updateItripUser(user);
    }

    public ItripUser findOne(Long userId) throws Exception {
        return itripUserMapper.getItripUserById(userId);
    }

    public List<ItripUser> findAll() throws Exception {
        return itripUserMapper.getItripUserListByMap(null);
    }

    /**
     * 根据用户名查找用户
     * @param username
     * @return
     * @throws Exception 
     */
    public ItripUser findByUsername(String username) throws Exception {
        Map<String, Object> param=new HashMap();
        param.put("userCode", username);
        List<ItripUser> list= itripUserMapper.getItripUserListByMap(param);
        if(list.size()>0)
            return list.get(0);
        else
            return null;
    }

    public Set<String> findRoles(String username) {
        // TODO Auto-generated method stub
        return null;
    }

    public Set<String> findPermissions(String username) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ItripUser login(String name, String password) throws Exception  {
        // TODO Auto-generated method stub
        ItripUser user=this.findByUsername(name);
        if(null!=user&&user.getUserPassword().equals(password))
        {
            if(user.getActivated()!=1){
                throw new UserLoginFailedException("用户未激活");
            }
            return user;
        }
        else
            return null;
    }

    /**
     * 激活邮箱用户
     */
    @Override
    public boolean activate(String email, String code) throws Exception {
        String key="activation:"+email;     
        if(redisAPI.exist(key))
            if(redisAPI.get(key).equals(code)){
                ItripUser user=this.findByUsername(email);
                if(EmptyUtils.isNotEmpty(user))
                {
                    logger.debug("激活用户"+email);
                    user.setActivated(1);//激活用户
                    user.setUserType(0);//自注册用户
                    user.setFlatID(user.getId());
                    itripUserMapper.updateItripUser(user);
                    return true;
                }
            }

        return false;
    }
    /**
     * 短信验证手机号
     * @throws Exception 
     */
    @Override
    public boolean validatePhone(String phoneNumber, String code) throws Exception {
        String key="activation:"+phoneNumber;
        if(redisAPI.exist(key))
            if(redisAPI.get(key).equals(code)){
                ItripUser user=this.findByUsername(phoneNumber);
                if(EmptyUtils.isNotEmpty(user))
                {
                    logger.debug("用户手机验证已通过:"+phoneNumber);
                    user.setActivated(1);//激活用户
                    user.setUserType(0);//自注册用户
                    user.setFlatID(user.getId());
                    itripUserMapper.updateItripUser(user);
                    return true;
                }
            }
        return false;
    }
    @Override
    public void itripCreateUser(ItripUser user) throws Exception {
        itripUserMapper.insertItripUser(user);
    }






}

二、验证短信验证码
1.DAO 已完成
2.SERVICE 比对验证码、更新用户激活状态
3.CONTROLLER 调用SERVICE的方法

猜你喜欢

转载自blog.csdn.net/weixin_42828741/article/details/82656308