- 实现手机注册的流程图:
客户端向应用服务器发出手机注册申请,在应用服务器生成短信验证码,通过短信服务商将短信发送到手机,并且回调通知给应用程序。 - 接入步骤
1)注册开发者账号
注册账号网址:www.yuntongxun.com/user/reg/init
短信验证码模板:
免费开发模板为1,形式为:【云通讯】你使用的是云通讯短信模板,你的验证码是{1},请于对{2}分钟内正确输入。
2)创建应用
3)对接测试
4)上线运营 - 下载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 - 发送模板短信接口
public HashMap sendTemplateSMS(String to,String templateId,String[] datas)
参数名称 | 说明 |
---|---|
to | 短信接收手机号码集合,用英文逗号分开,最多一次发送200个 |
templateId | 模板id,如使用测试模板,id为1,如使用自己创建的模板,则使用自己创建的短信模板id |
datas | 字符串数组,如模板中有两个占位符,定义方式为new String[]{“3456”,“2”} |
- 实现手机注册
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 user,
@RequestParam String code){
try {
if(userService.validatePhone(user,code)){
return DtoUtil.returnSuccess("验证成功");
}else{
return DtoUtil.returnSuccess("验证失败");
}
} catch (Exception e) {
e.printStackTrace();
return DtoUtil.returnFail("验证失败", ErrorCode.AUTH_ACTIVATE_FAILED);
}
}