阿里云短信demo
公司的项目需要用到短信告警功能
所以写一下笔记记录一下学习和实践的过程
具体特别细节的东西可以参考官方文档
之前做过阿里云短信的验证码功能但是忘记了写笔记所以现在凭借着记忆以及查阅资料好好写一篇笔记
笔记真的很重要,有的代码出现问题了,看自己以前加的注释不一定能想起来自己以前的逻辑,但是看看笔记立马能想起来之前的思维和逻辑
个人未认证企业资质的用户,是不可以定制短信模板的,只能简单的使用一下短信验证码功能。(阿里为了防止诈骗短信的发送所以这方面要求还是比较严格的)
所以这个笔记我简单的做了企业定制demo的简介以及使用的记录
企业版定制短信demo
1.首先如果需要发送短信的话
现在阿里云审核非常严格基本不会通过个人认证的账号进行的签名。
例如
可以看到我所有的个人申请短信签名的记录全都审核未通过,
申请签名模板的时候需要提交企业提供的相关凭证,以及营业执照等,现在阿里对个人签名基本是不支持了,需要个人写demo测试的同学可以看看腾讯云和华为云的短信功能,这两个相对个人审核还没那么严格。
2.审核通过之后
拿着必备的几个参数
AccessKey ID:秘钥ID
AccessKey Secret:秘钥密码
短信签名:sing Name
模板代码:template Code
模板参数:template Param
电话号码:phone Numbers
我简单的介绍一下这几个参数的作用
签名
就是短信的抬头,例如你每次收到短信的时候看见的xxxx银行,xxxx平台,可以简单的理解为短信的发送方简称
模板代码
你申请的签名通过之后,这个签名下面就可以申请模板,就是短信的格式,例如:你的短信验证码为xxxx,有效期为2分钟,请勿告诉他人。这个就是模板,你每次申请的模板格式都会生成唯一的模板代码,要发送不同的格式的短信只需要改变模板代码即可
模板参数
在模板代码里面传入的参数,就是模板参数,例如:短信验证码xxxx,这个就是参数,阿里云传入的参数需要严格按照json结构
电话号码
就是简单地理解收短信的人的手机号,这个参数字段可以是多个手机号拼接的,例如189xxxxxxxx或者189xxxxxxxx,155xxxxxxxx 注意多个手机号的时候需要使用逗号隔开
3.引入SDK依赖
从官方复制阿里云短信sdk的依赖到pom文件中
注意版本别输错了,不同版本对应不同的依赖
pom.xml
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
*/
4.使用sdk模板制作代码
如图所示,在提示的地方填入响应的数据,右边的代码区会生成一个main方法,还可以点击蓝色按钮来调试这个sdk
调试没问题的话就可以把代码复制下来了
public class SendSms {
public static void main(String[] args) {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", "189xxxxxxxx");
request.putQueryParameter("SignName", "xx科技有限公司");
request.putQueryParameter("TemplateCode", "SMS_xxxxxxxx");
request.putQueryParameter("TemplateParam", "8848");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
根据自己需要的的功能,可以把这个短信功能写成一个Service服务,然后固定参数写死,或者配置到properties配置文件中去,然后每次调用只需要传入
电话号码、验证码 两个参数即可。
然后根据企业需要,把阿里接口对应的返回码返回给调用方。正常情况下接口返回的额Message和Code都是“OK”代表成功
如果参数不正确无法解析,Message都会给出相应的提示。只需要把上述的代码中的response转换成Json对象并把Message拿出来与字符串“OK”做对比即可知道短信是否发送成功了。然后在对短信的发送成功和失败各自做逻辑判断,不管是打日志啊,还是重发请求啊都可以的。
public ResponseBase send(String phoneNumbers, String deviceCode, String signName, String templateCode) {
ResponseBase responseBase = new ResponseBase();
//阿里云短信模板参数必须封装为json格式的字符串,否则无法解析
JSONObject jb = new JSONObject();
jb.put("deviceCode",deviceCode);
DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", appKey , appSecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-shanghai");
request.putQueryParameter("PhoneNumbers",phoneNumbers);
request.putQueryParameter("SignName", signName);
request.putQueryParameter("TemplateCode", templateCode);
request.putQueryParameter("TemplateParam", jb.toJSONString());
JSONObject data = new JSONObject();
try {
CommonResponse response = client.getCommonResponse(request);
data = JSON.parseObject(response.getData());
System.out.println(response.getData());
} catch (Exception e) {
LOGGER.info("阿里云短信发送异常",e);
}
//添加日志文件打印阿里云短信接口返回值
LOGGER.info("阿里云短信日志",data.toJSONString());
if (data.getString("Message").equals("OK")){
//此处添加短信发送正确的处理逻辑
}
//此处添加短信发送错误的处理逻辑
}