大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java實(shí)現(xiàn)短信驗(yàn)證的方法

Java實(shí)現(xiàn)短信驗(yàn)證的方法

更新時(shí)間:2022-07-12 11:50:53 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1266次

Java實(shí)現(xiàn)短信驗(yàn)證的方法是什么?動(dòng)力節(jié)點(diǎn)小編來(lái)告訴大家。

1.短信接口平臺(tái)

首先需要一個(gè)短信接口平臺(tái),才能進(jìn)行發(fā)短信的操作,網(wǎng)上一搜有很多,但是很多只送了幾條免費(fèi)的次數(shù),根本不夠使用。然后發(fā)現(xiàn)騰訊云也有這個(gè)服務(wù),一下送了200條,用完了還是得自己買。不過(guò)現(xiàn)在測(cè)試,200條夠用了。

短信接口平臺(tái)需要實(shí)名,驗(yàn)證什么的,需要申請(qǐng)短信的簽名和模板,也就是發(fā)送的標(biāo)題和內(nèi)容,需要審核。騰訊云短信地址。請(qǐng)注意寫的要求,并不是你想發(fā)送什么都可以。審核不能過(guò)。

創(chuàng)建簽名需要有個(gè)人實(shí)名的網(wǎng)站,或已發(fā)布的小程序/公眾號(hào),或已上線的APP,請(qǐng)注意!

2.依賴引入

以maven方式引入依賴jar包

com.qcloud cmq-http-client 1.0.7 com.tencentcloudapi tencentcloud-sdk-java 3.1.390

3.常量類

號(hào)內(nèi)容都需要替換為自己對(duì)應(yīng)的,在騰訊云中找到這些常量,寫入

SMSSECREID與SMSSECREKEY查詢地址:CAM密匙查詢

注意這些的填寫,一個(gè)錯(cuò)了將會(huì)導(dǎo)致發(fā)送不成功,官方文檔對(duì)于每個(gè)參數(shù)都有詳細(xì)的解釋,告訴你在哪里找到它。

/**
短信常量類
*/
public class Constants {
/**
短信 appid
*/
public static final String SMSAPPID="******";
/
騰訊云賬戶密鑰對(duì): secretId
*/
public static final String SMSSECREID="******";
/
騰訊云賬戶密鑰對(duì): secretKey
*/
public static final String SMSSECREKEY="******";
/
SmsSdkAppid
*/
public static final String SMSSDKAPPID="******";
/
sms sign : sms簽名
*/
public static final String SMSSIGN="******";
/
sms 短信模板id:
*/
public static final String SMSTEMPLATEID="********";
}

4.Service類

短信發(fā)送實(shí)現(xiàn)返回,是否發(fā)送成功的提示

package com.example.service;
import com.example.pojo.Constants;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
//導(dǎo)入可選配置類
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
// 導(dǎo)入對(duì)應(yīng)SMS模塊的client
import com.tencentcloudapi.sms.v20210111.SmsClient;
// 導(dǎo)入要請(qǐng)求接口對(duì)應(yīng)的request response類
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import org.springframework.stereotype.Service;
/**
Tencent Cloud Sms Sendsms
/
@Service
public class SendSmsService {
public String sendSms(String valcode, String[] phoneNumbers) {
try {

必要步驟:

* 實(shí)例化一個(gè)認(rèn)證對(duì)象,入?yún)⑿枰獋魅腧v訊云賬戶密鑰對(duì)secretId,secretKey。

* 這里采用的是從環(huán)境變量讀取的方式,需要在環(huán)境變量中先設(shè)置這兩個(gè)值。

* 你也可以直接在代碼中寫死密鑰對(duì),但是小心不要將代碼復(fù)制、上傳或者分享給他人,

* 以免泄露密鑰對(duì)危及你的財(cái)產(chǎn)安全。

* CAM密匙查詢: https://console.cloud.tencent.com/cam/capi*/

Credential cred = new Credential(Constants.SMSSECREID, Constants.SMSSECREKEY);

     // 實(shí)例化一個(gè)http選項(xiàng),可選,沒(méi)有特殊需求可以跳過(guò)
     HttpProfile httpProfile = new HttpProfile();
     // 設(shè)置代理

// httpProfile.setProxyHost(“host”);

// httpProfile.setProxyPort(port);

/* SDK默認(rèn)使用POST方法。

* 如果你一定要使用GET方法,可以在這里設(shè)置。GET方法無(wú)法處理一些較大的請(qǐng)求 /

httpProfile.setReqMethod(“POST”);

/ SDK有默認(rèn)的超時(shí)時(shí)間,非必要請(qǐng)不要進(jìn)行調(diào)整

* 如有需要請(qǐng)?jiān)诖a中查閱以獲取最新的默認(rèn)值 /

httpProfile.setConnTimeout(60);

/ SDK會(huì)自動(dòng)指定域名。通常是不需要特地指定域名的,但是如果你訪問(wèn)的是金融區(qū)的服務(wù)

* 則必須手動(dòng)指定域名,例如sms的上海金融區(qū)域名: sms.ap-shanghai-fsi.tencentcloudapi.com */

