【Java】阿里云短信发送功能实现

讲一下怎么在java项目中使用阿里云的短信服务 请将上述代码中的"your-accessKeyId"、"your-accessKeySecret"和"your-regionId"替换为您的实际AccessKey ID、AccessKey Secret和区域ID。您可以根据具体需求,在发送短信时设置更多的参数,例如短信签名、短信模板等。步骤2:创建AccessKey 登录阿里云控制台,创建一个AccessKey以便在代码中验证身份。步骤1:注册阿里云账号 如果您还没有阿里云账号,您需要先注册一个账号,并购买短信服务。 阅读详情

前言

在移动端,我们除了使用账号密码、第三方社交平台账号(例如:微信、QQ、微博等)这几种登录方式以外,也会通过手机短信验证码的方式来做登录。
博主最近正在做移动端的手机短信验证登录。原本为了简单起见,选用的是某个不知名科技公司的短信服务,但是收费贵,服务也不太稳定等一系列问题的出现,导致博主开始另寻他路。

短信服务选择

博主挑选了几家大公司的短信服务,以下为各服务官网的产品价格:

在参考了各个服务的费用以及公司系统用户量等具体情况以后,博主最终选择了 阿里云短信服务 。

阿里云短信配置

在我们实现 阿里云短信发送API 之前,其实在阿里云平台上还有一系列的操作需要我们去申请、配置等(例如:开通短信服务、获取AccessKey、创建短信的签名和模板等等)。但是这些并不是本文的重点,所以博主这里不做详细的叙述。
大家可以自行参考阿里云提供的 短信服务文档使用指引,根据步骤操作。

API所需配置提取

假设上述配置操作大家已完成,博主这里用公司已注册好的模板举个例子。我们需要提取记录的配置有以下几种:

  • AccessKeyID和AccessKeySecret: 关于这个内容大家自行参考官方文档 如何获取AccessKeyID和AccessKeySecret,步骤写的也比较详细,博主在这里就不做过多的叙述。
  • 签名名称: 打开阿里短信服务管理控制台,按顺序点开:国内消息->签名管理,我这里选用阿里赠送的签名 阿里云短信测试专用 。
图1 获取签名名称
  • 模板CODE和内容: 打开阿里短信服务管理控制台,按顺序点开:国内消息->模板管理->点击对应模板操作中的详情,我这里选用阿里赠送的 身份验证验证码 模板。
图2 获取模板CODE和内容

对以上的内容先做记录,因为后续在代码中我们相应会用到。

代码实现

基本的工作已经做完了,下面我们来看下具体代码的实现

1.添加依赖

	<!-- 阿里云短信服务sdk -->
	<dependency>
	    <groupId>com.aliyun</groupId>
	    <artifactId>aliyun-java-sdk-core</artifactId>
	    <version>3.3.1</version>
	</dependency>
	<dependency>
	    <groupId>com.aliyun</groupId>
	    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
	    <version>1.1.0</version>
	</dependency>

2.阿里云短信构造类

博主这里采用链式的写法,代码中的accessKeyId 和 accessKeySecret 需要替换成我们从云平台提取的对应值。

/**
 * 阿里云短信构造类
 * Created by Hilox on 2018/11/22 0022.
 */
public class AliSmsBuilder implements Serializable {

    private static final long serialVersionUID = -8277819898310935813L;

    /**
     * 阿里云短信服务accessKeyId
     */
    private String accessKeyId;

    /**
     * 阿里云短信服务accessKeySecret
     */
    private String accessKeySecret;

    /**
     * 必填:待发送手机号
     */
    private String phoneNum;

    /**
     * 必填:短信签名-可在短信控制台中找到
     */
    private String signName;

    /**
     * 必填:短信模板-可在短信控制台中找到
     */
    private String templateCode;

    /**
     * 可选:验证码
     */
    private String verifyCode;

    /**
     * 可选:上行短信扩展码(无特殊需求用户请忽略此字段)
     */
    private String smsUpExtendCode;

    /**
     * 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
     */
    private String outId;

    private String defaultConnectTimeout;

    private String defaultReadTimeout;

    public AliSmsBuilder() {
        // 默认初始化
        accessKeyId = "***";   // 替换成自己的阿里云短信accessKeyId
        accessKeySecret = "***";   // 替换成自己的阿里云短信accessKeySecret
        this.defaultConnectTimeout = "10000";
        this.defaultReadTimeout = "10000";
    }

