1、打開阿里雲,登錄
2、登錄之后進入賬號管理界面,搜索 短信服務
點擊新手引導
申請好短信簽名和模板,一般需要一小時
打開AccessKey管理
記下Accesskeyid 和accessSecret
3、需要的maven包 阿里雲及Redis
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
<!--redis服務-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
4、短信工具類
public class MessageUtils { /** * 發送短信消息方法,返回驗證碼 * @param phone 用戶手機號 * @return true 發送成功 ;false 發送失敗 */ public void sendMsg(String phone) throws Exception { //設置超時時間-可自行調整 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //初始化ascClient需要的幾個參數 final String product = "Dysmsapi";//短信API產品名稱(短信產品名固定,無需修改) final String domain = "dysmsapi.aliyuncs.com";//短信API產品域名(接口地址固定,無需修改) //替換成你的AK final String accessKeyId = "";//你的accessKeyId,參考本文檔步驟2 final String accessKeySecret = "";//你的accessKeySecret,參考本文檔步驟2 //初始化ascClient,暫時不支持多region(請勿修改) IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); //組裝請求對象 SendSmsRequest request = new SendSmsRequest(); //使用post提交 request.setMethod(MethodType.POST); //必填:待發送手機號。支持以逗號分隔的形式進行批量調用,批量上限為1000個手機號碼,批量調用相對於單條調用及時性稍有延遲,驗證碼類型的短信推薦使用單條調用的方式 request.setPhoneNumbers(phone); //必填:短信簽名-可在短信控制台中找到 request.setSignName(""); //必填:短信模板-可在短信控制台中找到 request.setTemplateCode(""); String checkCode = CoreUtils.randomString(6, true);//此處是生成6位數驗證碼工具類 //request.setTemplateParam("{\"code\":\"123\"}");//測試用,此處json一定要嚴格按照json格式書寫 request.setTemplateParam("{\"code\":\"" + checkCode + "\"}"); //可選-上行短信擴展碼(擴展碼字段控制在7位或以下,無特殊需求用戶請忽略此字段) //request.setSmsUpExtendCode("90997"); //可選:outId為提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者 //request.setOutId("yourOutId"); //請求失敗這里會拋ClientException異常 SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) { //請求成功,短信已發送 //將手機號和生成的隨機數存入redis 並設置redis的過期時間 RedisClientServer.set(phone, phone+checkCode, 180); } } }
5、生成隨機字符串工具類

public class CoreUtils { /** * 生成隨機字符串 * * @param length * @return */ public static String randomString(int length, boolean isNumeric) { String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; if (isNumeric) { base = "0123456789"; } Random random = new Random(); StringBuffer buffer = new StringBuffer(length); for (int i = 0; i < length; i++) { buffer.append(base.charAt(random.nextInt(base.length()))); } return buffer.toString(); } }
6、Redis工具類

1 public class RedisClientServer { 2 3 4 private static JedisPool jedisPool = null; 5 6 private static Jedis jedis = null; 7 8 public static Jedis jedis_object = null; 9 10 private static String host = "127.0.0.1"; 11 private static String password = "root"; 12 private static Integer port = 6379; 13 14 15 static{ 16 if(jedisPool == null){ 17 JedisPoolConfig config = new JedisPoolConfig(); 18 //設置最大連接數 19 config.setMaxTotal(500); 20 //設置最大空閑數 21 config.setMaxIdle(20); 22 //設置最小空閑數 23 config.setMinIdle(8); 24 //設置超時時間 25 config.setMaxWaitMillis(3000); 26 //Idle時進行連接掃描 27 config.setTestWhileIdle(true); 28 //表示idle object evitor兩次掃描之間要sleep的毫秒數 29 config.setTimeBetweenEvictionRunsMillis(30000); 30 //表示idle object evitor每次掃描的最多的對象數 31 config.setNumTestsPerEvictionRun(10); 32 //表示一個對象至少停留在idle狀態的最短時間,然后才能被idle object evitor 33 //掃描並驅逐;這一項只有在timeBetweenEvictionRunsMillis大於0時才有意義 34 config.setMinEvictableIdleTimeMillis(60000); 35 //初始化連接池 36 jedisPool = new JedisPool(config, host, port); 37 jedis_object = new Jedis( host, port); 38 } 39 } 40 41 private RedisClientServer() { 42 43 } 44 45 private static Jedis getJedisInstance(){ 46 47 try { 48 if(null == jedis){ 49 jedis = jedisPool.getResource(); 50 jedis.auth(password); 51 } 52 } catch (Exception e) { 53 } 54 return jedis; 55 } 56 57 /** 58 * 向緩存中設置字符串內容 59 *@author liudianpeng.com 60 *@date 61 */ 62 public static boolean set(String key, String value) throws Exception { 63 Jedis jedis = null; 64 try { 65 jedis = getJedisInstance(); 66 jedis.set(key, value); 67 return true; 68 } catch (Exception e) { 69 } finally { 70 jedisPool.close(); 71 } 72 return false; 73 } 74 75 /** 76 * 向緩存中設置字符串內容 ,設置過期時間 77 *@author liudianpeng.com 78 *@date 79 */ 80 public static boolean set(String key, String value,Integer seconds) throws Exception { 81 Jedis jedis = null; 82 try { 83 jedis = getJedisInstance(); 84 jedis.set(key, value); 85 jedis.expire(key, seconds); 86 return true; 87 } catch (Exception e) { 88 } finally { 89 jedisPool.close(); 90 } 91 return false; 92 } 93 94 /** 95 * 根據key 獲取內容 96 *@author liudianpeng.com 97 *@date 98 */ 99 public static Object get(String key) { 100 Jedis jedis = null; 101 try { 102 jedis = getJedisInstance(); 103 Object value = jedis.get(key); 104 return value; 105 } catch (Exception e) { 106 } finally { 107 jedisPool.close(); 108 } 109 return null; 110 } 111 112 /** 113 * 刪除緩存中得對象,根據key 114 *@author liudianpeng.com 115 *@date 116 */ 117 public static boolean del(String key) { 118 Jedis jedis = null; 119 try { 120 jedis = getJedisInstance(); 121 jedis.del(key); 122 return true; 123 } catch (Exception e) { 124 e.printStackTrace(); 125 } finally { 126 jedisPool.close(); 127 } 128 return false; 129 } 130 131 132 public static <T> T parseObject(String text, Class<T> clazz) { 133 return parseObject(text, clazz); 134 } 135 136 /** 137 * 根據key 獲取對象 138 *@author liudianpeng.com 139 *@date 140 */ 141 public static <T> T get(String key, Class<T> clazz) { 142 Jedis jedis = null; 143 try { 144 jedis = getJedisInstance(); 145 String value = jedis.get(key); 146 return parseObject(value, clazz); 147 } catch (Exception e) { 148 e.printStackTrace(); 149 } finally { 150 jedisPool.close(); 151 } 152 return null; 153 } 154 155 /** 156 * 設置key過期 157 *@author 158 *@date 159 */ 160 public static boolean expire(String key,int seconds){ 161 Jedis jedis = null; 162 try { 163 jedis = getJedisInstance(); 164 jedis.expire(key, seconds); 165 return true; 166 } catch (Exception e) { 167 e.printStackTrace(); 168 } finally { 169 jedisPool.close(); 170 } 171 return false; 172 } 173 174 /** 175 * 判斷是否存在key 176 *@author 177 *@date 178 */ 179 public static Boolean exists(String key){ 180 Jedis jedis = null; 181 try { 182 jedis = getJedisInstance(); 183 return jedis.exists(key); 184 } catch (Exception e) { 185 e.printStackTrace(); 186 return false; 187 }finally { 188 jedisPool.close(); 189 } 190 } 191 192 }
7、