一、在阿里云官网上配置一些信息
阿里云官网:https://help.aliyun.com/
1.获取您的 AccessKey 和 AccessKey Secert
RAM控制台网址:https://ram.console.aliyun.com/overview
1. 云账号登录RAM控制台
在左侧导航栏的人员管理菜单下,单击用户。
用户登录名称/显示名称列表下,单击目标RAM用户名称。
用户AccessKey 区域下,单击创建新的AccessKey。
首次创建时需填写手机验证码。
确认。
- 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,则说明短信已经发送成功。