1、前期準備:配置阿里雲短信服務
2、在項目中添加依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
3、添加阿里雲短信服務類
@Component
public class SendNoteUtil {
@Autowired
private RedisService redisService;
@Value("${redis.key.prefix.authCode}")
private String REDIS_KEY_PREFIX_AUTH_CODE;
@Value("${redis.key.expire.authCode}")
private Long AUTH_CODE_EXPIRE_SECONDS;
//驗證平臺信息 開發者無需任何更改
private static final String dysmsapi = "dysmsapi.aliyuncs.com";
DefaultProfile profile = DefaultProfile.getProfile("default", "LTAI4G9pshKm3Hv9nM5ALaxg", "n9SvNggc4rcMb3Fi2QKNkVPFFMdV3L");
IAcsClient client = new DefaultAcsClient(profile);
//這一步的兩個參數,一個是要發送驗證碼的手機號 一個是模板Code用來區分登錄註冊
public String sendNoteMessgae(String PhoneNumbers,String template){
StringBuilder sb = new StringBuilder();
Random random = new Random();
for(int i=0;i<6;i++){
sb.append(random.nextInt(10));
}
CommonRequest request = new CommonRequest();
//request.setSysProtocol(ProtocolType.HTTPS);
request.setSysMethod(MethodType.POST);
request.setSysDomain(dysmsapi);
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("PhoneNumbers", PhoneNumbers);//接受驗證碼的手機號
request.putQueryParameter("SignName", "校園助手");//簽名
//模板代碼,我暫時用的參數,你可以直接寫成模板碼,模板碼參考第八步
request.putQueryParameter("TemplateCode", template);
//用戶定義的驗證碼內容
request.putQueryParameter("TemplateParam","{code:"+sb.toString()+"}");
//驗證碼綁定手機號並存儲到redis
redisService.set(REDIS_KEY_PREFIX_AUTH_CODE+PhoneNumbers,sb.toString());
redisService.expire(REDIS_KEY_PREFIX_AUTH_CODE+PhoneNumbers,AUTH_CODE_EXPIRE_SECONDS);
try {
CommonResponse response = client.getCommonResponse(request);
String returnStr = response.getData();
System.out.println(returnStr);
JSONObject jsonObject = JSONObject.parseObject(returnStr);
//返回的信息
return jsonObject.getString("Message");
} catch (ServerException e) {
return e.getErrMsg();
} catch (ClientException e) {
return e.getErrMsg();
}
};
}
4、添加redis工具類
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 讀取緩存
*
* @param key
* @return
*/
public String get(final String key) {
return redisTemplate.opsForValue().get(key);
}
/**
* 寫入緩存
*/
public boolean set(final String key, String value) {
boolean result = false;
try {
redisTemplate.opsForValue().set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 更新緩存
*/
public boolean getAndSet(final String key, String value) {
boolean result = false;
try {
redisTemplate.opsForValue().getAndSet(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 刪除緩存
*/
public boolean delete(final String key) {
boolean result = false;
try {
redisTemplate.delete(key);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
5、編寫service層服務類
@Service
@Transactional
public class RedisServiceImpl implements RedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void set(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
@Override
public String get(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
@Override
public boolean expire(String key, long expire) {
return stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
@Override
public void remove(String key) {
stringRedisTemplate.delete(key);
}
@Override
public Long increment(String key, long delta) {
return stringRedisTemplate.opsForValue().increment(key,delta);
}
}
6、controller層
RestController
@RequestMapping(value = "/api/note")
public class SendNoteController {
@Autowired
private SendNoteUtil sendNoteUtil;
@Autowired
private RedisService redisService;
@Value("${redis.key.prefix.authCode}")
private String REDIS_KEY_PREFIX_AUTH_CODE;
@RequestMapping(value = "/sendNote",method = RequestMethod.GET)
public void sendNote(String phone, HttpServletResponse response){
String template = "SMS_191735081";
try {
response.getWriter().write(sendNoteUtil.sendNoteMessgae(phone,template));
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(String phone,String authCode){
//驗證驗證碼
if(!verifyAuthCode(authCode,phone)){
return"驗證碼錯誤";
}
return "登陸成功";
}
//對輸入的驗證碼進行校驗
private boolean verifyAuthCode(String authCode, String telephone){
if(StringUtils.isEmpty(authCode)){
return false;
}
String realAuthCode = redisService.get(REDIS_KEY_PREFIX_AUTH_CODE + telephone);
return authCode.equals(realAuthCode);
}
}