httpProfile.setEndpoint(“sms.tencentcloudapi.com”);

        /* 非必要步驟:
         * 實(shí)例化一個(gè)客戶端配置對(duì)象,可以指定超時(shí)時(shí)間等配置 */
        ClientProfile clientProfile = new ClientProfile();
        /* SDK默認(rèn)用TC3-HMAC-SHA256進(jìn)行簽名
         * 非必要請(qǐng)不要修改這個(gè)字段 */
        clientProfile.setSignMethod("HmacSHA256");
        clientProfile.setHttpProfile(httpProfile);
        /* 實(shí)例化要請(qǐng)求產(chǎn)品(以sms為例)的client對(duì)象
         * 第二個(gè)參數(shù)是地域信息,可以直接填寫字符串a(chǎn)p-guangzhou,或者引用預(yù)設(shè)的常量 */
        SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
        /* 實(shí)例化一個(gè)請(qǐng)求對(duì)象,根據(jù)調(diào)用的接口和實(shí)際情況,可以進(jìn)一步設(shè)置請(qǐng)求參數(shù)
         * 你可以直接查詢SDK源碼確定接口有哪些屬性可以設(shè)置
         * 屬性可能是基本類型,也可能引用了另一個(gè)數(shù)據(jù)結(jié)構(gòu)
         * 推薦使用IDE進(jìn)行開(kāi)發(fā),可以方便的跳轉(zhuǎn)查閱各個(gè)接口和數(shù)據(jù)結(jié)構(gòu)的文檔說(shuō)明 */
        SendSmsRequest req = new SendSmsRequest();
        /* 填充請(qǐng)求參數(shù),這里request對(duì)象的成員變量即對(duì)應(yīng)接口的入?yún)?
         * 你可以通過(guò)官網(wǎng)接口文檔或跳轉(zhuǎn)到request對(duì)象的定義處查看請(qǐng)求參數(shù)的定義
         * 基本類型的設(shè)置:
         * 幫助鏈接:
         * 短信控制臺(tái): https://console.cloud.tencent.com/sms/smslist
         * sms helper: https://cloud.tencent.com/document/product/382/3773 */
        /* 短信應(yīng)用ID: 短信SdkAppid在 [短信控制臺(tái)] 添加應(yīng)用后生成的實(shí)際SdkAppid,示例如1400006666 */
        String appid = Constants.SMSAPPID;
        req.setSmsSdkAppId(appid);
        /* 短信簽名內(nèi)容: 使用 UTF-8 編碼,必須填寫已審核通過(guò)的簽名,簽名信息可登錄 [短信控制臺(tái)] 查看 */
        String sign = Constants.SMSSIGN;
        req.setSignName(sign);
        /* 國(guó)際/港澳臺(tái)短信 senderid: 國(guó)內(nèi)短信填空,默認(rèn)未開(kāi)通,如需開(kāi)通請(qǐng)聯(lián)系 [sms helper] */

// String senderid = “xxx”;

// req.setSenderId(senderid);

        /* 用戶的 session 內(nèi)容: 可以攜帶用戶側(cè) ID 等上下文信息,server 會(huì)原樣返回 */

// String session = “xxx”;

// req.setSessionContext(session);

        /* 短信碼號(hào)擴(kuò)展號(hào): 默認(rèn)未開(kāi)通,如需開(kāi)通請(qǐng)聯(lián)系 [sms helper] */

// String extendcode = “xxx”;

// req.setExtendCode(extendcode);

        /* 模板 ID: 必須填寫已審核通過(guò)的模板 ID。模板ID可登錄 [短信控制臺(tái)] 查看 */
        String templateID = Constants.SMSTEMPLATEID;
        req.setTemplateId(templateID);
        /* 下發(fā)手機(jī)號(hào)碼,采用 e.164 標(biāo)準(zhǔn),+[國(guó)家或地區(qū)碼][手機(jī)號(hào)]
         * 示例如:+8613711112222, 其中前面有一個(gè)+號(hào) ,86為國(guó)家碼,13711112222為手機(jī)號(hào),最多不要超過(guò)200個(gè)手機(jī)號(hào)*/

// String[] phoneNumbers = {"+8621212313123", “+8612345678902”, “+8612345678903”};

req.setPhoneNumberSet(phoneNumbers);

       /* 模板參數(shù): 若無(wú)模板參數(shù),則設(shè)置為空*/
        String[] templateParams = {valcode};
        req.setTemplateParamSet(templateParams);
        /* 通過(guò) client 對(duì)象調(diào)用 SendSms 方法發(fā)起請(qǐng)求。注意請(qǐng)求方法名與請(qǐng)求對(duì)象是對(duì)應(yīng)的
         * 返回的 res 是一個(gè) SendSmsResponse 類的實(shí)例,與請(qǐng)求對(duì)象對(duì)應(yīng) */
        SendSmsResponse res = client.SendSms(req);
        // 輸出json格式的字符串回包
        System.out.println(SendSmsResponse.toJsonString(res));
        // 也可以取出單個(gè)值,你可以通過(guò)官網(wǎng)接口文檔或跳轉(zhuǎn)到response對(duì)象的定義處查看返回字段的定義
        //System.out.println(res.getRequestId());
    } catch (TencentCloudSDKException e) {
        e.printStackTrace();
        return "發(fā)送出了點(diǎn)問(wèn)題";
    }
    return "短信發(fā)送成功!請(qǐng)注意接收";
}

