整合阿裡雲簡訊服務 SpringBoot

来源:https://www.cnblogs.com/m13002622490/archive/2022/03/22/16038951.html
-Advertisement-
Play Games

來源:blog.csdn.net/cold___play/article/details/108032204 Nacos架構 Provider APP:服務提供者 Consumer APP:服務消費者 Name Server:通過VIP(Virtual IP)或DNS的方式實現Nacos高可用集群的 ...


  • 准备工作
    • 开通短信服务(可参考博主的“手机短信验证码”)
    • 如果开通不成功,就只能借下别人已经开通好的短信,如果不想重复,可在其下创建一个新的模板管理
    • 这里只是介绍如何使用
  • 导入依赖
<!--aliyun-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.1</version>  
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version> 
</dependency>

发送验证码到手机上,验证码生成工具类(内容较为固定,也可根据需求改)

package com.xsha.msmservice.utils;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

/**
 * 说明:短信配置
 * 作者:FH Admin
 * from:fhadmin.cn
 */
public class RandomUtil {

	private static final Random random = new Random();

	private static final DecimalFormat fourdf = new DecimalFormat("0000");

	private static final DecimalFormat sixdf = new DecimalFormat("000000");

	public static String getFourBitRandom() {
		return fourdf.format(random.nextInt(10000));
	}

	public static String getSixBitRandom() {
		return sixdf.format(random.nextInt(1000000));
	}

	/**
	 * 给定数组,抽取n个数据
	 * @param list
	 * @param n
	 * @return
	 */
	public static ArrayList getRandom(List list, int n) {

		Random random = new Random();

		HashMap<Object, Object> hashMap = new HashMap<Object, Object>();

		// 生成随机数字并存入HashMap
		for (int i = 0; i < list.size(); i++) {

			int number = random.nextInt(100) + 1;

			hashMap.put(number, i);
		}

		// 从HashMap导入数组
		Object[] robjs = hashMap.values().toArray();

		ArrayList r = new ArrayList();

		// 遍历数组并打印数据
		for (int i = 0; i < n; i++) {
			r.add(list.get((int) robjs[i]));
			System.out.print(list.get((int) robjs[i]) + "\t");
		}
		System.out.print("\n");
		return r;
	}
}

发送验证码,验证码是有有效时间的(时间可以自己设置)

这里可以创建常量类读取配置文件的阿里云密钥等信息(可参考博主的“对象存储”)

package com.xsha.msmservice.service.impl;

import com.alibaba.fastjson.JSONObject;
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.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.xsha.msmservice.service.MsmService;
import com.xsha.msmservice.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 说明:短信配置
 * 作者:FH Admin
 * from:fhadmin.cn
 */
@Service
public class MsmServiceImpl implements MsmService {

    // 注入redis缓存对象
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public boolean sendMessage(String phone) {
        if(StringUtils.isEmpty(phone)) return false;
        // 先获取手机号对应的验证码(该验证码没过期)
        String code = redisTemplate.opsForValue().get(phone);
        if(!StringUtils.isEmpty(code)) {
            return true;
        }
        // 过期则生成随机验证码,并在发送之后向redis中存入手机号对应的验证码
        code = RandomUtil.getFourBitRandom();
        Map<String, Object> map = new HashMap<>();
        map.put("code", code);

        // 设置短信配置
        DefaultProfile profile = DefaultProfile.getProfile("your region", "your accessId", "your accessSecret");

        IAcsClient client = new DefaultAcsClient(profile);

        SendSmsRequest request = new SendSmsRequest();
        request.setPhoneNumbers(phone);//接收短信的手机号码
        request.setSignName("your signature name");//短信签名名称
        request.setTemplateCode("your template");//短信模板CODE
        request.setTemplateParam(JSONObject.toJSONString(map));//短信模板变量对应的实际值

        try {
            SendSmsResponse response = client.getAcsResponse(request);
            // 发送短信,尽量打印出来是否发送成功
            new Gson().toJson(response);
            // 将验证码放置在redis缓存中,并设置5分钟有效时间,最后一个参数是单位
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
        } catch (ServerException e) {
            e.printStackTrace();
            return false;
        } catch (ClientException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 本文將解決以下問題: 如何將Linux下任意位置的項目(虛擬目錄)部署到tomcat? 如何將項目部署到伺服器特定埠? 如何在一個伺服器上部署多個web應用? 本例中 系統:Linux version 3.10.0-514.el7.x86_64、tomcat版本:8.0.30.0、jdk 版 ...
  • 在使用 Python 列表時, 出現了修改其中一個列表, 其他列表聯動改變這個情況, 在查閱文檔後, 寫在這裡記錄一下. 出現這個情況的原因是因為我使用了 a = b 這個賦值語句, 我下意識的認為 a, b 是兩個不同的對象, 其實在 Python 一切都是對象, 所謂的變數, 只是指向一個對象的 ...
  • 今天這篇博客也是學習springboot做的學習筆記,關於springboot集成redis,分享給有需要的小伙伴們,視頻看的動力節點 動力節點王鶴老師講解的springboot教程,由淺入深,帶你體驗Spring Boot的極速開發過程,內容豐富,涵蓋了SpringBoot開發的方方面面,並且同步 ...
  • 我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就添加一個"javaee"元素,請寫代碼實現。 1 package cn.itcast_04; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 ...
  • 小二是新來的實習生,作為技術 leader,我給他安排了一個非常簡單的練手任務,把前端 markdown 編輯器里上傳的圖片保存到伺服器端,結果他真的就把圖片直接保存到了伺服器上,這下可把我氣壞了,就不能搞個對象存儲服務,比如說 OSS、MinIO? 他理直氣壯地反駁道:“誰讓你不講清楚,我去找老闆 ...
  • 在大學,有很多喜歡的課是需要搶的。但是,這個課的人數和座位都是有限的,今天這個教程教你如何搶到座位,有座位了還怕聽不到課嗎?趕緊學起來吧,真的很有用噢! 0. 效果 座位選擇框 1. 關於所需庫 Python 環境中需要安裝下列 python 包: 1.PySide2 2.datetime 3.js ...
  • 最近幾年,Java 的技術棧發展的非常快,成百上千的技術工具正不斷地涌出來,這也造成了一個問題: 我們作為開發者,到底應該選哪些工具搭建出最合適的技術棧呢? 今天我就推薦一波我常用的、我瞭解的工具和框架。 一、項目工具 1.1 IDE 主流的 Java 開發工具現在非 IntelliJ IDEA 莫 ...
  • 《零基礎學Java》 常用面板 面板也是一個Swing容器,可以作為容器容納其他組件,但是它必須被添加到其他容器中。Swing中常用的面板有 JPamel面板 和 JScrollPane面板。 JPamel面板 JPamel面板 是一個容器(繼承自java.awt.Container類)。JPame ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...