Springboot部署阿里云短信服务

一、阿里云短信模板配置(获取SignName[签名名称]、TemplateCode[模板CODE])

1. 进入阿里云首页直接搜索短信服务,并点击国内消息进入国内文本短信管理页面

在这里插入图片描述

2. 选择签名管理点击添加签名

在这里插入图片描述

填写签名信息并提交

注:下面的签名来源如项目未上线可选择测试或学习(我上面的一个签名就是测试的)。
添加签名页面

3. 选择模板管理点击添加模板

在这里插入图片描述

填写模板信息

添加模板页面

注:因签名与模板的审核都需要时间,且模板依赖于签名,如有需要可直接提交两个签名申请,减少连续等待的审核时间。

利用上面的审核时间我们就可以继续配置其他信息。

二、阿里云AccessKey配置(获取AccessKeyId、AccessKeySecret)

1. 创建专用于短信服务访问的RAM用户,导航栏搜索RAM用户,并点击创建用户

RAM用户页面

2. 填写RAM用户信息

创建用户信息页面

3.保存AccessKeyId、AccessSecret

创建成功页面

4. 为创建的用户添加权限

添加权限页面

以上便可让我们获取到accessKeyId、accessKeySecret、signName、templateCode用于项目部署的配置

三、Springboot的配置

1. application.yml文件添加配置信息

#阿里云短信发送配置信息
sms:
    AccessKeyId:
    accessKeySecret:
    signName:
    templateCode: 
    doMain:dysmsapi.aliyuncs.com
    regionId:cn-hangzhou

2. pom.xml文件添加依赖

https://mvnrepository.com/
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-core</artifactId>
			<version>4.5.16</version>
		</dependency>
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
			<version>1.0.0</version>
		</dependency>
		<!--这个springboot是有自动集成的-->
<!--		<dependency>-->
<!--			<groupId>com.google.code.gson</groupId>-->
<!--			<artifactId>gson</artifactId>-->
<!--			<version>2.8.5</version>-->
<!--		</dependency>-->
然后重新加载Maven下载依赖。

3. Controller控制层

package com...business.controller;

import com.hy.erp.business.service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@RequestMapping("/sms")
public class SendSmsController {
    @Autowired
    private SendSmsService sendSmsService;

    @ResponseBody
    @RequestMapping(value = "/sendSms")
    public String sendSms() {
        String message = SendSmsController.randomCode(4).toString();
        boolean sendFlag = sendSmsService.sendSms("183****6666",message);
        if (sendFlag){
            return "短信发送成功,请注意查收。";
        }else {
            return "短信发送失败!";
        }
    }

    //随机生成指定位数验证码
    public static StringBuffer randomCode(int number){
        //验证码内容集
        final char[] CHARS = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        StringBuffer stringBuffer=new StringBuffer();
        Random r=new Random();
        for(int i=0;i<number;i++){
            stringBuffer.append(CHARS[r.nextInt(CHARS.length)]);
        }
        return stringBuffer;
    }
}

4. Service业务层

package com.hy.erp.business.service;

public interface SendSmsService {

	/**
	 * 发送短信的接口
	 *
	 * @param phoneNum 手机号
	 * @param message 消息
	 * @return
	 */
	boolean sendSms(String phoneNum, String message);
}

5. ServiceImpl实现层

package com.hy.erp.business.service.impl;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.hy.erp.business.service.SendSmsService;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;


@Service
@Data
public class SendSmsServiceImpl implements SendSmsService {
    private static final Logger logger = LoggerFactory.getLogger(SendSmsServiceImpl.class);
    //application.yml文件里配置的sms
    @Value("${sms.accessKeyId}")
    private String accessKeyId;
    @Value("${sms.accessKeySecret}")
    private String accessKeySecret;
    //短信api的请求地址 固定的 dysmsapi.aliyuncs.com
    @Value("${sms.doMain}")
    private String doMain;
    //指定地域名称 短信API固定的 cn-hangzhou
    @Value("${sms.regionId}")
    private String regionId;
    //您的申请签名
    @Value("${sms.signName}")
    private String signName;
    //你的模板
    @Value("${sms.templateCode}")
    private String templateCode;

    /**
     * 发送短信接口
     *
     * @param phoneNum 手机号
     * @param message 消息
     * @return
     */
    @Override
    public boolean sendSms(String phoneNum, String message) {

        // 指定地域名称 短信API的就是 cn-hangzhou 不能改变  后边填写您的  accessKey 和 accessKey Secret
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);

        // 创建通用的请求对象
        CommonRequest request = new CommonRequest();
        // 指定请求方式
        request.setSysMethod(MethodType.POST);
        // 短信api的请求地址  固定
        request.setSysDomain(doMain);
        //签名算法版本  固定
        request.setSysVersion("2017-05-25");
        //请求 API 的名称
        request.setSysAction("SendSms");
        //指定地域名称
        request.putQueryParameter("RegionId", regionId);
        // 要给哪个手机号发送短信  指定手机号
        request.putQueryParameter("PhoneNumbers", phoneNum);
        // 您的申请签名
        request.putQueryParameter("SignName", signName);
        // 您申请的模板 code
        request.putQueryParameter("TemplateCode", templateCode);

        Map<String, Object> params = new HashMap<>();
        //这里的code就是短信模板中的 ${code},可能会有多个参数
        params.put("code", message);

        // 放入参数  需要把 map转换为json格式  使用fastJson进行转换
        request.putQueryParameter("TemplateParam", JSON.toJSONString(params));

        try {
            CommonResponse response = client.getCommonResponse(request);
            logger.info(JSON.parseObject(response.getData(), Map.class).get("Message").toString());
            return response.getHttpResponse().isSuccess();

        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }

        return false;
    }
}

到这里配置好手机号就可以启动项目啦

6. 项目启动

如果签名是测试学习用的的,后台出现如下信息那便是发送成功
2023-02-09 09:21:18.736  INFO 26032 --- [nio-8888-exec-2] c.h.e.b.service.impl.SendSmsServiceImpl  : 只能向已回复授权信息的手机号发送
可以在阿里云平台配置测试接收信息的手机号

绑定测试手机号

7. 启动问题

  • NoSuchMethodError
java.lang.NoSuchMethodError: com.google.gson.JsonParser.parseString(Ljava/lang/String;)Lcom/google/gson/JsonElement;
  • NoClassDefFoundError
java.lang.NoClassDefFoundError: Could not initialize class com.aliyuncs.endpoint.LocalConfigRegionalEndpointResolver

首次执行会触发第一种报错,后面执行的都会触发第二种。
开始以为是gson类的问题,找了很久也重新在pom文件后面补上了依赖,后面发现springboot已经自动集成了。
最后发现是aliyun-java-sdk-core的版本问题,我用的4.6.0就会报错,改为4.5.16就运行正常了,你们可以试试其他的。

好了以上都是自己实操后又再走一遍记录下来的,共勉!

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值