手机注册
- 服务商
- 阿里云短信
- 腾讯云短信
- 百度云SMS
- 容联云通讯
- 接入步骤
- 注册开发者账号
- 创建应用
- 对接测试
- 上线运营
- 接入步骤图
以下为容联云通讯的写法
注册开发者账号
- 注册即可免费开发测试,无需认证充值,但无法上线
- 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","测试"} |
上线运营
- 完成个人或企业认证后应用即可自动上线,无需修改程序代码
- 提交认证
- 进入控制台-账号-账号信息-认证信息,按照页面提示操作即可
- 流程图
详细步骤
- 发送短信验证码
- dao已完成
- service:创建用户,生成验证码(1111-9999),发送验证码,缓存验证码到redis
- controller:调用service的方法
- 验证短信验证码
- dao已完成
- service:比对验证码,更新用户状态
- 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的使用)
- 上线运营