1、前述
在实际业务开发中,短信是必不可少的场景之一,诸如验证码、信息通知、营销活动等需求,现在各大云服务商都提供了云短信服务,下面就将以腾讯云短信为例演示如何在java服务中开发短信功能。
2、开通腾讯云SMS
进入腾讯云,搜索短信SMS,按照给定流程开通即可,若没有赠送短信包则需要单独购买。
下图是SMS提供的短信服务完整的创建流程
3、创建短信签名
短信签名,就是大家在收到短信时内容的前缀,诸如xx公司、xx软件等
进入短信服务控制台,在国内短信中找到签名管理,创建签名。签名主体根据业务场景需要可以是公司、网站、APP、小程序等,创建后等待审核,可以催促审核。
4、创建正文模板
正文模板即短信的内容模板,一条完整的短信由签名+模板+参数组成。
创建模板时需要选择短信签名,故需要先签名审核通过才可创建模板。
注意:模板不能由【】字样以及模板不能全为{}参数样式,字数70字内为一条短信。
5、创建API密匙及API接入
以下是腾讯云官方提供的文档和SDK下载地址
腾讯云SMS短信服务官方文档
腾讯云SMS短信服务SDK下载
在腾讯云控制台右上角-访问管理,进入后找到访问密匙,创建自己的API访问密匙token
6、Java接入短信SDK
maven引入SDK
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.62</version>
</dependency>
以下是我根据官方demo自己封装的发送短信代码
@Override
public Result send(SMSMessage message){
Credential cred = new Credential(getSecretId(),getSecretKey());
// 实例化一个 http 选项,可选,无特殊需求时可以跳过
// 具体http配置参考官方文档或demo
// HttpProfile httpProfile = new HttpProfile();
SmsClient client = new SmsClient(cred, "");
SendSmsRequest req = new SendSmsRequest();
// APP ID,需要在短信服务中创建该应用获取APP ID
req.setSmsSdkAppid(config.getSmsSdkAppId());
// 签名,自己随意签写字符串
req.setSign(config.getSignature());
// 模板ID
req.setTemplateID(message.getTemplateId());
String[] phoneArr=new String[message.getPhoneList().size()];
int i=0;
for(String phone:message.getPhoneList()){
// 格式化号码,号码必须是+区号开头
phoneArr[i++]=formatPhone(phone);
}
// 写入号码列表
req.setPhoneNumberSet(phoneArr);
// 写入参数,若无则不写
req.setTemplateParamSet(message.getParamList().toArray(new String[message.getParamList().size()])); // 写入参数,若无则不写
/* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
* 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
SendSmsResponse res = null;
try {
// 调用API,同步返回结果
res = client.SendSms(req);
} catch (TencentCloudSDKException e) {
//e.printStackTrace();
return Result.fail(e.getMessage());
}
// 此处的SMSResult是自己封装的实体类
List<SMSResult> list=new ArrayList<>();
for(SendStatus status:res.getSendStatusSet()){
SMSResult resultStatus=new SMSResult();
//返回的数据类型可参照官方API文档
resultStatus.setSuccess("Ok".equals(status.getCode()));
resultStatus.setSessionContext(status.getSessionContext());
resultStatus.setPhone(status.getPhoneNumber());
resultStatus.setSerialNo(status.getSerialNo());
list.add(resultStatus);
}
Map<String,Object> map=new HashMap<>();
map.put("id",res.getRequestId());
map.put("resultList",list);
return Result.success("请求成功",map);
}
// 格式化手机号,手机号必须包含+区号
private String formatPhone(String phone){
if(phone.startsWith("+")){
return phone;
}
return "+86"+phone;
}
// 短信结果实体类
@Data
public class SMSResult {
private String serialNo;
private String phone;
private String sessionContext;
private Boolean success;
}
7、接入业务建议
按照现在流行的微服务的划分,短信邮箱等功能应该独立于业务服务之外,所以短信服务建议独立运行,仅提供HTTP API或MQ API等方式接受发送请求,从实际业务考虑,MQ是最理想的方式,若无业务场景的硬需求,业务服务发送短信不需要关心发送结果,MQ的方式对于整体的系统性能远远大于HTTP。
另外,有兴趣的小伙伴可以扫码关注公众号【暴走的怪兽君】,常更新Java干货资讯,免费提供大量教程和工具下载。