You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
282 lines
9.2 KiB
282 lines
9.2 KiB
package com.ynxbd.common.helper.common;
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.aliyuncs.CommonRequest;
|
|
import com.aliyuncs.CommonResponse;
|
|
import com.aliyuncs.DefaultAcsClient;
|
|
import com.aliyuncs.IAcsClient;
|
|
import com.aliyuncs.http.MethodType;
|
|
import com.aliyuncs.profile.DefaultProfile;
|
|
import com.ynxbd.common.bean.sms.SmsRegTem;
|
|
import com.ynxbd.common.bean.sms.SmsTemplate;
|
|
import com.ynxbd.common.config.EhCacheConfig;
|
|
import com.ynxbd.common.helper.ProperHelper;
|
|
import com.ynxbd.common.result.ResultEnum;
|
|
import com.ynxbd.wx.config.WeChatConfig;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.ehcache.Cache;
|
|
|
|
import java.util.Date;
|
|
import java.util.Map;
|
|
|
|
@Slf4j
|
|
public class SmsHelper {
|
|
private SmsHelper() {
|
|
}
|
|
|
|
private static final String OK = "OK";
|
|
public static final String ACCESS_KEY_ID;
|
|
public static final String ACCESS_KEY_SECRET;
|
|
public static final String SIGN_NAME;
|
|
|
|
// 缓存
|
|
public static Cache<String, SmsTemplate> CACHE;
|
|
|
|
static {
|
|
ProperHelper config = new ProperHelper().read("sms.properties");
|
|
ACCESS_KEY_ID = config.getString("sms.access_key_id");
|
|
ACCESS_KEY_SECRET = config.getString("sms.access_key_secret");
|
|
SIGN_NAME = config.getString("sms.sign_name");
|
|
|
|
createCache();
|
|
}
|
|
|
|
private synchronized static void createCache() {
|
|
if (CACHE == null) {
|
|
// 创建一个缓存实例(5分钟最大存活时间)
|
|
CACHE = EhCacheConfig.createCacheTTL(String.class, SmsTemplate.class, "sms_cache", (60L * 5));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 通用-发送短信
|
|
*
|
|
* @param template 模板
|
|
* @param tel 电话号码
|
|
*/
|
|
public static boolean send(String template, String tel, Object smsObj) {
|
|
SmsTemplate smsTemplate = new SmsTemplate();
|
|
smsTemplate.setTemParam(JsonHelper.toJsonString(smsObj));
|
|
return send(template, tel, null, smsTemplate);
|
|
}
|
|
|
|
/**
|
|
* 通用-发送短信
|
|
*
|
|
* @param template 模板
|
|
* @param tel 电话号码
|
|
*/
|
|
public static boolean send(String template, String tel, SmsTemplate smsTemplate) {
|
|
return send(template, tel, null, smsTemplate);
|
|
}
|
|
|
|
/**
|
|
* 通用-发送短信
|
|
*
|
|
* @param template 模板
|
|
* @param tel 电话号码
|
|
* @param signName 签名
|
|
* @param smsTemplate 模板内容
|
|
*/
|
|
public static boolean send(String template, String tel, String signName, SmsTemplate smsTemplate) {
|
|
return sendAli(template, tel, signName, smsTemplate);
|
|
}
|
|
|
|
|
|
/**
|
|
* 发送短信验证码
|
|
*
|
|
* @param template 短信模板
|
|
* @param tel 电话号码
|
|
* @param code 验证码
|
|
* @return 是否发送成功
|
|
*/
|
|
public static boolean sendCode(String template, String tel, String code) {
|
|
return sendCode(template, tel, null, code);
|
|
}
|
|
|
|
/**
|
|
* 发送短信验证码
|
|
*
|
|
* @param template 短信模板
|
|
* @param tel 电话号码
|
|
* @return 是否发送成功
|
|
*/
|
|
public static boolean sendCode(String template, String tel) {
|
|
return sendCode(template, tel, null, CodeHelper.getRandomCode(6));
|
|
}
|
|
|
|
/**
|
|
* 发送短信验证码
|
|
*
|
|
* @param template 短信模板
|
|
* @param tel 电话号码
|
|
* @param signName 签名
|
|
* @return 是否发送成功
|
|
* @code code 验证码
|
|
*/
|
|
public static boolean sendCode(String template, String tel, String signName, String code) {
|
|
SmsTemplate smsTemplate = new SmsTemplate();
|
|
smsTemplate.setCode(code);
|
|
smsTemplate.setTel(tel);
|
|
smsTemplate.setCountDown(new Date().getTime());
|
|
return sendAli(template, tel, signName, smsTemplate);
|
|
}
|
|
|
|
/**
|
|
* 发送请求到阿里云
|
|
*
|
|
* @param template 模板
|
|
* @param tel 电话号码
|
|
* @param smsTemplate 模板参数
|
|
*/
|
|
public static boolean sendAli(String template, String tel, String signName, SmsTemplate smsTemplate) {
|
|
if (StringUtils.isEmpty(signName)) {
|
|
signName = SIGN_NAME;
|
|
}
|
|
|
|
if (CACHE == null) createCache();
|
|
|
|
if (CACHE != null) {
|
|
CACHE.put(tel, smsTemplate); //添加缓存值
|
|
}
|
|
|
|
boolean flag = false;
|
|
try {
|
|
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
|
|
IAcsClient client = new DefaultAcsClient(profile);
|
|
|
|
CommonRequest request = new CommonRequest();
|
|
request.setSysMethod(MethodType.POST);
|
|
request.setSysDomain("dysmsapi.aliyuncs.com");
|
|
request.setSysVersion("2017-05-25");
|
|
// 发送短信的类型
|
|
request.setSysAction("SendSms");
|
|
request.putQueryParameter("RegionId", "cn-hangzhou");
|
|
// 签名模版
|
|
request.putQueryParameter("SignName", signName);
|
|
// 短信模版ID
|
|
request.putQueryParameter("TemplateCode", template);
|
|
// 接收短信的手机号
|
|
request.putQueryParameter("PhoneNumbers", tel);
|
|
// 设置模板需要的参数==>验证码code
|
|
if (smsTemplate.getCode() == null) {
|
|
request.putQueryParameter("TemplateParam", smsTemplate.getTemParam());
|
|
} else {
|
|
request.putQueryParameter("TemplateParam", JsonHelper.toJsonString(smsTemplate));
|
|
}
|
|
// 发送并获取响应消息
|
|
CommonResponse response = client.getCommonResponse(request);
|
|
String result = response.getData();
|
|
log.info("[短信]请求返回 resp={}", result);
|
|
|
|
// {"Message":"签名不合法(不存在或被拉黑)","RequestId":"B929C1F5-0DF6-4678-98B8-118060EFBC96","Code":"isv.SMS_SIGNATURE_ILLEGAL"}
|
|
JSONObject respMsg = JsonHelper.parseObject(result);
|
|
String respCode = respMsg.getString("Code");
|
|
String respMessage = respMsg.getString("Message");
|
|
|
|
if (OK.equals(respCode) && OK.equals(respMessage)) { // 发送成功
|
|
flag = true;
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
ErrorHelper.println(e);
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
|
|
/**
|
|
* 是否重复发送
|
|
*
|
|
* @param tel 储电话号码的集合
|
|
* @return 验证码 | null = 发送异常
|
|
*/
|
|
public static SmsTemplate isRepeat(String tel) {
|
|
return isRepeat(tel, null);
|
|
}
|
|
|
|
/**
|
|
* 是否重复发送
|
|
*
|
|
* @param tel 储电话号码的集合
|
|
* @param seconds 等待时间(s)
|
|
* @return 验证码 | null = 发送异常
|
|
*/
|
|
public static SmsTemplate isRepeat(String tel, Integer seconds) {
|
|
if (seconds == null) seconds = 60;
|
|
|
|
if (tel == null) return null;
|
|
|
|
if (CACHE != null) {
|
|
SmsTemplate cache = CACHE.get(tel);
|
|
if (cache == null) {
|
|
return null;
|
|
}
|
|
|
|
Long countDown = cache.getCountDown();
|
|
if (countDown == null) {
|
|
return null;
|
|
}
|
|
|
|
countDown = new Date().getTime() - countDown; // 计算倒计时
|
|
|
|
seconds = seconds * 1000;
|
|
if (countDown < seconds) { // 60s内请求,返回重复提示
|
|
countDown = ((seconds - countDown) / 1000);
|
|
log.info("[短信发送]还需等待 tel={}, countDown={}", tel, countDown);
|
|
SmsTemplate sms = new SmsTemplate();
|
|
sms.setCountDown(countDown);
|
|
return sms;
|
|
}
|
|
CACHE.remove(tel); // 超过60s,如果还存在则移除
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
/**
|
|
* 验证码验证
|
|
*
|
|
* @param tel 手机号码
|
|
* @param code 验证码
|
|
* @param isRemove 是否验证成功后移除
|
|
*/
|
|
public static boolean codeVerify(String tel, String code, boolean isRemove) {
|
|
if (CACHE == null) {
|
|
createCache();
|
|
}
|
|
if (CACHE == null) return false;
|
|
|
|
SmsTemplate smsTemplate = CACHE.get(tel);
|
|
|
|
if (smsTemplate == null) return false;
|
|
if (code.equals(smsTemplate.getCode())) {
|
|
if (isRemove) {
|
|
CACHE.remove(tel);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
// private void isCache() {
|
|
// if (CACHE == null) { // 判断是否重复发送验证码
|
|
// // 建立一个缓存实例
|
|
// CACHE = new Cache("smsCache", 5000, false, false, 120, 60);
|
|
// //在内存管理器中添加缓存实例
|
|
// if (CACHE_MANAGER == null) {
|
|
// CACHE_MANAGER = EHCacheUtil.initCacheManager();
|
|
// }
|
|
// CACHE_MANAGER.addCache(CACHE);
|
|
// }
|
|
//
|
|
// // 清除key,ehcache不会主动清除key,需要通过遍历来清除
|
|
// for (Object key : CACHE.getKeys()) {
|
|
// CACHE.get(key);
|
|
// }
|
|
// logger.info("smsCache当前缓存数量:" + CACHE.getSize());
|
|
// }
|
|
}
|
|
|