Java实现阿里云短信发送功能(保姆级!!!搞懂短信功能,这一篇就够了!)

一、准备工作

1)功能如何切入?

  • 第一步:分析业务需求,想要实现短信通知功能那就要有短信的收发双方,而手机上的短信功能需要占用通信资源,那我们就知道了,短信业务由运营商提供,这种业务不可能通过代码堆砌就能实现,也就是说得加钱!!!
  • 第二步: 分析手头资源,我们需要找到对接的渠道支撑我们把功能接入到项目中,目前市面上提供短信服务的也就是运营商三巨头。
  • 第三步:对接短信通知接口,了解清楚公司是否已经接入过该类型的资源,没有的话就要自己摸索打通了。
  • 第四步:代码实现,通过编写业务代码,实现功能。

2)为什么要用阿里云来实现?

  • 如果直接对接运营商提供的接口,那么由于各大运营商提供的接口参数或地址不同,我们在处理手机号的时候还要判断所属运营商,就需要在业务代码里写几套针对不同运营商的接口,这就会造成代码没有很好的复用性。
  • 基本各大运营商都不提供个人对接业务,而且资费相对于第三方企业普遍要贵(比如某运营商单条短信价格接近0.1元)。
  • 如果要找第三方的服务企业,那短信服务的头部就是是阿里云、腾讯云和华为云这些了,我是因为公司购买的阿里云的套餐包,所以才就我比较熟悉的来分享。
    (下图中可以看到,这个套餐的单条资费约为0.035元。我公司也买的短信套餐,估算下来这两年实际单条资费大约在0.032-0.045之间)

二、阿里云部分

1)登录阿里云
自己测试玩玩的话就用自己注册的账号,公司业务就登录公司的账号,登录后搜索“短信服务”。

2)购买服务
在这里插入图片描述

  • 余量不足时可以在“短信控制台-套餐包资费”中购买
    在这里插入图片描述
    3)参数配置
    根据提示学习签名和模板的配置
    在这里插入图片描述
  • 申请签名
    签名就是短信的标题,如下图中的【积分提醒】
    在这里插入图片描述

要注意,每个带星号的参数都要慎重填写,注意关键信息节点(这里踩过坑,由于填信息不仔细,审核不通过很耽误时间
在这里插入图片描述

  • 申请模板
    模板就是短信的内容,如下图中的“截至…兑换”
    在这里插入图片描述
    模板配置也很重要,注意要根据业务场景不同绑定对应的签名;另外,模板长度超长会增收费用(可以借鉴模板库)
    在这里插入图片描述
    至此,阿里云方面的准备工作算是基本完成了!

实现功能几个重要的点:

  1. 短信服务套餐要有余量
  2. 签名要配置好
  3. 签名对应的模板配好
  4. 接口写好(下面就来!)

三、代码部分

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)阿里云相关配置信息

阿里云短信配置信息几个必要的参数:

  1. accessKeyId:如下图,访问阿里云 API 的Id
  2. accessKeySecret:如下图,是Id对应的密钥,具有该账户完全的权限

在这里插入图片描述

  1. region_id:服务地区,选择离自己近的就好(像我是杭州,就填cn-hangzhou)
  2. product:短信API产品名称(固定值,就填Dysmsapi)
  3. 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,分享结束!收!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值