Java实现短信发送业务

1、业务需求

发送短信功能是一个很普遍的需求,比如验证码,快递单号,通知信息一类。 而在Java中实现短信功能相对简单,只需要调用短信服务商提供的API。接下来以阿里云为例,介绍如何实现短信发送功能,其他短信服务商也是类似的操作。

2、短信发送逻辑

阿里云短信发送逻辑大致总结为:提供登录阿里云的账号(AccessKey ID)和密码(AccessKey Secret)登录后,选择对应的短信签名模版,填充对应的短信内容(模版参数),然后将短信发送到指定的手机号

签名:短信开头时【】内的公司信息

模板:短信内容的骨架,可填充对应参数

注意:阿里云短信服务申请签名主要针对企业开发,个人申请时有一定难度,在审核时会审核资质,需要上传营业执。但阿里云提供了测试签名和测试模板,开发测试时只需要获取对应的测试签名和测试模板。

  • 获取AccessKeyId和AccessKeySecret,点击头像右上角的AccessKey管理按钮后获取。

  • 获取测试签名和模板

3、代码实现

目前阿里云短信服务的SDK分为1.0版本和2.0版本,1.0已经不再维护,推荐使用2.0版本,下面列举了两种方式的实现代码。

  • 2.0版本

(1) Maven方式引入pom依赖

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dysmsapi20170525</artifactId>
    <version>2.0.24</version>
</dependency>

(2) 代码编写

代码逻辑:创建发送短信的客户端,提供参数调用对应方法即可。 需要提供下面几个参数:

  • AccessKey ID:类似登录阿里云时的账号
  • AccessKey Secret:类似登录阿里云的密码
  • phone:接收短信的号码
  • signName:短信签名,即短信开头时【】内的公司信息
  • templateCode:模版编码,即短信内容的骨架
  • templateParam:模版参数,即要往短信模版骨架中填充的内容
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teautil.models.RuntimeOptions;

public class SMSUtils {
    /**
     * 阿里云登录id
     */
    private final static String ACCESS_KEY_ID = "your access key id";

    /**
     * 阿里云登录密码
     */
    private final static String ACCESS_KEY_SECRET = "your access key secret";

