AliSmsService.java 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.izouma.awesomeAdmin.service.sms;
  2. import com.aliyuncs.CommonRequest;
  3. import com.aliyuncs.CommonResponse;
  4. import com.aliyuncs.DefaultAcsClient;
  5. import com.aliyuncs.IAcsClient;
  6. import com.aliyuncs.exceptions.ClientException;
  7. import com.aliyuncs.http.MethodType;
  8. import com.aliyuncs.profile.DefaultProfile;
  9. import com.izouma.awesomeAdmin.config.Constants;
  10. import com.izouma.awesomeAdmin.domain.SmsRecord;
  11. import com.izouma.awesomeAdmin.exception.BusinessException;
  12. import com.izouma.awesomeAdmin.repo.SmsRecordRepo;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.apache.commons.lang3.RandomStringUtils;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.beans.factory.annotation.Value;
  17. import org.springframework.boot.configurationprocessor.json.JSONException;
  18. import org.springframework.boot.configurationprocessor.json.JSONObject;
  19. import org.springframework.stereotype.Service;
  20. import java.time.LocalDateTime;
  21. import java.time.ZoneOffset;
  22. @Service
  23. @Slf4j
  24. public class AliSmsService implements SmsService {
  25. @Value("${aliyun.access-key-id}")
  26. private String accessKeyId;
  27. @Value("${aliyun.access-key-secret}")
  28. private String accessKeySecret;
  29. @Autowired
  30. private SmsRecordRepo smsRecordRepo;
  31. @Override
  32. public String sendVerify(String phone) {
  33. smsRecordRepo.findLastByPhoneAndExpiresAtAfterAndExpiredFalse(phone, LocalDateTime.now()).ifPresent(record -> {
  34. if (record.getCreatedAt().plusMinutes(1L).isAfter(LocalDateTime.now())) {
  35. long sec = record.getCreatedAt().plusMinutes(1L).toInstant(ZoneOffset.UTC).getEpochSecond() - LocalDateTime.now().toInstant(ZoneOffset.UTC).getEpochSecond() + 1;
  36. throw new BusinessException("请" + sec + "秒后再试");
  37. }
  38. });
  39. String code = RandomStringUtils.randomNumeric(4);
  40. DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
  41. IAcsClient client = new DefaultAcsClient(profile);
  42. CommonRequest request = new CommonRequest();
  43. request.setMethod(MethodType.POST);
  44. request.setDomain("dysmsapi.aliyuncs.com");
  45. request.setVersion("2017-05-25");
  46. request.setAction("SendSms");
  47. request.putQueryParameter("PhoneNumbers", phone);
  48. request.putQueryParameter("SignName", Constants.SMS_SIGN_NAME);
  49. request.putQueryParameter("TemplateCode", Constants.SMS_TEMPLATE_CODE_GENERIC);
  50. request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");
  51. try {
  52. CommonResponse response = client.getCommonResponse(request);
  53. if (response.getHttpStatus() != 200) {
  54. throw new BusinessException("发送失败,请稍后再试", response.getHttpStatus() + "," + response.getData());
  55. }
  56. log.info("send sms response {}", response.getData());
  57. JSONObject jsonObject = new JSONObject(response.getData());
  58. if (!"ok".equalsIgnoreCase(jsonObject.getString("Code"))) {
  59. throw new BusinessException("发送失败,请稍后再试", jsonObject.getString("Message"));
  60. }
  61. smsRecordRepo.expire(phone);
  62. String sessionId = RandomStringUtils.randomAlphabetic(10);
  63. smsRecordRepo.save(SmsRecord.builder()
  64. .sessionId(sessionId)
  65. .phone(phone)
  66. .code(code)
  67. .expiresAt(LocalDateTime.now().plusMinutes(5))
  68. .expired(false)
  69. .build());
  70. return sessionId;
  71. } catch (ClientException | JSONException e) {
  72. e.printStackTrace();
  73. throw new BusinessException("发送失败,请稍后再试", e.getMessage());
  74. }
  75. }
  76. @Override
  77. public void verify(String phone, String code) throws SmsVerifyException {
  78. SmsRecord smsRecord = smsRecordRepo.findLastByPhoneAndExpiresAtAfterAndExpiredFalse(phone, LocalDateTime.now()).orElseThrow(new SmsVerifyException("验证码错误"));
  79. if (!smsRecord.getCode().equalsIgnoreCase(code)) {
  80. throw new BusinessException("验证码错误");
  81. }
  82. smsRecord.setExpired(true);
  83. smsRecordRepo.save(smsRecord);
  84. }
  85. }