阿里云短信服务介绍:
java代码:
pom.xml
<!--阿里短信通知-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
短信工具类:
public class SMSUtils {
public static final String VALIDATE_CODE = "SMS_159620392"; //发送短信验证码
public static final String ORDER_NOTICE = "SMS_159771588"; //体检预约成功通知
/**
* 发送短信
*/
public static void sendShortMessage(String templateCode,String phoneNumbers,String param){
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout","10000");
System.setProperty("sun.net.client.defaultReadTimeout","10000");
//初始化ascClient需要的几个参数
final String product = "Dysmsapi"; //短信API产品名固定,无需修改
final String domain = "dysmsapi.aliyuncs.com"; //短信API产品域名(接口地址固定,无需修改)
//替换成你的AK
final String accessKeyId = ""; //你的accessKeyId
final String accessKeySecret = ""; //同上
//初始化ascClient,暂时不支持多region(请勿修改)
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",accessKeyId,accessKeySecret);
DefaultProfile.addEndpoint("cnhangzhou","cn-hangzhou",product,domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
SendSmsRequest request = new SendSmsRequest();
//使用post提交
request.setMethod(MethodType.POST);
//必填:待发送的手机号。
request.setPhoneNumbers(phoneNumbers);
//必填,短信签名
request.setSignName("xuyu");
//必填:短信模板
request.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为“亲爱的#{name},您的验证码为#{code}时”,此处的值为
//如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如\r\n在JSON中需要表示为\\r\\n
request.setTemplateParam("{\"code\":\""+param+"\"}");
//可选:上行短信扩展码
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执信息中将此值带回给调用者
//request.setOutId("yourOutId");
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode() != null&&sendSmsResponse.getCode().equals("OK")){
//请求完成
System.out.println("请求成功");
}
}
}
生成随机验证码:
public class ValidateCodeUtils {
/**
* 随机生成验证码
* @param length 长度为4或者6
*/
public static Integer generateValidateCode(int length){
Integer code = null;
if(length == 4){
code = new Random().nextInt(9999);
if(code < 1000){
code = code + 1000; //保证数字为4位
}
}else if(length == 6){
code = new Random().nextInt(999999);
if(code < 100000){
code = code + 100000; //保证数字为4位
}
}else{
throw new RuntimeException("只能生成4位或6位数字验证码");
}
return code;
}
/**
* 随机生成指定长度字符串验证码
*/
public static String generateValidateCode4String(int length){
Random rdm = new Random();
String hash1 = Integer.toHexString(rdm.nextInt());
String capstr = hash1.substring(0, length);
return capstr;
}
}
设置Redis保存数据的唯一性
public class RedisMessageConstant {
public static final String SENDTYPE_ORDER = "001"; //用于缓存体见预约时发送的验证码
public static final String SENDTYPE_LOGIN = "002"; //用于缓存手机号快速登录时发送的验证码
public static final String SENDTYPE_GETPWD = "003"; //用于缓存找回密码时发送的验证码
}
发送验证码:
/**
* 发送验证码
*/
@RestController
@RequestMapping("/send")
public class validateCodeController {
@Autowired
private JedisPool jedisPool;
//用户在线预约发送验证码
@RequestMapping("/send4Order")
public Result send4Order(String telephone){
//随机生成4位数字验证码
Integer validateCode = ValidateCodeUtils.generateValidateCode(4);
//给用户发送验证码
try{
SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,validateCode.toString());
}catch (Exception e){
e.printStackTrace();
return new Result(false, MessageConstant.OPER_FAILD);
}
//将验证码保存到Redis,存活时间5min,保证消息唯一的
jedisPool.getResource().setex(telephone+ RedisMessageConstant.SENDTYPE_ORDER,300,validateCode);
return new Result(true,MessageConstant.OPER_SUCCESS);
}
//用户登录发送验证码
@RequestMapping("/send4Login")
public Result send4Login(String telephone){
//随机生成6位数字验证码
Integer validateCode = ValidateCodeUtils.generateValidateCode(6);
//给用户发送验证码
try{
SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,validateCode.toString());
}catch (Exception e){
e.printStackTrace();
return new Result(false, MessageConstant.OPER_FAILD);
}
//将验证码保存到Redis,存活时间5min,保证消息唯一的
jedisPool.getResource().setex(telephone+ RedisMessageConstant.SENDTYPE_LOGIN,300,validateCode);
return new Result(true,MessageConstant.OPER_SUCCESS);
}
}
验证验证码并处理:
@RestController
@RequestMapping("/order")
public class OrderControler {
@Autowired
private JedisPool jedisPool;
@Reference
private OrderService orderService;
@RequestMapping("/submit")
public Result submit(@RequestBody Map map){
String telephone = (String) map.get("telephone");
//从Redis中获取保存的验证码
String validateCodeInRedis = jedisPool.getResource().get(telephone+ RedisMessageConstant.SENDTYPE_ORDER);
String validateCode = (String)map.get("validateCode");
//将用户输入的验证码和Redis中保存的验证码进行比对
if(validateCodeInRedis != null && validateCode != null && validateCode.equals(validateCodeInRedis)){
//如果比对成功,调用服务完成预约业务处理
map.put("orderType", Order.ORDERTYPE_WEINXIN); //设置预约类型:微信,电话
Result result = orderService.order(map); //通过Dubbo远程调用服务实现在线预约业务处理
if(result.isFlag()){
//
SMSUtils.sendShortMessage(SMSUtils.ORDER_NOTICE,telephone,(String)map.get("orderDate"));
}
return result;
}else {
//如果比对不成功,返回结果给页面
return new Result(false, MessageConstant.CODE_FAILD);
}
}
}
/**
* 会员相关操作
*/
@RestController
@RequestMapping("/member")
public class MemberController {
@Autowired
private JedisPool jedisPool;
@Autowired
private MemberService memberService;
//手机号快速登录
@RequestMapping("/login")
public Result login(HttpServletResponse response, @RequestBody Map map){
String telephone = (String)map.get("telephone");
String validateCode = (String) map.get("validateCode");
//从Redis中获取保存的验证码
String validateCodeRedis = jedisPool.getResource().get(telephone+ RedisMessageConstant.SENDTYPE_LOGIN);
if(validateCode != null && validateCodeRedis != null &&validateCode.equals(validateCodeRedis)){
//验证码输入正确
//判断当前用户是否是会员
Member member = memberService.findByTelephone(telephone);
if(member == null){
//不是会员,自动注册
Member m = new Member();
m.setName("sss");
m.setTelephone("123456");
memberService.add(m);
//向客户端浏览器写入Cookie,内容为手机号(为了跟踪用户,以后登录都会带着cookie过来,我们只需检查cookie并取出手机号)
Cookie cookie = new Cookie("member_telephone",telephone);
cookie.setPath("/");
cookie.setMaxAge(60*60*24*30); //有效期30天
response.addCookie(cookie);
//保存会员信息到Redis中
String json = JSON.toJSON(m).toString();
jedisPool.getResource().setex(telephone,30*60,json);
}
}else{
return new Result(false, MessageConstant.CODE_FAILD);
}
return new Result(true,MessageConstant.OPER_SUCCESS);
}
}