更新時(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)告訴大家。
首先需要一個(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)注意!
以maven方式引入依賴jar包
com.qcloud cmq-http-client 1.0.7 com.tencentcloudapi tencentcloud-sdk-java 3.1.390
號(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="********";
}
短信發(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)注意接收";
}
輸入自己的手機(jī)號(hào)測(cè)試,測(cè)試正常,成功收到短信
/*
*短信測(cè)試類
*/
@Autowired
private SendSmsService sendSmsService;
@Test
void sendSms(){
sendSmsService.sendSms(“666666”, new String[] {“86***********”});
}
整合頁(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”;
}
添加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)證碼
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743