Java实现阿里云短信发送功能(保姆级!!!搞懂短信功能,这一篇就够了!)
·
一、准备工作
1)功能如何切入?
- 第一步:分析业务需求,想要实现短信通知功能那就要有短信的收发双方,而手机上的短信功能需要占用通信资源,那我们就知道了,短信业务由运营商提供,这种业务不可能通过代码堆砌就能实现,也就是说得加钱!!!
- 第二步: 分析手头资源,我们需要找到对接的渠道支撑我们把功能接入到项目中,目前市面上提供短信服务的也就是运营商三巨头。
- 第三步:对接短信通知接口,了解清楚公司是否已经接入过该类型的资源,没有的话就要自己摸索打通了。
- 第四步:代码实现,通过编写业务代码,实现功能。
2)为什么要用阿里云来实现?
- 如果直接对接运营商提供的接口,那么由于各大运营商提供的接口参数或地址不同,我们在处理手机号的时候还要判断所属运营商,就需要在业务代码里写几套针对不同运营商的接口,这就会造成代码没有很好的复用性。
- 基本各大运营商都不提供个人对接业务,而且资费相对于第三方企业普遍要贵(比如某运营商单条短信价格接近0.1元)。
- 如果要找第三方的服务企业,那短信服务的头部就是是阿里云、腾讯云和华为云这些了,我是因为公司购买的阿里云的套餐包,所以才就我比较熟悉的来分享。
(下图中可以看到,这个套餐的单条资费约为0.035元。我公司也买的短信套餐,估算下来这两年实际单条资费大约在0.032-0.045之间)
二、阿里云部分
1)登录阿里云
自己测试玩玩的话就用自己注册的账号,公司业务就登录公司的账号,登录后搜索“短信服务”。
- 链接地址:阿里云短信服务页面
- 在短信控制台中可以查看自己购买的服务套餐
2)购买服务
- 余量不足时可以在“短信控制台-套餐包资费”中购买
3)参数配置
根据提示学习签名和模板的配置
- 申请签名
签名就是短信的标题,如下图中的【积分提醒】
要注意,每个带星号的参数都要慎重填写,注意关键信息节点(这里踩过坑,由于填信息不仔细,审核不通过很耽误时间)
- 申请模板
模板就是短信的内容,如下图中的“截至…兑换”
模板配置也很重要,注意要根据业务场景不同绑定对应的签名;另外,模板长度超长会增收费用(可以借鉴模板库)
至此,阿里云方面的准备工作算是基本完成了!
实现功能几个重要的点:
- 短信服务套餐要有余量
- 签名要配置好
- 签名对应的模板配好
- 接口写好(下面就来!)
三、代码部分
1)导入阿里云短信jar包
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
2)阿里云相关配置信息
阿里云短信配置信息几个必要的参数:
- accessKeyId:如下图,访问阿里云 API 的Id
- accessKeySecret:如下图,是Id对应的密钥,具有该账户完全的权限
- region_id:服务地区,选择离自己近的就好(像我是杭州,就填cn-hangzhou)
- product:短信API产品名称(固定值,就填Dysmsapi)
- domain:短信API产品的域名(固定值,就填dysmsapi.aliyuncs.com)
例如:
// 阿里云短信配置信息
private static final String accessKeyId = "LTAI*********C9Cf";
private static final String accessKeySecret = "1GjBfyf**************RSDlP";
private static final String REGION_ID = "cn-hangzhou";
private static final String PRODUCT = "Dysmsapi";
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
3)签名参数设置
例如:
// 签名
private static final String signName = "某某公司";
4)模板参数设置
例如:
// 模板
private static final String templateCode = "SMS_22******4";
5)编写发送短信工具类
package com.mycompany.iot.trick.util;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.log4j.Log4j2;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName:SendSmsUtil
* @Description: 阿里云短信工具类
* @author: TracyYang
* @date:2019年8月28日 上午10:15:40
*/
@Log4j2
public class SendSmsUtil {
// 签名
private static final String signName = "某某公司";
// 模板
private static final String templateCode = "SMS_22*****04";
// 阿里云短信配置信息
private static final String accessKeyId = "LTA*************9Cf";
private static final String accessKeySecret = "1GjBfyf*****************SDlP";
private static final String REGION_ID = "cn-hangzhou";
private static final String PRODUCT = "Dysmsapi";
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
/**
* 发送短信通知
*
* @param mobile 手机号
* @param userName 用户名
* @param money 金额
* @return 执行结果
*/
public static boolean sendSMS(String mobile, String userName, Long money) {
try {
IClientProfile profile = DefaultProfile.getProfile(REGION_ID, accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint(REGION_ID, REGION_ID, PRODUCT, DOMAIN);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
// 手机号可以单个也可以多个(多个用逗号隔开,如:15*******13,13*******27,17*******56)
request.setPhoneNumbers(mobile);
request.setSignName(signName);
request.setTemplateCode(templateCode);
/* 例如签名内容为:某某公司
例如模板内容为:亲爱的同事,很高兴的通知您,您抽中了由领导${userName}派发的大饼奖励${money}元,请及时找财务领取!
变量属性:userName-其他;money-其他;
则短信内容为:【某某公司】 亲爱的同事,很高兴的通知您,您抽中了由领导${userName}派发的大饼奖励${money}元,请及时找财务领取!*/
request.setTemplateParam("{\"userName\":\""+ userName +"\",\"money\":\""+ money +"\"}");
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if ((sendSmsResponse.getCode() != null) && (sendSmsResponse.getCode().equals("OK"))) {
log.info("发送成功,code:" + sendSmsResponse.getCode());
return true;
} else {
log.info("发送失败,code:" + sendSmsResponse.getCode());
return false;
}
} catch (ClientException e) {
log.error("发送失败,系统错误!", e);
return false;
}
}
/**
* 获取逗号分隔的拼接字符串
*
* @param str 用于拼接的字符串集合
* @return String
*/
public static String getSplitString(List<String> str) {
StringBuilder newS = new StringBuilder();
if (str != null && str.size() > 0) {
for (String s : str) {
newS.append(s).append(",");
}
}
if (newS.length() > 0)
newS.deleteCharAt(newS.length() - 1);// 删除最后一个多余的逗号
return newS.toString();
}
public static void main(String[] args) {
// 多发
List<String> mobiles = new ArrayList<>();
mobiles.add("15*******13");
mobiles.add("13*******27");
mobiles.add("17*******56");
String s= getSplitString(mobiles);
System.out.println(SendSmsUtil.sendSMS(s, "谢广坤", -2000L));
// 单发
// System.out.println(SendSmsUtil.sendSMS("177******56", "赵四", -2000L));
}
}
OK,分享结束!收!
更多推荐
已为社区贡献2条内容
所有评论(0)