日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java+redis实现腾讯云短信SDK3.0验证+过期时间验证

發布時間:2023/12/31 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java+redis实现腾讯云短信SDK3.0验证+过期时间验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

其實都是騰訊云官方的sdk 總結一下

JAVA SDK 3.0跳轉鏈接

引入maven依賴

<!--短信驗證--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.313</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 對象池,使用redis時必須引入 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

配置文件 redis的不要忘記配置哦

#redis相關 spring.redis.database=0 spring.redis.host=xxxx spring.redis.port=6379 spring.redis.password=xxxx#短信服務 tx.sms.secretId=xxxx tx.sms.secretKey=xxx #sdk tx.sms.sdkAppId=xxx #模板id tx.sms.templateId=xxx @Service @Slf4j public class SmsService {@Autowiredprivate StringRedisTemplate redisTemplate;@Value("${tx.sms.secretId}")private String secretId;@Value("${tx.sms.secretKey}")private String secretKey;@Value("${tx.sms.sdkAppId}")private String sdkAppId;@Value("${tx.sms.templateId}")String templateId;public SendSmsResponse sendMsg(String phoneNum) {try {/* 必要步驟:* 實例化一個認證對象,入參需要傳入騰訊云賬戶密鑰對secretId,secretKey。* 這里采用的是從環境變量讀取的方式,需要在環境變量中先設置這兩個值。* 你也可以直接在代碼中寫死密鑰對,但是小心不要將代碼復制、上傳或者分享給他人,* 以免泄露密鑰對危及你的財產安全。* CAM密匙查詢: https://console.cloud.tencent.com/cam/capi*/Credential cred = new Credential(secretId, secretKey);// 實例化一個http選項,可選,沒有特殊需求可以跳過HttpProfile httpProfile = new HttpProfile();// 設置代理// httpProfile.setProxyHost("真實代理ip");// httpProfile.setProxyPort(真實代理端口);/* 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/smsv2* sms helper: https://cloud.tencent.com/document/product/382/3773 *//* 短信應用ID: 短信SdkAppId在 [短信控制臺] 添加應用后生成的實際SdkAppId,示例如1400006666 */req.setSmsSdkAppId(sdkAppId);/* 短信簽名內容: 使用 UTF-8 編碼,必須填寫已審核通過的簽名,簽名信息可登錄 [短信控制臺] 查看 */String signName = "xxxx";req.setSignName(signName);/* 用戶的 session 內容: 可以攜帶用戶側 ID 等上下文信息,server 會原樣返回 *///可以攜帶unionid或者useridString sessionContext = "xxxxxxxxx";req.setSessionContext(sessionContext);/* 模板 ID: 必須填寫已審核通過的模板 ID。模板ID可登錄 [短信控制臺] 查看 */req.setTemplateId(templateId);/* 下發手機號碼,采用 E.164 標準,+[國家或地區碼][手機號]* 示例如:+8613711112222, 其中前面有一個+號 ,86為國家碼,13711112222為手機號,最多不要超過200個手機號 *///這里參數是可變的String[] phoneNumberSet = new String[]{"+86" + phoneNum};req.setPhoneNumberSet(phoneNumberSet);//生成隨機codeString code = RandomUtil.randomNumbers(4);/* 模板參數: 若無模板參數,則設置為空 */String[] templateParamSet = {code,"10"};req.setTemplateParamSet(templateParamSet);/* 通過 client 對象調用 SendSms 方法發起請求。注意請求方法名與請求對象是對應的* 返回的 res 是一個 SendSmsResponse 類的實例,與請求對象對應 */SendSmsResponse res = client.SendSms(req);//redis中存入code 到時候比對一下 我們需要每次傳入一個隨機碼 用于標識不同的短信 如 key= rand:6666-phone:1506213135 value=1365// 可以用過期時間+當前時間組成一個時間戳 然后校驗的時候比對 如果比當前時間戳小 說明過期了double expireTime = System.currentTimeMillis() / 1000 + 10 * 60;//第三個參數是double類型的分值redisTemplate.opsForZSet().add("phone:" + phoneNum,code,expireTime);redisTemplate.expire("phone:" + phoneNum, 30, TimeUnit.MINUTES);// 輸出json格式的字符串回包log.info(SendSmsResponse.toJsonString(res));// 也可以取出單個值,你可以通過官網接口文檔或跳轉到response對象的定義處查看返回字段的定義return res;} catch (TencentCloudSDKException e) {e.printStackTrace();}return null;} }

有幾點需要注意
1.簽名內容不是id 基本上是漢字 UTF-8編碼的 idea一般都用UTF-8 所以不需要改變什么
2.模版參數 我試了下參數似乎都要數字 中文似乎會轉化錯誤
3. 手機號要加 “+86“

重點內容:

短信驗證碼的時效是10分鐘 你以為單單使用redis的字符串 設置個過期時間就好了?

太天真了

當用戶發第二 第三次驗證碼的時候 這幾個驗證碼只要不過期 應該都是能使用的

那么 即需要保持相同的key 如phone:150xxxxxxx 但code不同 且需要每個code都會過期 那該怎么辦呢?

可以使用zset 里面的score供我們使用 雖然不能使用expire讓對應的value在不同時間內過期

但我們能使用取巧的辦法

代碼單獨拉出來

// 設置code 10分鐘后過期double expireTime = System.currentTimeMillis() / 1000 + 10 * 60;//第三個參數是double類型的分值redisTemplate.opsForZSet().add("phone:" + phoneNum,code,expireTime);//每請求一次短信 給這個key續期 別code沒過期 key先過期了redisTemplate.expire("phone:" + phoneNum, 30, TimeUnit.MINUTES);

看一下這個方法

opsForZSet().add(key,value,score)

第一個參數為String類型的key

第二個參數為String類型的value

第三個參數為double類型的score

按上面的方法存入即可

再看看短信驗證的方法

controller層的方法

@RestController @Slf4j @Api(value = "SmsController", tags = "短信服務") public class SmsController extends BaseController {@Autowiredprivate SmsService smsService;@Autowiredprivate StringRedisTemplate redisTemplate;@PostMapping("/sendMsg")@ApiOperation("發送短信驗證碼")public Result sendMsg(String phone) {SendSmsResponse res = smsService.sendMsg(phone);//getSendStatusSet()會返回數組 我們一個手機號就使用索引0if (Objects.equals("Ok", res.getSendStatusSet()[0].getCode())) {return Result.ok();} else {return Result.fail().message("短信發送失敗");}}@PostMapping("/confirm-sms")@ApiOperation("短信驗證碼驗證")public Result confirmSms(String phone, String code) {//獲取當前時間的秒數double curTime = System.currentTimeMillis() / 1000;// 獲取給定時間區間的集合 當前時間到未來2000年的區間 只要當時插入的時間戳在該范圍內 就沒有過期Set<String> codeSet = redisTemplate.opsForZSet().rangeByScore("phone:" + phone, curTime, Double.MAX_VALUE);//只要在這個區間內 說明驗證碼沒有過期 隨便一個驗證碼都能使用if (codeSet.contains(code)) {return Result.ok().message("校驗成功");}return Result.fail().code(444).message("校驗失敗");} }

驗證的時候前端傳手機號和驗證碼。只要驗證碼沒有過期 都是能在集合內取到的 給他驗證通過即可

總結

以上是生活随笔為你收集整理的java+redis实现腾讯云短信SDK3.0验证+过期时间验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。