手机邮箱注册技术分析及运用-如何用邮箱注册账号,请参考以下文章:
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-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 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 data = (HashMap) result.get("data");
Set 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 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 data = (HashMap) result.get("data");
Set 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 findAll() throws Exception;
public ItripUser findByUsername(String username) throws Exception;
public Set findRoles(String username);
public Set 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 findAll() throws Exception {
return itripUserMapper.getItripUserListByMap(null);
}
/**
* 根据用户名查找用户
* @param username
* @return
* @throws Exception
*/
public ItripUser findByUsername(String username) throws Exception {
Map param=new HashMap();
param.put("userCode", username);
List list= itripUserMapper.getItripUserListByMap(param);
if(list.size()>0)
return list.get(0);
else
return null;
}
public Set findRoles(String username) {
// TODO Auto-generated method stub
return null;
}
public Set 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的方法