【学习笔记】Java中发送短信的正确姿势

4 篇文章 0 订阅
2 篇文章 0 订阅

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干货资讯,免费提供大量教程和工具下载。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴走的怪兽君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值