发表于: 2019-12-04 23:41:12
1 1128
今天完成的事:
1、根据第三方要求格式进行短信验证。
查看师兄日报发现没有直接使用第三方的接口方法,于是尝试一下。
首先添加以下依赖,使用Apache的CloseableHttpClient发送http请求。
public class HttpMsgMailTest {
private static Logger logger = Logger.getLogger(HttpMsgMailTest.class);
private JedisUtil jedisUtil = new JedisUtil();
public int telChecking(long tel) {
// 获取第三方要求格式的当前时间
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String date = df.format(new Date());
// 使用Base64编码(开发者主账号ACCOUNT SID + 冒号 + 时间戳)其中账户Id 根据url的验证级别对应主账户
String Authorization = "8a216da86eb206c4016ec07c7a390617:" + date;
// 请使用管理控制台中已创建应用的APPID
String appId = "8a216da86eb206c4016ec07c7aa0061e";
// 随机四位验证码,直接 String.valueOf() 会有小数,不是整数
int code = (int) ((Math.random() * 8999) + 1000);
// 将手机号为key,验证码为value,存储缓存,设置过期时间2分钟
String result = jedisUtil.setex(String.valueOf(tel),120,String.valueOf(code));
if("OK".equals(result)){
logger.info("手机号、验证码缓存成功");
}
// 使用MD5加密(账户Id + 账户授权令牌 + 时间戳)
// 其中账户Id和账户授权令牌根据url的验证级别对应主账户,toUpperCase()将字母转为大写字母
String SigParameter = DigestUtils.md5DigestAsHex(("8a216da86eb206c4016ec07c7a390617" +
"5c3d4e0c6b294c95981947821cb6f023" + date).getBytes()).toUpperCase();
// 业务URL格式:/2013-12-26/Accounts/{accountSid}/SMS/TemplateSMS?sig={SigParameter}
String URL = "https://app.cloopen.com:8883/2013-12-26/Accounts/8a216da86eb206c4016ec07c7a390617/SMS/TemplateSMS?sig=";
//获取头消息
HttpHeaders headers = new HttpHeaders();
//设置请求头信息
headers.add("Accept", "application/json;charset=utf-8");
headers.add("Content-Type", "application/json;charset=utf-8");
headers.add("Authorization", Base64.getEncoder().encodeToString(Authorization.getBytes()));
//设置请求体信息
JSONObject msg = new JSONObject();
// 短信接收端手机号码集合,用英文逗号分开,每批发送的手机号数量不得超过200个
msg.put("to", tel);
// 应用Id,官网控制台应用列表获取
msg.put("appId", appId);
// 模板Id,官网控制台模板列表获取,测试模板id是1
// 测试模板的内容是:【云通讯】您使用的是云通讯短信模板,您的验证码是{1},请于{2}分钟内正确输入
msg.put("templateId", "1");
// 内容数据外层节点,模板如果没有变量,此参数可不传
msg.put("datas", new String[]{'\t' + Integer.toString(code), '\t' + "2"});
//组装并发送
HttpEntity<JSONObject> request = new HttpEntity<>(msg, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity(
URL + SigParameter, request, String.class);
logger.info("响应为:"+response.getStatusCode()+'\n'+response.getBody());
logger.info(String.valueOf(response.getStatusCode())+'\n'+ SigParameter);
// 请求状态码,取值000000(成功),返回验证码
if (response.getStatusCode().is2xxSuccessful() && response.getBody().contains("000000")) {
return code;
} else {
logger.info("验证码发送失败");
return 0;
}
}
// 测试组装请求,发送短信验证
public static void main(String[] args) {
HttpMsgMailTest httpUtil = new HttpMsgMailTest();
System.out.println(httpUtil.telChecking(13068791270L));
}
}
其中使用了setex方法设置缓存过期时间,其与expire方法的区别就是,setex方法是一个原子操作,同时设置value值、以及过期时间(单位秒),非常实用。
若key值存在,则会重写旧值,进行覆盖。设置成功,则返回“OK”。
结果如下:
2、将短信接口的基本参数纳入spring管理。
(1)setter方法注入
public class SMSUtil {
private static Logger logger = Logger.getLogger(SMSUtil.class);
private String serverIP;
private String serverPort;
private String accountSid;
private String accountToken;
private String appId;
private CCPRestSmsSDK restAPI =null;
private JedisUtil jedisUtil = new JedisUtil();
// set方法注入
public void setServerIP(String serverIP) {
this.serverIP = serverIP;
}
public void setServerPort(String serverPort) {
this.serverPort = serverPort;
}
public void setAccountSid(String accountSid) {
this.accountSid = accountSid;
}
public void setAccountToken(String accountToken) {
this.accountToken = accountToken;
}
public void setAppId(String appId) {
this.appId = appId;
}
public void init(){
//初始化SDK
restAPI = new CCPRestSmsSDK();
// 初始化服务器地址和端口,格式如下,服务器地址不需要写https:
restAPI.init(serverIP, serverPort);
// 初始化主帐号和主帐号TOKEN
restAPI.setAccount(accountSid, accountToken);
// 初始化应用ID
restAPI.setAppId(appId);
}
public void sendTelCode(String tel){
HashMap<String, Object> result = null;
String templateId="1";
// 随机四位验证码,直接 String.valueOf() 会有小数,不是整数
int code = (int)((Math.random() * 8999) + 1000);
// 将手机号为key,验证码为value,存储缓存,设置过期时间2分钟
String redis = jedisUtil.setex(tel,120,String.valueOf(code));
if("OK".equals(redis)){
logger.info("手机号、验证码缓存成功");
}
String[] content=new String[]{String.valueOf(code),"2"};
logger.info("验证码:" + code);
result = restAPI.sendTemplateSMS(tel,templateId ,content);
logger.info("短信验证发送结果 = " + result);
// statusCode状态码为000000,即为发送成功
if("000000".equals(result.get("statusCode"))){
// 正常返回输出data包体信息(map)
HashMap<String,Object> data = (HashMap<String, Object>) result.get("data");
// 获取data中的key
Set<String> keySet = data.keySet();
// 遍历key,通过key得到对应的值,输出
for(String key:keySet){
Object object = data.get(key);
logger.info(key +" = "+object);
}
}else{
//异常返回输出错误码和错误信息
logger.info("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));
}
}
}
spring全局配置文件:
方法测试:
(2)构造方法注入
在工具类中删除set方法,添加如下有参构造方法。
spring全局配置文件:
测试方法同上。
明天计划的事:
1、完成邮件验证。
2、完成阿里云oss图片上传。
3、集成到controller中。
遇到的问题:
无
收获:
1、根据第三方要求格式进行短信验证。使用Apache的CloseableHttpClient发送http请求。
2、将短信接口的基本参数纳入spring管理。
(1)setter方法注入
(2)构造方法注入
评论