阿里云短信服务
https://www.aliyun.com/product/sms?spm=5176.159202.J_8058803260.68.64ae6a56APLp1H
工具类 HttpUtils
HttpUtils 请从 https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
或者直接下载:http://code.fegine.com/HttpUtils.zip
下载相应的依赖请参照 https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
相关jar包(非pom)直接下载:http://code.fegine.com/aliyun-jar.zip
相关配置
spring:cloud:nacos:discovery:server-addr: 192.168.163.131:8848alicloud:sms:host: https://fesms.market.alicloudapi.compath: /sms/skin: 1sign: 175622appcode: 93b7e19861a24c519a7548b17dc16d75
发送验证码组件
package com.zsy.third.party.component;import com.zsy.common.utils.HttpUtils;import lombok.Data;import org.apache.http.HttpResponse;import org.apache.http.util.EntityUtils;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Map;/*** @Description:* @author: zhangshuaiyin* @createTime: 2020-06-27 09:39**/@ConfigurationProperties(prefix = "spring.cloud.alicloud.sms")@Data@Componentpublic class SmsComponent {private String host;private String path;private String skin;private String sign;private String appcode;public void sendCode(String phone, String code) {String method = "GET";Map<String, String> headers = new HashMap<>();// 最后在header中的格式(中间是英文空格)为 Authorization:APPCODE 93b7e19861a24c519a7548b17dc16d75headers.put("Authorization", "APPCODE " + appcode);Map<String, String> queries = new HashMap<String, String>();queries.put("code", code);queries.put("phone", phone);queries.put("skin", skin);queries.put("sign", sign);//JDK 1.8示例代码请在这里下载: http://code.fegine.com/Tools.ziptry {HttpResponse response = HttpUtils.doGet(host, path, method, headers, queries);//System.out.println(response.toString());如不输出json, 请打开这行代码,打印调试头部状态码。//状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误//获取response的bodySystem.out.println(EntityUtils.toString(response.getEntity()));} catch (Exception e) {e.printStackTrace();}}}
测试
@Testpublic void sendSmsCode() {smsComponent.sendCode("13838383838", "134531");}
发送短信接口
/*** @author: zhangshuaiyin* @createTime: 2020-06-27 10:04**/@Controller@RequestMapping(value = "/sms")public class SmsSendController {@Resourceprivate SmsComponent smsComponent;/*** 提供给别的服务进行调用* @param phone* @param code* @return*/@GetMapping(value = "/sendCode")public R sendCode(@RequestParam("phone") String phone, @RequestParam("code") String code) {//发送验证码smsComponent.sendCode(phone,code);return R.ok();}}
接口防刷和验证码再次校验
mall-auth-server LoginController.java
@ResponseBody@GetMapping(value = "/sms/sendCode")public R sendCode(@RequestParam("phone") String phone) {//1、接口防刷String redisCode = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);if (!StringUtils.isEmpty(redisCode)) {//活动存入redis的时间,用当前时间减去存入redis的时间,判断用户手机号是否在60s内发送验证码long currentTime = Long.parseLong(redisCode.split("_")[1]);if (System.currentTimeMillis() - currentTime < 60000) {//60s内不能再发return R.error(BizCodeEnum.SMS_CODE_EXCEPTION.getCode(), BizCodeEnum.SMS_CODE_EXCEPTION.getMsg());}}//2、验证码的再次效验 redis.存key-phone,value-codeint code = (int) ((Math.random() * 9 + 1) * 100000);String codeNum = String.valueOf(code);String redisStorage = codeNum + "_" + System.currentTimeMillis();//存入redis,防止同一个手机号在60秒内再次发送验证码stringRedisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone,redisStorage, 10, TimeUnit.MINUTES);thirdPartFeignService.sendCode(phone, codeNum);return R.ok();}
