AliSMSUtil.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package com.ruoyi.app.util;
  2. import com.aliyuncs.DefaultAcsClient;
  3. import com.aliyuncs.IAcsClient;
  4. import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
  5. import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
  6. import com.aliyuncs.exceptions.ClientException;
  7. import com.aliyuncs.profile.DefaultProfile;
  8. import com.aliyuncs.profile.IClientProfile;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import java.util.*;
  12. /**
  13. * 阿里发送短信验证码工具类
  14. * @author Alex
  15. */
  16. public class AliSMSUtil {
  17. private static final Logger logger = LoggerFactory.getLogger(AliSMSUtil.class);
  18. private static Map<String,String> CodeMap=new HashMap<>();
  19. private static Map<String,Long> CodeMapTime=new HashMap<>();
  20. private static final long EXPIRATIONTIME=1000*60*5;//5分钟
  21. private static final int START=0;//设置执行开始时间
  22. private static final int INTERVAL=1000*60*5;//设置间隔执行时间 单位/毫秒 设置为一分钟
  23. //产品名称:云通信短信API产品,开发者无需替换
  24. static final String product = "Dysmsapi";
  25. //产品域名,开发者无需替换
  26. static final String domain = "dysmsapi.aliyuncs.com";
  27. // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
  28. static final String accessKeyId = "LTAIuSBxXqyBNSCG";
  29. static final String accessKeySecret = "K0QrsoGHQQFNya71vG9tmbjfOBnnFf";
  30. private static AliSMSUtil INSTANCE;
  31. private static String SIGN_NAME = "传承云";
  32. //单例
  33. public static AliSMSUtil getInstance(){
  34. if (INSTANCE == null) {
  35. synchronized (AliSMSUtil.class) {
  36. if (INSTANCE == null) {
  37. INSTANCE = new AliSMSUtil();
  38. }
  39. }
  40. }
  41. return INSTANCE;
  42. }
  43. /**
  44. * 发送验证码 type类型 1、用户注册;2、登录确认;3、身份验证;4、登录异常;5、修改密码;6、信息变更;phone:电话号码
  45. * @param type 1、用户注册;2、登录确认;3、身份验证;4、登录异常;5、修改密码;6、信息变更;0、通用验证;
  46. * @param phone 电话号码
  47. * @return
  48. */
  49. public Map<String,String> sendSmsCode(Integer type,String phone){
  50. Map<String,String> map = new HashMap<>();
  51. String templateCode = "";
  52. switch (type){
  53. case 0:
  54. templateCode="SMS_140736533";
  55. break;
  56. case 1://用户注册
  57. templateCode="SMS_136825040";
  58. break;
  59. case 2://登录确认
  60. templateCode="SMS_136825042";
  61. break;
  62. case 3://身份验证
  63. templateCode="SMS_136825043";
  64. break;
  65. case 4://登录异常
  66. templateCode="SMS_136825041";
  67. break;
  68. case 5://修改密码
  69. templateCode="SMS_136825039";
  70. break;
  71. case 6://信息变更
  72. templateCode="SMS_136825038";
  73. break;
  74. default:
  75. templateCode="";
  76. break;
  77. }
  78. if (templateCode.equals("")){
  79. map.put("code","-1");
  80. map.put("msg","验证类型不存在!");
  81. return map;
  82. }
  83. String code = GetCode(phone);
  84. String params = "{\"code\":\""+code+"\"}";
  85. map = sendSms(phone,params,SIGN_NAME,templateCode);
  86. return map;
  87. }
  88. /**
  89. * 验证验证码 phone:电话号码 code:验证码
  90. * @param phone
  91. * @param code
  92. * @return 成功返回true,
  93. */
  94. public Boolean validateSmsCode(String phone,String code){
  95. boolean istrue=false;
  96. //没有记录
  97. if (CodeMap.size()<=0){
  98. return false;
  99. }
  100. //找不到手机的记录
  101. if(CodeMap.get(phone)==null){
  102. return false;
  103. }
  104. //时间超时了
  105. if((CodeMapTime.get(phone).longValue()+EXPIRATIONTIME) < new Date().getTime()){
  106. CodeMap.remove(phone);
  107. CodeMapTime.remove(phone);
  108. return false;
  109. }
  110. String mapCode = CodeMap.get(phone);
  111. if(mapCode.equals(code)){
  112. CodeMap.remove(phone);
  113. CodeMapTime.remove(phone);
  114. return true;
  115. }
  116. return false;
  117. }
  118. /**
  119. * 会员充值
  120. * @param phone 电话号码
  121. * @param store 商家名称
  122. * @param money 充值金额
  123. * @param newMoney 充值后会员余额
  124. * @return
  125. */
  126. public Map<String,String> sendSmsHycz(String phone,String store,String money,String newMoney){
  127. Map<String,String> map = new HashMap<>();
  128. String templateCode = "SMS_143706044";
  129. String params = "{\"store\":\""+store+"\",\"money\":\""+money+"\",\"newMoney\":\""+newMoney+"\"}";
  130. map = sendSms(phone,params,SIGN_NAME,templateCode);
  131. return map;
  132. }
  133. private Map<String,String> sendSms(String phone,String params,String signName,String templateCode){
  134. Map<String,String> map = new HashMap<>();
  135. //可自助调整超时时间
  136. System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
  137. System.setProperty("sun.net.client.defaultReadTimeout", "10000");
  138. //初始化acsClient,暂不支持region化
  139. IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
  140. DefaultProfile.addEndpoint("cn-hangzhou", product, domain);
  141. IAcsClient acsClient = new DefaultAcsClient(profile);
  142. //组装请求对象-具体描述见控制台-文档部分内容
  143. SendSmsRequest request = new SendSmsRequest();
  144. //必填:待发送手机号
  145. request.setPhoneNumbers(phone);
  146. //必填:短信签名-可在短信控制台中找到
  147. request.setSignName(signName);
  148. //必填:短信模板-可在短信控制台中找到
  149. request.setTemplateCode(templateCode);
  150. //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
  151. request.setTemplateParam(params);
  152. //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
  153. //request.setSmsUpExtendCode("90997");
  154. //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
  155. // request.setOutId("yourOutId");
  156. //hint 此处可能会抛出异常,注意catch
  157. try {
  158. SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
  159. if(sendSmsResponse!=null){
  160. if(sendSmsResponse.getCode().toUpperCase().equals("OK")){
  161. map.put("code","200");
  162. map.put("msg","发送成功!");
  163. }else{
  164. map.put("code","500");
  165. map.put("msg",sendSmsResponse.getMessage());
  166. }
  167. }else{
  168. map.put("code","500");
  169. map.put("msg","接口调用异常!");
  170. }
  171. } catch (ClientException e) {
  172. e.printStackTrace();
  173. map.put("code","500");
  174. map.put("msg",e.getErrMsg());
  175. }
  176. return map;
  177. }
  178. /**
  179. * 获取验证码
  180. * @param phone
  181. * @return
  182. */
  183. private String GetCode(String phone){
  184. String key = GetNum();
  185. CodeMap.put(phone,key);
  186. CodeMapTime.put(phone,new Date().getTime());
  187. return key;
  188. }
  189. private String GetNum(){
  190. int number = 899999;
  191. Random random = new Random();
  192. int num =random.nextInt(number)+100000;
  193. return num+"";
  194. }
  195. public static void main(String args[]) throws Exception {
  196. // Map<String,String> map = getInstance().sendSmsCode(1,"18172065995");
  197. // System.out.println(map);
  198. // long tt = new Long("1000000000000");
  199. // long _new = new Date().getTime()-tt;
  200. // System.out.println(_new^1000001);
  201. // getInstance().sendSmsHycz("18778060750","测试商家","100","1000");
  202. }
  203. static{
  204. Timer tt=new Timer();//定时类
  205. tt.schedule(new TimerTask(){//创建一个定时任务
  206. @Override
  207. public void run() {
  208. try {
  209. if (CodeMapTime.size() > 0) {
  210. long nd = new Date().getTime();//获取系统时间
  211. Iterator<Map.Entry<String, Long>> entries = CodeMapTime.entrySet().iterator();
  212. while (entries.hasNext()) {
  213. Map.Entry<String, Object> entry = (Map.Entry) entries.next();
  214. String key = entry.getKey(); //获取key
  215. long value = (Long) entry.getValue(); //获取value
  216. long rt = nd - value;//获取当前时间跟存入时间的差值
  217. if (rt > EXPIRATIONTIME) {//判断时间是否已经过期 如果过期则清除key 否则不做处理
  218. CodeMap.remove(key);
  219. entries.remove();
  220. }
  221. }
  222. }
  223. }catch (Exception ex){
  224. ex.printStackTrace();
  225. }
  226. }
  227. }, START,INTERVAL);//从0秒开始,每隔10秒执行一次
  228. }
  229. }