一、在阿里云官网上配置一些信息
阿里云官网:https://help.aliyun.com/
1.获取您的 AccessKey 和 AccessKey Secert
RAM控制台网址:https://ram.console.aliyun.com/overview
1. 云账号登录RAM控制台
2.在左侧导航栏的人员管理菜单下,单击用户。
3.在用户登录名称/显示名称列表下,单击目标RAM用户名称。
4.在用户AccessKey 区域下,单击创建新的AccessKey。
首次创建时需填写手机验证码。
5.单击确认。
- AccessKeySecret只在创建时显示,不提供查询,请妥善保管。
- 若AccessKey泄露或丢失,则需要创建新的AccessKey,最多可以创建2个AccessKey。
2.给刚新增的用户授权短信服务
注意:如果不授权调用短信服务会返回信息:没有访问权限
1.新增授权
2.添加权限
3.短信服务创建签名和模板
二、SpringBoot--接入阿里云短信服务
1.打开pom.xml
文件,添加依赖
<!--sms--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.4.6</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>2.1.0</version> </dependency>
说明:阿里云的 sdk依赖可在阿里云帮助文档中进行获取
2.修改application.yml
配置文件
aliyun: accessKeyID: *** 你的accessKeyID accessKeySecret: *** 你的accessKeySecret domain: dysmsapi.aliyuncs.com 固定不变 regionId: cn-hangzhou 固定不变 templateCode: *** 你的模板code signName: *** 你的签名
3.service层
package com.chinaums.sms.service; public interface SendSmsService { /** * 发送短信的接口 * * @param phoneNum 手机号 * @param message 消息 * @return */ boolean sendSms(String phoneNum, String message); }
4.serviceImpl实现层
package com.chinaums.sms.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.chinaums.sms.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); //aliyuncs的参数 @Value("${aliyun.accessKeyID}") private String accessKeyID; @Value("${aliyun.accessKeySecret}") private String accessKeySecret; //短信api的请求地址 固定 @Value("${aliyun.domain}") private String domain; //指定地域名称 短信API的就是 cn-hangzhou 不能改变 @Value("${aliyun.regionId}") private String regionId; //您的申请签名 @Value("${aliyun.signName}") private String signName; //你的模板 @Value("${aliyun.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<>(); //这里的key就是短信模板中的 ${xxxx} 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; } }
5.controller控制层
package com.chinaums.sms.controller; import com.chinaums.common.utils.R; import com.chinaums.sms.service.SendSmsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class SendSmsController { @Autowired private SendSmsService sendSmsService; @RequestMapping(value = "/sendSms") public R sendSms() { boolean sendFlag = sendSmsService.sendSms("131****9522","123456"); if (sendFlag){ return R.ok(); }else { return R.error("发送消息{123456}失败!"); } } }
说明:1.如果使用短信验证码格式的签名:code只能是 符合规则[a-zA-Z0-9] ,否则报错信息:params must be [a-zA-Z0-9] for verification sms。
2.短信服务里面选择不同的签名格式,请求的模板也可以不同,具体情况具体对待。
3.如果控制台返回信息:短信所使用签名场景非法,那么说明:签名的试用场景与短信类型不匹配。解决:检查下创建签名时选择的适用场景是验证码还是通用,如果是验证码,把场景改为通用即可。
4.如果控制台返回信息:账户余额不足。则需要充值一点钱。
6.可以在页面或者postman测试短信是否发送成功(直接调用控制层controller)注意:发送短信是收费的,收费标准看阿里云官网短信服务。
控制返回:OK,则说明短信已经发送成功。