本文针对2023年11月30日更新后的阿里大于短信服务封装通用工具类进行展示:
1,进入阿里云官网:阿里云权益中心_助力学生、开发者、企业用云快速上云-阿里云
2,使用支付宝或者淘宝注册或者登陆;
3,右侧点击控制台搜索短信服务;
4,进入页面后左侧可按照“快速学习和测试”进行操作,也可按照此文进行操作;
5,选择国内信息或者国际都可,本文是选择国内进行操作的;
6,申请资质;
7,申请签名,这里需注意,签名有类型,类型选择“学习和测试”只能对授权手机发送短息,但审核通过比较快速简单,线上和其它类型可进行普发,不过审核更为严格,不好通过;
8,申请模板;
9,访问控制,创建用户,授权;
9中做的目的就是进行安全限制,因为短信发送涉及到AK(密钥账户)和SK(密钥密码),密钥分为全局和个体,如果这里不进行创建用户操作,点击头像中AK关联则是全局的;这里创建用户生成AK和SK则是个体,我们如果短信服务中使用全局AK,一旦泄密,则威胁我们阿里账号中财产安全及其它服务,所以我们创建个体用户,进行短信授权,代码API中使用此用户的AK即可,因为只授权短信服务给此用户,所以此用户AK不涉及其它权限;
注意,申请方面都需要时间等待,如有开发需求请提前准备;
具体操作本文不再赘述,可查看黑马阿里云短信服务解决方案视频教程,带你轻松定义通用组件,使用案例实现任何短信的发送,工具类直接应用中小型项目_哔哩哔哩_bilibili
此视频,讲解很详细,只不过不是最新代码;
10,最新代码测试SDK:
依赖:
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>
</dependencies>
code:
package cn.zzn;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.TeaException;
public class Sample {
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId("输入你的AKID")
// 必填,您的 AccessKey Secret
.setAccessKeySecret("输入你的AK");
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
// 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
com.aliyun.dysmsapi20170525.Client client = Sample.createClient(System.getenv("输入你的AKID"), System.getenv("输入你的AK"));
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setSignName("你的签名名称,此处可自定义")
.setTemplateCode("模板ID")
.setPhoneNumbers("测试手机号码")
.setTemplateParam("{\"code\":\"zzn888\"}");//模板参数,这里模板类型为字母和数字
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
System.out.println(sendSmsResponse.getBody());
System.out.println(sendSmsResponse.getHeaders());
System.out.println(sendSmsResponse.getStatusCode());
} catch (TeaException error) {
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
上述代码即是官网最新(本文时间)SDK。
封装工具类:
xml(依赖):基于springboot
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 阿里大于-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
code:
package cn.itcast.sms.util;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.TeaException;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class SmsUtil {
/* @Autowired
private Environment environment;*/
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
// 自己改造,无需main方法调用,所且不用类加载就加载,调用时加载即,所以不用static修饰,涉及签名且只是方法内部调用,所以private修饰
private com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception{
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId("你的AKID")
// 必填,您的 AccessKey Secret
.setAccessKeySecret("你的AKS");
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
public void sendSms(Map map) throws Exception {
// 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
Client client = createClient("你的AKID", "你的AKS");
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setSignName(map.get("signName")+"")
.setTemplateCode(map.get("templateCode")+"")
.setPhoneNumbers(map.get("mobile")+"")
.setTemplateParam(map.get("templateParam")+"");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
System.out.println(sendSmsResponse.getBody());
// System.out.println(sendSmsResponse.getHeaders());
System.out.println(sendSmsResponse.getStatusCode());
} catch (TeaException error) {
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
测试:
import cn.itcast.sms.util.SmsUtil;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class SmsTest {
@Test
public void smsTest() throws Exception {
SmsUtil smsUtil = new SmsUtil();
Map map = new HashMap<>();
map.put("signName","zzn");
map.put("templateCode","输入你的模板id");
map.put("mobile","输入你的测试手机号");
map.put("templateParam","{\"code\":\"zzn888\"}");
smsUtil.sendSms(map);
}
}
响应输出:(我个人配置)
com.aliyun.dysmsapi20170525.models.SendSmsResponseBody@647e447
200
以指定手机收到短信为准。
以上代码基于测试发表,作为基本使用的基准,意义旨在为大家摸清道路减少时间,大家可以在此基础上根据实际开发需求进行改造,如:配置文件设置变量等;操作简单,大家根据实际情况进行操作即可。