使用阿里云短信服务

214 阅读2分钟

1、创建短信微服务

1.1、创建新Maven项目

image.png

1.2、创建controller和service代码

image.png

1.3、配置application.yml

server:
  port: 8004 # 服务端口

spring:
  application:
    name: service-msm # 服务名
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # nacos地址
  profiles:
    active: dev # 运行环境:dev、test、prod
    
  jackson:  # 定义返回json的全局时间格式
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # sql执行日志
  mapper-locations: classpath:com/zmq/college/msm/mapper/xml/*.xml # 配置mapper xml文件的路径

1.4、配置服务启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) //取消数据源自动配置(不需要连接数据库)
@ComponentScan("com.zmq.college")
public class ServiceMsmApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceMsmApplication.class, args);
    }
}

1.5、pom.xml引入阿里云依赖

<!--fastJson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.79</version>
</dependency>
<!--aliyun-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.4.1</version>
</dependency>

2、开通阿里云短信服务(2021年后,阿里云短信服务不支持个人开通了!!!)

2.1、登录阿里云服务,搜索“短信服务”进入,点击国内消息

image.png

2.1.1、点击 添加模板,进入到添加页面,输入模板信息

image.png

2.1.2、点击提交,等待审核

image.png

2.2、添加签名管理

image.png 点击添加签名,进入添加页面,填入相关信息。注意:签名要写的有实际意义。点击提交,等待审核,审核通过后可以使用

3、编写发送短信接口

3.1、编写controller,根据手机号发送短信

import com.zmq.college.common.result.R;
import com.zmq.college.common.util.RandomUtil;
import com.zmq.college.msm.service.MsmService;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/msm")
@CrossOrigin //解决跨域
public class MsmController {

    @Resource
    private MsmService msmService;
    @Resource
    StringRedisTemplate stringRedisTemplate;

    @GetMapping(value = "/send/{phone}")
    public R code(@PathVariable String phone) {
        //1、先从redis获取验证码,如果获取到直接返回
        String code = stringRedisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(code)) {
            return R.ok();
        }
        //2、如果redis中没有,则生成新的随机值(验证码)
        code = RandomUtil.getFourBitRandom();
        //2.1、封装生成的验证码
        Map<String, Object> param = new HashMap<>();
        param.put("code", code);
        //3、调用发送短信服务,发送短信
        boolean isSend = msmService.send(phone, param);
        //发送成功
        if (isSend) {
            //3.1、把生成的验证码放入redis,同时设置验证码的有效时间(5分钟)
            stringRedisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
            return R.ok().message("发送短信成功");
        } else {
            return R.error().message("发送短信失败");
        }
    }
}

3.2、编写service

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.zmq.college.msm.service.MsmService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;

@Service
public class MsmServiceImpl implements MsmService {

    //发送短信
    @Override
    public boolean send(String phone, Map<String, Object> param) {
        //判断手机号是否为空
        if (StringUtils.isEmpty(phone)) return false;
        //配置发送
        DefaultProfile profile =
                DefaultProfile.getProfile(
                        "default", //地域节点(北京、上海...),默认“default”
                        "LTAIq6nIPY09VROj",  // id(阿里云短信id)
                        "FQ7UcixT9wEqMv9F35nORPqKr8XkTF" //秘钥(阿里云短信秘钥)
                );
        IAcsClient client = new DefaultAcsClient(profile);

        //设置相关参数(固定写法)
        CommonRequest request = new CommonRequest();
        //request.setProtocol(ProtocolType.HTTPS);
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");

        //设置发送相关参数
        request.putQueryParameter("PhoneNumbers", phone); //需要发送的手机号
        request.putQueryParameter("SignName", "我的谷粒在线教育网站"); //阿里云短信签名管理下的签名名称
        request.putQueryParameter("TemplateCode", "sms_180051135"); //阿里云短信模板管理下的模板code
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //验证码(转换成json格式)

        try {
            //发送短信
            CommonResponse response = client.getCommonResponse(request);
            boolean result = response.getHttpResponse().isSuccess();
            return result;
        } catch (ClientException e) {
            e.printStackTrace();
            return false;
        }
    }
}