5.測(cè)試

輸入自己的手機(jī)號(hào)測(cè)試,測(cè)試正常,成功收到短信

/*
*短信測(cè)試類
*/
@Autowired
private SendSmsService sendSmsService;
@Test
void sendSms(){
sendSmsService.sendSms(“666666”, new String[] {“86***********”});
}

6.控制類

整合頁(yè)面和控制類,發(fā)送短信

從頁(yè)面輸入手機(jī)號(hào),獲取短信

再對(duì)驗(yàn)證碼進(jìn)行驗(yàn)證、提示

/*
短信驗(yàn)證碼
*/
@Autowired
private SendSmsService sendSmsService;
@RequestMapping("/getSmsCode")
public String getSmsCode(HttpSession session, String tel, Model model) {
String SmsCode = RondomCode.randomCode();
session.setAttribute(“SmsCode”,SmsCode);
String tip = sendSmsService.sendSms(SmsCode, new String[] {tel});
model.addAttribute(“tel”,tel);
model.addAttribute(“tip”,tip);
return “l(fā)ogin”;
}
@RequestMapping("/doRegister")
public String doRegister(HttpSession session,String InputSmsCode,Model model) {
String SmsCode = (String) session.getAttribute(“SmsCode”);
//限制用戶必須先輸入驗(yàn)證碼,才能提交請(qǐng)求
if (!InputSmsCode.equals(SmsCode)){
System.out.println(“驗(yàn)證碼有誤”);
model.addAttribute(“tip”,“驗(yàn)證碼有誤”);
return “l(fā)ogin”;
}
return “index”;
}

7.登錄頁(yè)

添加js增加優(yōu)化體驗(yàn),限制用戶每60秒才能點(diǎn)擊一次發(fā)送驗(yàn)證碼請(qǐng)求和對(duì)手機(jī)號(hào)格式以正則表達(dá)式效驗(yàn)

/短信按鈕JS/
c = 60;
function SmsTiming() {
$("#getSmsCode").text(c + “秒后重新獲取”);
//console.log?;
// 1秒延時(shí)調(diào)用自己
myVar = setTimeout(function () {
SmsTiming()
}, 1000);
c -= 1;
//設(shè)定條件跳出
if (c == -1) {
clearTimeout(myVar); //停止
$("#getSmsCode").removeAttr(“disabled”); //移除禁用屬性
$("#getSmsCode").text(“獲取驗(yàn)證碼”); //重新顯示按鈕
c = 60; //重新初始化 倒計(jì)時(shí)時(shí)間
}
};
//點(diǎn)擊按鈕調(diào)用,添加屬性禁用按鈕
//調(diào)用 SmsTiming()
$("#getSmsCode").click(function () {
var SmsInput = $(“input[name=‘tel’]”).val();
var smsRegExp = new RegExp("^((13[0-9])|(17[0-1,6-8])|(15[^4,\\\\D])|(18[0-9]))\\d{8}$");
if (SmsInput == null || SmsInput == ' ') {
    alert("請(qǐng)先填寫手機(jī)號(hào)!");
    return false;
} else if (!smsRegExp.test(SmsInput)) {
    alert("請(qǐng)檢查你的手機(jī)格式!");
    return false;
}
$("#getSmsCode").attr("disabled", "disabled");
SmsTiming();
return true;
});

電話: 獲取驗(yàn)證碼

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 国产伦一区二区三区四区久久 | 成人亚洲欧美综合 | 国产a不卡片精品免费观看 国产a高清 | 国产精品不卡在线 | 日本黄页网址 | 亚洲伊人精品 | 中文字幕中文字幕中中文 | 春色www在线视频观看 | 欧美在线视频免费 | 国产国语videosex另类 | 日韩在线中文字幕 | 99热这里只有成人精品国产 | 狠狠躁夜夜躁人人爽天天miya | 久久久久一区二区三区 | 再猛点深使劲爽日本免费视频 | 日韩免费一区二区 | 四虎精品永久免费 | www色综合 | 亚洲一区不卡视频 | 国产精品一级片 | 国产自产视频 | 欧洲美女高清一级毛片 | 国产在线一区二区三区欧美 | 亚洲毛片免费视频 | 国产亚洲第一 | 女人国产香蕉久久精品 | 91不卡在线精品国产 | 欧美一级特黄真人毛片 | 一男一女一级毛片 | 日本不卡中文字幕一区二区 | 国产真实乱子伦精品 | 日韩美在线 | 精品精品国产高清a毛片 | 91精品国产91热久久p | 日本老乱video | 黄色高清网站 | 香蕉视频看片 | 美女视频久久 | 欧美视频一二三区 | 成人久久18免费游戏网站 | 欧洲色网 |