    public AliSmsBuilder(String accessKeyId, String accessKeySecret) {
        // 自定义初始化
        this.accessKeyId = accessKeyId;
        this.accessKeySecret = accessKeySecret;
    }

    public AliSmsBuilder setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
        return this;
    }

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public AliSmsBuilder setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
        return this;
    }

    public String getDefaultConnectTimeout() {
        return defaultConnectTimeout;
    }

    public AliSmsBuilder setDefaultConnectTimeout(String defaultConnectTimeout) {
        this.defaultConnectTimeout = defaultConnectTimeout;
        return this;
    }

    public String getDefaultReadTimeout() {
        return defaultReadTimeout;
    }

    public AliSmsBuilder setDefaultReadTimeout(String defaultReadTimeout) {
        this.defaultReadTimeout = defaultReadTimeout;
        return this;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public AliSmsBuilder setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
        return this;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public AliSmsBuilder setSignName(String signName) {
        this.signName = signName;
        return this;
    }

    public String getSignName() {
        return signName;
    }

    public AliSmsBuilder setTemplateCode(String templateCode) {
        this.templateCode = templateCode;
        return this;
    }

    public String getTemplateCode() {
        return templateCode;
    }

    public AliSmsBuilder setVerifyCode(String verifyCode) {
        this.verifyCode = verifyCode;
        return this;
    }

    public String getVerifyCode() {
        return verifyCode;
    }

    public AliSmsBuilder setSmsUpExtendCode(String smsUpExtendCode) {
        this.smsUpExtendCode = smsUpExtendCode;
        return this;
    }

    public String getSmsUpExtendCode() {
        return smsUpExtendCode;
    }

    public AliSmsBuilder setOutId(String outId) {
        this.outId = outId;
        return this;
    }

    public String getOutId() {
        return outId;
    }

    @Override
    public String toString() {
        return "AliSmsBuilder{" +
                "accessKeyId='" + accessKeyId + '\'' +
                ", accessKeySecret='" + accessKeySecret + '\'' +
                ", phoneNum='" + phoneNum + '\'' +
                ", signName='" + signName + '\'' +
                ", templateCode='" + templateCode + '\'' +
                ", verifyCode='" + verifyCode + '\'' +
                ", smsUpExtendCode='" + smsUpExtendCode + '\'' +
                ", outId='" + outId + '\'' +
                ", defaultConnectTimeout='" + defaultConnectTimeout + '\'' +
                ", defaultReadTimeout='" + defaultReadTimeout + '\'' +
                '}';
    }

    /**
     * 发送短信消息
     * @return
     * @throws ClientException
     */
    public String send() throws ClientException {
        return AliSmsSDK.getInstance().sendSmsAli(this);
    }
}

3.阿里云短信SDK

在这里有一点要强调下,我们从平台提取的短信模板内容为 验证码${code},您正在进行身份验证,打死不要告诉别人哦!,所以在以下代码当中我们设置模板参数的JSON串的代码为 request.setTemplateParam("{\"code\":\"" + 变量替换值 + "\"}"); 同理,如果你的模板内容是 亲爱的${name},您的验证码为${code} 那么在代码当中我们设置模板参数的JSON串的代码应该是 request.setTemplateParam("{\"name\":\"" + 变量替换值 + "\", \"code\":\"" + 变量替换值 + "\"}"); 。阿里云对于变量替换值也是有要求的:变量替换值<=6位数字或字母。
换句话说以上JSON串该如何写,主要还是看你的模板内容如何配置。当然 request.setTemplateParam("{\"code\":\"" + 变量替换值 + "\"}"); 这段代码也可以忽略(只要对应的模板内容不配置占位符),因为这并不是必须的。

/**
 * 阿里云短信SDK
 * Created by Hilox on 2018/11/22 0022.
 */
@Slf4j
public class AliSmsSDK {

    // 产品名称:云通信短信API产品,开发者无需替换
    private static final String product = "Dysmsapi";
    // 产品域名,开发者无需替换
    private static final String domain = "dysmsapi.aliyuncs.com";

    /**
     * 私有化构造
     */
    private AliSmsSDK() {}

    /**
     * 静态内部类
     */
    private static class AliSmsSDKHolder {
        private static final AliSmsSDK INSTANCE = new AliSmsSDK();
    }

