更新時間:2022-07-12 11:50:53 來源:動力節點 瀏覽1205次
Java實現短信驗證的方法是什么?動力節點小編來告訴大家。
首先需要一個短信接口平臺,才能進行發短信的操作,網上一搜有很多,但是很多只送了幾條免費的次數,根本不夠使用。然后發現騰訊云也有這個服務,一下送了200條,用完了還是得自己買。不過現在測試,200條夠用了。
短信接口平臺需要實名,驗證什么的,需要申請短信的簽名和模板,也就是發送的標題和內容,需要審核。騰訊云短信地址。請注意寫的要求,并不是你想發送什么都可以。審核不能過。
創建簽名需要有個人實名的網站,或已發布的小程序/公眾號,或已上線的APP,請注意!
以maven方式引入依賴jar包
com.qcloud cmq-http-client 1.0.7 com.tencentcloudapi tencentcloud-sdk-java 3.1.390
號內容都需要替換為自己對應的,在騰訊云中找到這些常量,寫入
SMSSECREID與SMSSECREKEY查詢地址:CAM密匙查詢
注意這些的填寫,一個錯了將會導致發送不成功,官方文檔對于每個參數都有詳細的解釋,告訴你在哪里找到它。
/**
短信常量類
*/
public class Constants {
/**
短信 appid
*/
public static final String SMSAPPID="******";
/
騰訊云賬戶密鑰對: secretId
*/
public static final String SMSSECREID="******";
/
騰訊云賬戶密鑰對: 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="********";
}
短信發送實現返回,是否發送成功的提示
package com.example.service;
import com.example.pojo.Constants;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
//導入可選配置類
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
// 導入對應SMS模塊的client
import com.tencentcloudapi.sms.v20210111.SmsClient;
// 導入要請求接口對應的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 {
必要步驟:
* 實例化一個認證對象,入參需要傳入騰訊云賬戶密鑰對secretId,secretKey。
* 這里采用的是從環境變量讀取的方式,需要在環境變量中先設置這兩個值。
* 你也可以直接在代碼中寫死密鑰對,但是小心不要將代碼復制、上傳或者分享給他人,
* 以免泄露密鑰對危及你的財產安全。
* CAM密匙查詢: https://console.cloud.tencent.com/cam/capi*/
Credential cred = new Credential(Constants.SMSSECREID, Constants.SMSSECREKEY);
// 實例化一個http選項,可選,沒有特殊需求可以跳過
HttpProfile httpProfile = new HttpProfile();
// 設置代理
// httpProfile.setProxyHost(“host”);
// httpProfile.setProxyPort(port);
/* SDK默認使用POST方法。
* 如果你一定要使用GET方法,可以在這里設置。GET方法無法處理一些較大的請求 /
httpProfile.setReqMethod(“POST”);
/ SDK有默認的超時時間,非必要請不要進行調整
* 如有需要請在代碼中查閱以獲取最新的默認值 /
httpProfile.setConnTimeout(60);
/ SDK會自動指定域名。通常是不需要特地指定域名的,但是如果你訪問的是金融區的服務
* 則必須手動指定域名,例如sms的上海金融區域名: sms.ap-shanghai-fsi.tencentcloudapi.com */
httpProfile.setEndpoint(“sms.tencentcloudapi.com”);
/* 非必要步驟:
* 實例化一個客戶端配置對象,可以指定超時時間等配置 */
ClientProfile clientProfile = new ClientProfile();
/* SDK默認用TC3-HMAC-SHA256進行簽名
* 非必要請不要修改這個字段 */
clientProfile.setSignMethod("HmacSHA256");
clientProfile.setHttpProfile(httpProfile);
/* 實例化要請求產品(以sms為例)的client對象
* 第二個參數是地域信息,可以直接填寫字符串ap-guangzhou,或者引用預設的常量 */
SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
/* 實例化一個請求對象,根據調用的接口和實際情況,可以進一步設置請求參數
* 你可以直接查詢SDK源碼確定接口有哪些屬性可以設置
* 屬性可能是基本類型,也可能引用了另一個數據結構
* 推薦使用IDE進行開發,可以方便的跳轉查閱各個接口和數據結構的文檔說明 */
SendSmsRequest req = new SendSmsRequest();
/* 填充請求參數,這里request對象的成員變量即對應接口的入參
* 你可以通過官網接口文檔或跳轉到request對象的定義處查看請求參數的定義
* 基本類型的設置:
* 幫助鏈接:
* 短信控制臺: https://console.cloud.tencent.com/sms/smslist
* sms helper: https://cloud.tencent.com/document/product/382/3773 */
/* 短信應用ID: 短信SdkAppid在 [短信控制臺] 添加應用后生成的實際SdkAppid,示例如1400006666 */
String appid = Constants.SMSAPPID;
req.setSmsSdkAppId(appid);
/* 短信簽名內容: 使用 UTF-8 編碼,必須填寫已審核通過的簽名,簽名信息可登錄 [短信控制臺] 查看 */
String sign = Constants.SMSSIGN;
req.setSignName(sign);
/* 國際/港澳臺短信 senderid: 國內短信填空,默認未開通,如需開通請聯系 [sms helper] */
// String senderid = “xxx”;
// req.setSenderId(senderid);
/* 用戶的 session 內容: 可以攜帶用戶側 ID 等上下文信息,server 會原樣返回 */
// String session = “xxx”;
// req.setSessionContext(session);
/* 短信碼號擴展號: 默認未開通,如需開通請聯系 [sms helper] */
// String extendcode = “xxx”;
// req.setExtendCode(extendcode);
/* 模板 ID: 必須填寫已審核通過的模板 ID。模板ID可登錄 [短信控制臺] 查看 */
String templateID = Constants.SMSTEMPLATEID;
req.setTemplateId(templateID);
/* 下發手機號碼,采用 e.164 標準,+[國家或地區碼][手機號]
* 示例如:+8613711112222, 其中前面有一個+號 ,86為國家碼,13711112222為手機號,最多不要超過200個手機號*/
// String[] phoneNumbers = {"+8621212313123", “+8612345678902”, “+8612345678903”};
req.setPhoneNumberSet(phoneNumbers);
/* 模板參數: 若無模板參數,則設置為空*/
String[] templateParams = {valcode};
req.setTemplateParamSet(templateParams);
/* 通過 client 對象調用 SendSms 方法發起請求。注意請求方法名與請求對象是對應的
* 返回的 res 是一個 SendSmsResponse 類的實例,與請求對象對應 */
SendSmsResponse res = client.SendSms(req);
// 輸出json格式的字符串回包
System.out.println(SendSmsResponse.toJsonString(res));
// 也可以取出單個值,你可以通過官網接口文檔或跳轉到response對象的定義處查看返回字段的定義
//System.out.println(res.getRequestId());
} catch (TencentCloudSDKException e) {
e.printStackTrace();
return "發送出了點問題";
}
return "短信發送成功!請注意接收";
}
輸入自己的手機號測試,測試正常,成功收到短信
/*
*短信測試類
*/
@Autowired
private SendSmsService sendSmsService;
@Test
void sendSms(){
sendSmsService.sendSms(“666666”, new String[] {“86***********”});
}
整合頁面和控制類,發送短信
從頁面輸入手機號,獲取短信
再對驗證碼進行驗證、提示
/*
短信驗證碼
*/
@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 “login”;
}
@RequestMapping("/doRegister")
public String doRegister(HttpSession session,String InputSmsCode,Model model) {
String SmsCode = (String) session.getAttribute(“SmsCode”);
//限制用戶必須先輸入驗證碼,才能提交請求
if (!InputSmsCode.equals(SmsCode)){
System.out.println(“驗證碼有誤”);
model.addAttribute(“tip”,“驗證碼有誤”);
return “login”;
}
return “index”;
}
添加js增加優化體驗,限制用戶每60秒才能點擊一次發送驗證碼請求和對手機號格式以正則表達式效驗
/短信按鈕JS/
c = 60;
function SmsTiming() {
$("#getSmsCode").text(c + “秒后重新獲取”);
//console.log?;
// 1秒延時調用自己
myVar = setTimeout(function () {
SmsTiming()
}, 1000);
c -= 1;
//設定條件跳出
if (c == -1) {
clearTimeout(myVar); //停止
$("#getSmsCode").removeAttr(“disabled”); //移除禁用屬性
$("#getSmsCode").text(“獲取驗證碼”); //重新顯示按鈕
c = 60; //重新初始化 倒計時時間
}
};
//點擊按鈕調用,添加屬性禁用按鈕
//調用 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("請先填寫手機號!");
return false;
} else if (!smsRegExp.test(SmsInput)) {
alert("請檢查你的手機格式!");
return false;
}
$("#getSmsCode").attr("disabled", "disabled");
SmsTiming();
return true;
});
電話: 獲取驗證碼
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習