一、发送短信

在阿里云买完短信接口 ,按步骤测试
如果报错 很大可能是包导入错了!
import org.apache.http.HttpResponse; 这个包容易错
在会员工程中加入短信功能

1. 加入依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.15</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.httpcomponents</groupId>
  8. <artifactId>httpclient</artifactId>
  9. <version>4.5.9</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.eclipse.jetty</groupId>
  13. <artifactId>jetty-util</artifactId>
  14. <version>9.4.19.v20190610</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>commons-lang</groupId>
  18. <artifactId>commons-lang</artifactId>
  19. <version>2.6</version>
  20. </dependency>

2. 发送短信的工具方法

/**
* 第三方短信接口工具方法
* @param host host 配置文件中取出
* @param path path 配置文件
* @param method 请求方式
* @param appCode 阿里云 appCode
* @param receive 电话号
* @return
*/
public static ResultEntity<String> sendShortMessage(
    String host,
    String path,
    String method,
    String appCode,
    String receive
    ){
        /*String host = "https://smssend.shumaidata.com";
        String path = "/sms/send";
        String method = "POST";
        String appcode = "de0aca7b5135410fbaf40f047051d7b1";*/
        Map<String, String> headers = new HashMap<String, String>(16);
        // 最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appCode);
        Map<String, String> querys = new HashMap<String, String>();
        // 生成验证码
        StringBuilder code = new StringBuilder();
        for(int i = 0; i < 4; i++){
            int random = (int) (Math.random() * 10);
            code.append(random);
        }

        querys.put("receive", receive);
        querys.put("tag", code.toString());
        querys.put("templateId", "M09DD535F4");
        Map<String, String> bodys = new HashMap<String, String>();


        try {
            /**
             * 重要提示如下:
             * HttpUtils请从
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
             * 下载
             *
             * 相应的依赖请参照
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
             */
            HttpResponse response = (HttpResponse) HttpUtils.doPost(host, path, method, headers, querys, bodys);
            System.out.println(response.toString());
            // 获取response的body
            // System.out.println(EntityUtils.toString(response.getEntity()));
            System.out.println(response.getStatusLine().getStatusCode());
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                return ResultEntity.successWithData(code.toString());
            }else{
                return ResultEntity.failed("短信未发送");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return ResultEntity.failed(e.getMessage());
        }
    }

3. 目标

未命名图片.png

4. 代码:

1) 前端index页面点击注册 跳转到注册页面 view-controller

@Configuration
public class CrowdWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 添加index跳转到注册页面的view-controller
                    // viewName 会拼前后缀
        String urlPathRegister = "/auth/member/to/register/page.html";
        String viewName = "member-reg";
        registry.addViewController(urlPathRegister).setViewName(viewName);
    }
}

前端form表单里如果有button 需要先把button的type属性改成button 不然会提交页面跳转

2) 前端发送AJAX请求 请求验证码

坑:因为后端会调用第三方接口和redis 所以处理比较慢 需要添加一个 timeout 不然会报504处理超时错误

$(function () {
    $("#sendBtn").click(function () {
        // 1.接收验证码的短信
        var phone = $.trim($("[name=phoneNum]").val());
        // 2.发送ajax请求
        $.ajax({
            "url": "auth/member/send/short/message.json",
            "timeout": 5000,
            "type": "post",
            "data": {
                "phoneNum": phone
            },
            "dataType": "json",
            "success": function (response) {
                var result = response.result;
                if(result == "SUCCESS"){
                    layer.msg("发送成功!");
                }
                if(result == "FAILED"){
                    layer.msg("发送失败!再试一次");
                }
            },
           "error": function (response) {
                layer.msg(response.status + " " + response.statusText);
           },

        })
    })
})

5. 第三方短信接口参数配置类

/**
 * @date: 2021/3/13   23:25
 * @author: 易学习
 * 保存第三方短信接口的配置类
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
@ConfigurationProperties(prefix = "short.message")
public class ShortMessageProperties {
    private String host;  
    private String path; 
    private String method;
    private String appcode;
}

6. 在yaml中绑定属性

short:
  message:
    appCode: de0aca7b5135410fbaf40f047051d7b1
    host: https://smssend.shumaidata.com
    path: /sms/send
    method: POST

7. authentication-consumer 主启动类

启动方法的远程调用 【客户端】

@EnableFeignClients
@SpringBootApplication
public class CrowdMainClass {
    public static void main(String[] args) {
        SpringApplication.run(CrowdMainClass.class);
    }
}

8. authentication-consumer controller方法

/**
 * @date: 2021/3/13   23:15
 * @author: 易学习
 */
@Controller
public class MemberController {
    @Autowired
    private ShortMessageProperties shortMessageProperties;

    @Autowired
    private RedisRemoteService redisRemoteService;

    @ResponseBody
    @RequestMapping(value = "/auth/member/send/short/message.json",method = RequestMethod.POST)
    public ResultEntity<String> authMemberSendShortMessage(
            @RequestParam("phoneNum") String phoneNum){
        // 1.发送验证码到电话号
        ResultEntity<String> stringResultEntity = CrowdUtil.sendShortMessage(
                shortMessageProperties.getHost(),
                shortMessageProperties.getPath(),
                shortMessageProperties.getMethod(),
                shortMessageProperties.getAppCode(),
                phoneNum
        );


        // 2.判断结果是否发送成功
        if (Objects.equals(ResultEntity.SUCCESS,stringResultEntity.getResult())){

            String key = CrowdConstant.REDIS_CODE_PREFIX + phoneNum;
            // 获取验证码
            String value = stringResultEntity.getData();
            long time = 5L;
            // 发送成功把 验证码存到redis中 并设置5分钟过期时间
            ResultEntity<String> saveCodeResultEntity =
                    redisRemoteService.setRedisKeyValueWithTimeOut(key, value, time, TimeUnit.MINUTES);

            if(Objects.equals(ResultEntity.SUCCESS,saveCodeResultEntity.getResult())){
                // redis执行成功 返回数据
                return ResultEntity.successWithoutData();
            }else{
                return saveCodeResultEntity;
            }
        }else{
            return stringResultEntity;
        }
    }
}