前言
将短信验证码整合到自己的分布式微服务项目中,在注册新用户的时候,商品购买支付,充值等业务中调用短信验证。需要注意的几个点。不同的服务可能都需要调用短信验证码功能,因此,可以将短信验证的接口单独写在第三方服务中。其它服务只需要通过远程调用,便可以达到代码复用的效果。
1、短信验证的接口
这个需要购买阿里云的接口验证接口,免费的可以使用20来次,也可以低价购买更多的次数。
连接直达:阿里云 短信验证接口
2、如何使用
接口文档中有详细的说明
接口使用说明:短信验证接口使用说明
以下代码中的appcode
在你购买玩商品后,在商品详情页面,可以看到
public static void main(String[] args) {
String host = "https://dfsns.market.alicloudapi.com";
String path = "/data/send_sms";
String method = "POST";
String appcode = "你自己的AppCode";
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appcode);
//根据API的要求,定义相对应的Content-Type
headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
Map<String, String> querys = new HashMap<String, String>();
Map<String, String> bodys = new HashMap<String, String>();
bodys.put("content", "code:1234");
bodys.put("phone_number", "156*****140");
bodys.put("template_id", "CST_ptdie100");
try {
/**
* 重要提示如下:
* HttpUtils请从
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下载
*
* 相应的依赖请参照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
System.out.println(response.toString());
//获取response的body
//System.out.println(EntityUtils.toString(response.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
}
3、整合到项目中
将改接口的使用整合到第三方服务中,类似写一个接口。不再赘述
4、其它服务调用
其它服务调用之前需要注意的点:要开启服务远程调用功能。然后是远程调用的实现。之前有写过远程调用的具体实现,这里不在赘述。
4.1 发送验证码(验证码仿刷)
为了防止在短时间内重复多次发送验证码,可以使用redis用来设置一个可过期的key,key没有过期的情况下。不给调用远程服务中的发送验证码接口。
@ResponseBody
@GetMapping(value = "/sms/sendCode")
public R sendCode(@RequestParam("phone") String phone) {
//1、接口防刷
String redisCode = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);
if (!StringUtils.isEmpty(redisCode)) {
//活动存入redis的时间,用当前时间减去存入redis的时间,判断用户手机号是否在60s内发送验证码
long currentTime = Long.parseLong(redisCode.split("_")[1]);
if (System.currentTimeMillis() - currentTime < 60000) {
//60s内不能再发
return R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(),BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());
}
}
//2、验证码的再次效验 redis.存key-phone,value-code
int code = (int) ((Math.random() * 9 + 1) * 100000);
String codeNum = String.valueOf(code);
String redisStorage = codeNum + "_" + System.currentTimeMillis();
//存入redis,防止同一个手机号在60秒内再次发送验证码
stringRedisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX+phone,
redisStorage,10, TimeUnit.MINUTES);
thirdPartFeignService.sendCode(phone, codeNum);
return R.ok();
}
5、遇到的问题
1、要使用官方提供的HttpUtils
进行下载。
地址:HttpUtils官方提供地址下载
2、远程服务调用失败,jar包冲突问题。
3、如果传入的手机号为空,直接发送验证嘛,调用远程服务也会报错。
6、实现的效果
6.1 发送验证码界面
6.2 手机短信接收
6.3 查看redis中的存值情况
、