springboot阿里云短信服务集成
添加依赖
<!-- 阿里云短信 --> <dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20170525</artifactId> <version>2.0.5</version> </dependency>
在application.yml添加配置
# 阿里云短信配置
aliyun:
# 阿里云accessKeyId
accessKeyId:
# 阿里云accessKeySecret
accessKeySecret:
# 短信签名名称
signName:
# 短信模板ID
templateCode:
# 模板中变量
paramName:
定义返回常量
/** * 返回状态码 * * */ public class ProcessEnum { /** * 手机格式不正确 */ public static final String PHONE_FORMAT_ERROR = "手机格式不正确"; /** * 判断是否已发送 */ public static final String SMS_FREQUENTLY = "短信发已发送"; /** * 短信发送成功 */ public static final String SUCCESS = "短信发送成功"; /** * 短信发送失败 */ public static final String SMS_FAILED = "短信发送失败"; }
编写请求方法
import com.alibaba.fastjson.JSON; import com.aliyun.dysmsapi20170525.models.SendSmsRequest; import com.aliyun.dysmsapi20170525.models.SendSmsResponse; import com.aliyun.teaopenapi.models.Config; import com.ruoyi.common.constant.ProcessEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author 10262 * @version 1.0 * @Description TODO * @date 2021/9/7 15:19 */ @Slf4j @RestController @RequestMapping("/h5") public class SmsController { @Value("${aliyun.accessKeyId}") private String accessKeyId; @Value("${aliyun.accessKeySecret}") private String accessKeySecret; @Value("${aliyun.signName}") private String signName; @Value("${aliyun.templateCode}") private String templateCode; @Value("${aliyun.paramName}") private String paramName; @Autowired private RedisTemplate redisTemplate; /** * 发送短信. * @param mobile 手机号 * @return String */ @SuppressWarnings("deprecated") @GetMapping(value = "/sendSms/{mobile}") public String sendSmsNew(@PathVariable("mobile") String mobile) throws Exception { // 检验手机号码 boolean isPhone = isPhone(mobile); if (!isPhone) { return ProcessEnum.PHONE_FORMAT_ERROR; } // 校验是否重复发送 Object code = redisTemplate.opsForValue().get(mobile); if (code != null) { return ProcessEnum.SMS_FREQUENTLY; } String kaptcha = this.getKaptcha(); Map <String, String> map = new HashMap <>(1); // map.put(this.paramName, kaptcha); map.put("outletName", kaptcha); map.put("createTime", kaptcha); map.put("reportTypeName", kaptcha); String templateParam = JSON.toJSONString(map); Config config = new Config() // 您的AccessKey ID .setAccessKeyId(accessKeyId) // 您的AccessKey Secret .setAccessKeySecret(accessKeySecret); // 访问的域名 config.endpoint = "dysmsapi.aliyuncs.com"; com.aliyun.dysmsapi20170525.Client client = new com.aliyun.dysmsapi20170525.Client(config); SendSmsRequest sendSmsRequest = new SendSmsRequest() .setPhoneNumbers(mobile) .setSignName(signName) .setTemplateCode(templateCode) .setTemplateParam(templateParam); // 复制代码运行请自行打印 API 的返回值 SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest); if ( "OK".equals(sendSmsResponse.getBody().getCode()) ){ // 短信发送成功,将验证码存储到redis,并设置过期时间为5分钟 this.redisTemplate.opsForValue().set(mobile, kaptcha); this.redisTemplate.expire(mobile, 5, TimeUnit.MINUTES); // 短信发送成功 return ProcessEnum.SUCCESS; }; // 短信发送失败 return ProcessEnum.SMS_FAILED; } /** * 中国电信号段 133、149、153、173、177、180、181、189、199. 中国联通号段 * 130、131、132、145、155、156、166、175、176、185、186. 中国移动号段 * 134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188、198. * 其他号段. 14号段以前为上网卡专属号段,如中国联通的是145,中国移动的是147等等. 虚拟运营商. 电信:1700、1701、1702. * 移动:1703、1705、1706. 联通:1704、1707、1708、1709、171. 卫星通信:1349. * @param phone phone * @return boolean */ public static boolean isPhone(String phone) { String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$"; if (phone.length() != 11) { return false; } else { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(phone); return m.matches(); } } /** * 校验短信验证码. * @param mobile mobile * @param kaptcha kaptcha * @return 校验结果 */ @GetMapping(value = "/checkKaptcha/{mobile}/{kaptcha}") public Boolean checkKaptcha(@PathVariable String mobile, @PathVariable String kaptcha) { Object s = this.redisTemplate.opsForValue().get(mobile); return s != null && s.equals(kaptcha); } /** * 生成短信验证码并存储. * @return kaptcha */ private String getKaptcha() { StringBuilder str = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 6; i++) { // 生成一个[0,10) int randomInt = random.nextInt(10); str.append(randomInt); } return str.toString(); } }
nnjk