    /**
     * 选用静态内部类实现单例:
     *     1.防止懒汉式单例多线程额外开销
     *     2.防止饿汉式单例内存资源浪费
     * @return
     */
    public static final AliSmsSDK getInstance() {
        return AliSmsSDKHolder.INSTANCE;
    }

    /**
     * 发送短信验证码(阿里云短信平台)
     * @param aliSmsBuilder
     * @return
     */
    public String sendSmsAli(AliSmsBuilder aliSmsBuilder) throws ClientException {

        log.info("==== 开始发送短信验证码消息体: {} =====", aliSmsBuilder.toString());

        // 设置超时时间-可自行调整
        System.setProperty("sun.net.client.defaultConnectTimeout", aliSmsBuilder.getDefaultConnectTimeout());
        System.setProperty("sun.net.client.defaultReadTimeout", aliSmsBuilder.getDefaultReadTimeout());

        // 初始化acsClient, 暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", aliSmsBuilder.getAccessKeyId(), aliSmsBuilder.getAccessKeySecret());
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        // 组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
        // 必填:待发送手机号
        request.setPhoneNumbers(aliSmsBuilder.getPhoneNum());
        // 必填:短信签名-可在短信控制台中找到
        request.setSignName(aliSmsBuilder.getSignName());
        // 必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(aliSmsBuilder.getTemplateCode());

        String verifyCode = aliSmsBuilder.getVerifyCode();
        // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
        if (!StringUtils.isEmpty(verifyCode)) {
            request.setTemplateParam("{\"code\":\"" + verifyCode + "\"}");
        }

        String smsUpExtendCode = aliSmsBuilder.getSmsUpExtendCode();
        // 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
        if (!StringUtils.isEmpty(smsUpExtendCode)) {
            request.setSmsUpExtendCode(smsUpExtendCode);
        }

        String outId = aliSmsBuilder.getOutId();
        // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        if (!StringUtils.isEmpty(outId)) {
            request.setOutId(outId);
        }

        //hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        String code = sendSmsResponse.getCode();

        log.info("==== 发送短信验证码成功, 返回code: {} =====", code);
        return code;
    }
}

4.阿里短信验证码返回code枚举

/**
 * 阿里短信验证码返回code列表
 * Created by Hilox on 2018/11/13 0013.
 */
public enum AliSmsCodeEnum {

    OK("OK", "请求成功"),
    RAM_PERMISSION_DENY("isp.RAM_PERMISSION_DENY", "RAM权限DENY"),
    OUT_OF_SERVICE("isv.OUT_OF_SERVICE", "业务停机"),
    PRODUCT_UN_SUBSCRIPT("isv.PRODUCT_UN_SUBSCRIPT", "未开通云通信产品的阿里云客户"),
    PRODUCT_UNSUBSCRIBE("isv.PRODUCT_UNSUBSCRIBE", "产品未开通"),
    ACCOUNT_NOT_EXISTS("isv.ACCOUNT_NOT_EXISTS", "账户不存在"),
    ACCOUNT_ABNORMAL("isv.ACCOUNT_ABNORMAL", "账户异常"),
    SMS_TEMPLATE_ILLEGAL("isv.SMS_TEMPLATE_ILLEGAL", "短信模板不合法"),
    SMS_SIGNATURE_ILLEGAL("isv.SMS_SIGNATURE_ILLEGAL", "短信签名不合法"),
    INVALID_PARAMETERS("isv.INVALID_PARAMETERS", "参数异常"),
    SYSTEM_ERROR("isp.SYSTEM_ERROR", "系统错误"),
    MOBILE_NUMBER_ILLEGAL("isv.MOBILE_NUMBER_ILLEGAL", "非法手机号"),
    MOBILE_COUNT_OVER_LIMIT("isv.MOBILE_COUNT_OVER_LIMIT", "手机号码数量超过限制"),
    TEMPLATE_MISSING_PARAMETERS("isv.TEMPLATE_MISSING_PARAMETERS", "模板缺少变量"),
    BUSINESS_LIMIT_CONTROL("isv.BUSINESS_LIMIT_CONTROL", "业务限流"),
    INVALID_JSON_PARAM("isv.INVALID_JSON_PARAM", "JSON参数不合法,只接受字符串值"),
    BLACK_KEY_CONTROL_LIMIT("isv.BLACK_KEY_CONTROL_LIMIT", "黑名单管控"),
    PARAM_LENGTH_LIMIT("isv.PARAM_LENGTH_LIMIT", "参数超出长度限制"),
    PARAM_NOT_SUPPORT_URL("isv.PARAM_NOT_SUPPORT_URL", "不支持URL"),
    AMOUNT_NOT_ENOUGH("isv.AMOUNT_NOT_ENOUGH", "账户余额不足"),
    ;

