微信后端代码
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

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());
// }
}