    /**
     * 初始化登录阿里云的Client
     *
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     */
    public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
        .setAccessKeyId(accessKeyId)
        .setAccessKeySecret(accessKeySecret);
        // 可指定登录的服务器地址,可参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new com.aliyun.dysmsapi20170525.Client(config);
    }

    /**
     * 发送短信方法
     * @param phoneNumbers 手机号
     * @param signName 签名
     * @param templateCode  模板编号
     * @param param 模板参数
     * @throws Exception
     */
    public static void sendMessage(String phoneNumbers, String signName, String templateCode, String param) throws Exception {
        com.aliyun.dysmsapi20170525.Client client = SMSUtils.createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
        .setPhoneNumbers(phoneNumbers)
        .setSignName(signName)
        .setTemplateCode(templateCode)
        .setTemplateParam(param);
        SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
        System.out.println("短信发送成功,返回结果是:"+sendSmsResponse);
    }

    public static void main(String[] args) {
        try {
            SMSUtils.sendMessage("15179068888", "阿里云短信测试", "SMS_154958888", "{\"code\":\"7777\"}");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

  • 1.0版本

(1) Maven方式引入pom依赖

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.16</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>2.1.0</version>
</dependency>

(2) 代码编写

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.profile.DefaultProfile;

/**
 * 短信发送工具类
 */
public class SMSUtils {
   /**
    * 发送短信
    * @param signName 签名
    * @param templateCode 模板
    * @param phoneNumbers 手机号
    * @param param 模板参数
    */
   public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
      // client的参数,服务器ip, accessKeyId, accessKeySecret 
      DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "xxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxx");
      // 登录client
      IAcsClient client = new DefaultAcsClient(profile);

      SendSmsRequest request = new SendSmsRequest();
      request.setSysRegionId("cn-hangzhou");
      request.setPhoneNumbers(phoneNumbers);
      request.setSignName(signName);
      request.setTemplateCode(templateCode);
      request.setTemplateParam("{\"code\":\""+param+"\"}");
      try {
         SendSmsResponse response = client.getAcsResponse(request);
         System.out.println("短信发送成功");
      }catch (ClientException e) {
         e.printStackTrace();
      }
   }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/286460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运算符的优先级(规矩是人定的)

运算符的优先级&#xff08;规矩是人定的&#xff09; 什么是经典&#xff1f;经典就是理论不随时间变迁而变化。《东方不败》中的很多台词让人时不时想起来振聋发聩。比如 很多事情不是自己想的那样&#xff0c;规矩是人定的。 舔狗和有思想 从小到大&#xff0c;我们都学过…

使用sdf文件+urdf文件模拟机器人示例(不用把urdf转sdf)

gazebo版本&#xff1a;harmonic&#xff1b; <launch> <group> <let name"robot_description" value"$(command xacro $(find-pkg-share gazebo_pkg)/urdf/total.xacro)"/> <node pkg"rviz2" exec"rviz2" name…

前端文件上传组件最全封装+删除+下载+预览

前言&#xff1a;使用的是若依的框架element uivue2封装的。如果有不对的地方欢迎指出。后台管理使用&#xff0c;文件需要上传。回显列表&#xff0c;详情也需要回显预览 // 开始封装组件&#xff1a;封装在 src/components/FileUpload/index.vue中 <template><div c…

如何使用Pyxamstore快速解析Xamarin AssemblyStore文件

关于Pyxamstore Pyxamstore是一款针对Xamarin AssemblyStore文件&#xff08;assemblies.blob&#xff09;的强大解析工具&#xff0c;该工具基于纯Python 2.7开发&#xff0c;支持从一个APK文件中解包并重封装assemblies.blob和assemblies.manifest Xamarin文件。 什么是ass…

YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone

前言:Hello大家好,我是小哥谈。MobileViTv3是一种改进的模型架构,用于图像分类任务。它是在MobileViTv1和MobileViTv2的基础上进行改进的,通过引入新的模块和优化网络结构来提高性能。本节课就给大家介绍一下如何在主干网络中引入MobileViTv3网络结构,希望大家学习之后能够…

生活明朗,万物可爱人间值得,未来可期

这是一件洋溢着温馨 与童真的时尚佳作它以细腻的织法、柔暖的材质 给您的宝贝带来舒适的穿着体验独特的韩版设计&#xff0c;彰显时尚品味 让您的孩子从小就走在 潮流的前沿适合各种场合 无论是周末聚会还是平日上学 都能让您的孩子焕发自信光彩

Axure鲜花速递商城网站原型图,花店网站O2O本地生活电商平台

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;仅支持Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;鲜花网、花店网站、本地生活电商 作品特色 本作品为「鲜花购物商城」网站模板&#xff0c;高保真高交互&#xff0c;属于O2O本地生活电…

【k8s】deamonset文件和说明

目录 deamonset的相关命令 deamonset的定义 deamonset的使用场景 deamonset的例子 deamonset字段说明 serviceAccountName DaemonSet的结构及其各个部分的作用 deamonset的相关命令 #查看<name-space>空间内有哪些deamonset kubectl get DaemonSet -n <na…

华为OD机试 - 两个字符串间的最短路径问题(Java JS Python C)

题目描述 给定两个字符串,分别为字符串 A 与字符串 B。 例如 A字符串为 "ABCABBA",B字符串为 "CBABAC" 可以得到下图 m * n 的二维数组,定义原点为(0,0),终点为(m,n),水平与垂直的每一条边距离为1,映射成坐标系如下图。 从原点 (0,0) 到 (0,A) 为水…

普中STM32-PZ6806L开发板(HAL库函数实现-USART2 中断接收)

简介 实现USART2 的 中断接收&#xff0c; 发送数据。电路原理图 USART2接线 原理图USART2 在主芯片引脚 实物图 其他知识 APIs stm32f1xx_hal_uart.h /* 堵塞发送, pData是发送数据, Size发送数据大小, Timeout是超时时间 */ HAL_StatusTypeDef HAL_UART_Transmit(UAR…

md文件图片上传方案:Github+PicGo 搭建图床

文章目录 1. PicGo 下载2. 配置Github3. 配置PicGo4. PicGo集成Typora4.1 picGo监听端口设置 5. 测试 1. PicGo 下载 下载地址&#xff1a;https://molunerfinn.com/PicGo/ 尽量下载稳定版本 2. 配置Github 1. 创建一个新仓库&#xff0c;用于存放图片 2. 生成一个token&a…

数据库——SQL DDLDML使用

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机&#xff0c;在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作&#xff1a; &#xff08;1&#xff09;登录 MySQL&#xff0c;在 MySQL 中创建用户&#xff0c;…

[密码学]ECC加密

椭圆曲线加密 Ellipse Curve Cryptography 椭圆曲线上的离散对数问题 Ellipse Curve Discrete logarithm Problem 椭圆曲线 注意积分公式的分母&#xff0c;椭圆曲线由此得名。这种曲线和椭圆一点不像。 离散对数&#xff1a; yg^x mod p,对于给定的g,x,p求y很容易&#…

JVM工作原理与实战(三):字节码文件的组成

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、基础信息 1.Magic魔数 2.主副版本号 3.其他信息 二、常量池 1.案例解析 三、方法 1.方法介绍 2.案例解析 四、字段 五、属性 总结 前言 JVM作为Java程序的运行环境&…

【致远OA】获取指定人员的协同已办列表

接口说明 按人员编码获取所有待办事项&#xff08;V6.0接口更新:不在传入ticket&#xff0c;改为传memberId人员ID&#xff09; 兼容版本 since V7.0 请求方式 V6.0之前http请求方式&#xff1a;GET http://ip:port/seeyon/rest/affairs/done 如 http://127.0.0.1/seeyon/…

Builder建造者模式(对象创建)

Builder 链接&#xff1a;建造者模式实例代码 解析 目的 在软件系统中&#xff0c;有时候面临着“一个复杂对象”的创建工作&#xff0c;其通常由各个部分的子对象用一定的算法构成&#xff1b;由于需求的变化&#xff0c;这 个复杂对象的各个部分经常面临着剧烈的变化&…

深入理解C#中的隐式类型转换

深入理解C#中的隐式类型转换 在C#中&#xff0c;类型转换可以是显式的或隐式的。理解这些转换的工作原理对于编写高效、可维护的代码至关重要。本文将深入探讨C#中的隐式类型转换&#xff0c;特别关注赋值操作符&#xff08;&#xff09;在隐式转换中的角色&#xff0c;并对比C…

FL Studio 21最新版本for mac 21.2.2.3740中文解锁版2024最新图文安装教程

FL Studio 21最新版本for mac 21.2.0.3740中文解锁版是最新强大的音乐制作工具。它可以与所有类型的音乐一起创作出令人惊叹的音乐。它提供了一个非常简单且用户友好的集成开发环境&#xff08;IDE&#xff09;来工作。这个完整的音乐工作站是由比利时公司 Image-Line 开发的。…

三种方式在ASP.NET Core中实现代理功能请求获取数据的接口(以请求百度统计数据接口为例)

一、定义请求数据属性 TargetUrl参数是目标接口的URL&#xff0c;RequestDataArray参数是要发送的请求数据列表 //定义属性:TargetUrl参数是目标接口的URL&#xff0c;RequestDataArray参数是要发送的请求数据列表public class ToResponseBody{[JsonPropertyName("Target…

安装 Node.js、npm

安装 nodejs 安装Node.js的最简单的方法是通过软件包管理器。 Node.js官网&#xff1a;https://nodejs.org/en/download/ cd /usr/local/src/wget -c https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz xz -d node-v18.16.0-linux-x64.tar.xz tar -xf node…