    private String code;

    private String msg;

    AliSmsCodeEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    /**
     * 根据code获取msg
     * @param code
     * @return
     */
    public static String getMsgByCode(String code) {
        if (StringUtils.isEmpty(code)) {
            return null;
        }
        AliSmsCodeEnum[] values = AliSmsCodeEnum.values();
        for (AliSmsCodeEnum aliSmsCodeEnum : values) {
            if (aliSmsCodeEnum.getCode().equals(code)) {
                return aliSmsCodeEnum.getMsg();
            }
        }
        return null;
    }
}

5.测试用例

博主在这里简单的写了个测试用例,后续调用方式大家可以从这里做参考。
对应的值需要替换成从云平台提取出来的相应值。

/**
 * 测试用例模板
 * Created by Hilox on 2018/11/22 0022.
 */
public class AliSmsSDKTest {

    @Test
    public void sendSmsAli() {
        AliSmsBuilder aliSmsBuilder = new AliSmsBuilder();
        String code;
        try {
            code = aliSmsBuilder.setPhoneNum("150****8879")    // 替换成自己的手机号
                    .setSignName("阿里云短信测试专用")  // 替换成自己的阿里云短信服务签名
                    .setTemplateCode("SMS_108565014") // 替换成自己的阿里云短信模板编号
                    .setVerifyCode("Hilox") // 替换成自己随机生成的验证码
                    .send();
        } catch (ClientException e) {
            e.printStackTrace();
            // 短信发送异常提示
            return;
        }

        // 短信异常码处理
        if (code == null || !"OK".equals(code)) {
            String errorMsg = AliSmsCodeEnum.getMsgByCode(code);
            if (!StringUtils.isEmpty(errorMsg)) {
                // 对应短信异常错误提示
                return;
            }
            // 短信发送异常提示
        }
    }
}

源码传送门

【源码地址】:sms-ali

测试效果展示

图3 测试效果展示
java使用阿里云平台实现发送短信验证码功能 在我们生活中,使用的各种各样的网站、APP在登录、注册、支付、修改密码等需要进行安全验证的地方都要进行短信的验证。 一、实现思路: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 二、流程 客户输入手机号后,点击发送验证码,向服务器发送请求 服务器接收到请求后,获取到客户的手机号,并随机生成验证码,将验证码存储起来,有了手机号和验证码,向运营商发起发送短信的请求 运营商向客户手机发送短信 客户将收到接收到的验证码填写之后,点击提交,向服务器发起请求,判断发送的和客户输入的是否相同。 阅读详情

相关推荐

JAVA 实现阿里云短信发送功能

目录 1、引入依赖 2、添加.yml配置 3、短信接口开发 4、接口调用

H_bbo的博客 2374

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

本文主要是整理最近写阿里云短信发送功能,把经验和踩的坑分享给大家,欢迎前来指正交流!

CharCase的博客 2万+

如何利用阿里云短信服务来发送验证码

在项目中,如果要实现短信发送功能,我们无需自己实现,也无需和运营商直接对接,只需要调用 第三方提供的短信服务即可。目前市面上有很多第三方提供的短信服务,这些第三方短信服务会和各个 运营商(移动、联通、电信)对接,我们只需要按照提供的开发文档进行调用就可 以发送短信。这些短信服务一般都是收费服务。

2301_81028896的博客 1800

java使用阿里云的短信服务

java借助腾讯云实现短信验证码的发送

weixin_45441597的博客 1666

枚举 枚举和接口的使用 自定义返回code

为什么使用枚举 因为我们在调用接口返回数据时,同时需要错误数据的状态码和描述,这时,就需要用到了枚举,我们可以在枚举定义好返回码和描述信息,供前台用户使用。 定义枚举类 package testEnum; public interface BaseEnum { /** * 返回的错误代码 * * @return */ ......

念兮为美 3916

java实现的阿里云短信服务发送短信功能

阿里云短信服务SendSms 今天的主角是我们的阿里云提供的云短信服务。我们简单地看一下他是如何给我们提供服务的呢? 前提 发送前我们需要首先申请短信签名和短信模板。而且还要确保签名和模板已经审核通过。 使用说明 我们使用的是单条发送短信服务,特殊情况下也对群发小支持一下。(最多1000个手机号码发送同样的内容),而且群反会有延迟。 如果需要在一次请求中分别向多个不同的手机号发送不同签名和模板内容短信,使用他的另一个接口SendBatchSms。这是他的批量发送接口 当验证码签名和通用签名名称相同的时候,系统会优先默认使用通用签名发送短信。

Java实现短信发送功能(阿里云服务+SpringBoot)

Java实现短信发送功能(阿里云服务) 温馨提示: 需要成本(本人充值了1元) 信息别泄露!信息别泄露!信息别泄露! 个人使用的是SpringBoot来做的 1. 准备阿里云账号 这里就不再示范 代码中需要用到:Access_key_id,Secret 2. 开通阿里云短信服务 2.1 短信签名申请 注意:代码中的许多参数和这里面是对应的 2.2 短信模板申请 3. 具体实现 3.1 导包 <!--阿里云短信服务--> <dependency>

ZWulle的博客 654

vos如何对接okcc(保姆级教程)

1.添加账户 点击 系统->账户管理 [图片] 2.创建费率 系统->费率管理 点击添加

qq_46333281的博客 3455

JAVA实战:借助阿里云实现短信发送功能

在如今的很多应用场景中,短信发送功能是必不可少的,比如用户注册验证、密码找回等等。阿里云提供了便捷可靠的短信服务,今天我们就来详细讲讲如何在 Java 项目中利用阿里云来发送短信。

qq_48131648的博客 1758

迪文屏【0】——从零搭建工程:图片显示、文本变量配置与串口数据交互实战

本文以迪文屏T5L系列为例,详细介绍了从零搭建HMI工程的完整流程。内容涵盖硬件软件准备、DGUS工程创建、背景图片显示、文本变量配置,并重点演示了如何通过串口指令实时修改屏幕数据变量,实现动态交互。旨在帮助开发者快速掌握迪文屏开发的核心步骤与数据交互方法。

alpha的博客 350

手把手教你用C#实现TwinCAT 3 ADS通讯(附完整代码示例)

本文详细解析了如何使用C#实现TwinCAT 3 ADS通讯,包括协议核心价值、开发环境配置、变量通信实践及高级应用场景。通过完整代码示例和性能优化技巧,帮助开发者高效实现工业自动化系统中的实时数据交换,特别适合倍福(Beckhoff)平台用户。

weixin_29230901的博客 118

Java实现阿里云短信发送功能

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

PSW_18722821243的博客 250

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5861

java 阿里云 发送短信功能实现

java代码实现发送短信功能,已阿里云短信服务为例。短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力。调用API或用群发AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限,我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。常用短信服务平台:阿里云、华为云、腾讯云、京东、梦网、乐信等。

10JQKA的博客 2084

基于python+flask框架的基于微信小程序的CR公司建设项目信息管理系统-前台(开题+程序+论文) 计算机毕设

特别是随着移动互联网技术的普及,企业对便捷、高效的信息管理系统的需求日益迫切。另一方面,该系统集成了仓管、物料、财务、人事、供应商等多个模块,实现了数据的集中管理和信息共享,有助于企业实现精细化管理,降低运营成本,提升决策效率。:深入调研CR公司的业务需求,明确系统应具备的功能模块,包括仓管员管理模块(物料信息、退回记录、申请信息、仓库信息管理)、财务员管理模块(资金信息管理、采购与租赁款项处理)、人事管理模块、供应商管理模块、项目管理模块(项目信息、设备采购、物料采购、设备租赁)、以及考勤打卡模块等。

zhihao503的博客 960

浏览器Cookie迁移实战:从Chrome导出导入登录态全攻略

Cookie是浏览器保存的会话凭证,服务端通过Set-Cookie将登录态种在本地。迁移Cookie本质上是把服务端认可的会话标识搬到新环境,从而免去重复输入账号密码和二次验证的麻烦。在换电脑、切浏览器或重装系统时,掌握Cookie的导出导入技术能显著提升效率。Chrome与Edge同属Chromium内核,存储结构相似,但字段差异(如Domain、SameSite、Secure)常导致迁移失败。通过浏览器扩展或CDP脚本可实现跨浏览器登录态迁移,适用于内网后台、开发环境等场景。本文从原理到实践,梳理Coo

weixin_42533120的博客 344

java通过阿里云短信服务实现发送短信功能

首先在阿里云的控制台里面进入短信服务中 申请签名和模板 审核成功后在这里就可以发送短信了 当然我们的目的是在我们的程序中使用可以点击下面的查看API Demo查看 注意上线的签名和模板都要签好点进去就是直接写好在表单里面的。 这里在阿里云的平台里会自动读取账号的accessKeyId和accessSecret在我们自己的程序汇总是没有的,所以我们要申请accessKeyId和access...

qq_24095055的博客 3570

Fluent 中多相流模型全面解析

3.颗粒或液滴在连续相中的运动:若关注颗粒或液滴在连续相中的运动轨迹、分布规律以及与连续相的相互作用,如喷雾干燥、气力输送等过程,Eulerian-Lagrangian 模型则是最佳选择。Eulerian-Eulerian 模型可以准确模拟气体在固体颗粒中的流动情况,包括颗粒的流化状态、气体与颗粒之间的传热传质过程,为气固流化床的优化设计和操作提供依据。通过该模型,可以了解混合器内不同位置的混合程度、颗粒的运动轨迹以及液固相间的相互作用,从而改进混合器的结构和操作条件,提高混合效率。

khhdp的博客 3087

阿里云短信服务 Java实现发送短信功能(代码示例)

阿里云短信功能实现

BUG-制造机 6196

广东省道路工程检测练习试题(判断题)真题

按下式计算小于某粒径颗粒质量百分数:X=(A/B)x100( )49.、挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测。95.挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测( )107.以干密度 pd 为纵坐标,含水率w为横坐标,绘 pd-w 关系曲线,曲线上峰值点的纵、横坐标分别为最大干密度和最佳含水率( )

ZShy001238的博客 685

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java短信验证码功能发送的验证码如何校验_干货实战-Spring Boot实现阿里云SMS短信发送功能...

“短信发送”功能在企业应用系统开发中应该说算是很常见的了,典型的案例 如 “用户登录时可以通过手机号接收平台发送的验证码进行登录”、“用户通过手机号接收平台发送的短信验证码从而找回密码”、“双重验证用户身份时需要用手机号接收平台发送的验证码已确认用户身份”等等都是比较常见的,本文将基于阿里云SMS短信发送服务 在Java Spring Boot应用系统实现短信发送功能移动互联网时代,几乎人人都有部...

weixin_42513215的博客 421

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot整合阿里云SMS短信服务 并实现发送短信验证码的功能 Redis Java 短信验证码

SpringBoot整合阿里云SMS短信服务 并实现发送短信验证码的功能 简单简介 短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力。 调用API或用群发助手,即可发送验证码、通知类和营销短信; 国内验证短信秒级触达,到达率99%; 国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受出海企业选用。 本次用到的技术 需要熟悉 Spri...

yufire的博客 3006

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

大雾起了清晨 5394

在Java中实现发送短信的功能 通过第三方服务提供商(Alibaba Cloud, Tencent Cloud)

是的,通过第三方服务提供商实现短信发送功能是一种常见的方式。以下是使用阿里云(Alibaba Cloud)的短信服务SDK来发送短信的一个简单示例。你需要先注册阿里云账号,并在阿里云控制台上创建一个短信签名和模板,获取AccessKey ID和AccessKey Secret,以便能够调用其短信服务API。请确保在实际部署之前已经正确配置了阿里云账号,并且遵循所有相关的法律和条款。此外,不同的国家和地区可能有关于短信发送的不同规定,请确保你的操作符合当地法律法规。首先,你需要在项目中引入阿里云的SDK。

qq_33240556的博客 651

JAVA发送短信业务-【使用阿里云短信】

JAVA发送短信业务-【使用阿里云短信】 在很多开发过程中都需要发送短信验证码(登录验证码,注册验证码等等),所以今天学习了一下java发送短信验证码功能 让我们开始吧 发送验证码我们需要一个发送短信业务的平台 我这里使用的阿里云的短信平台 首先你需要有一个阿里云账号 这里就不多介绍了,很简单 我们搜索短信服务 我们点击右上角用户 我们创建一个用户组 以及用户 注意这里创建的用户AccessKey ID 和 AccessKey Secret 一定要自己保存好 后面再查Secret就查

qq_43483502的博客 495
上一篇: 【SpringBoot】集成JWT实现用户认证
下一篇: 【Java】代码结构设计思考
黑豪Horace
博客等级 码龄10年 85粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值