我和我的项目之整合腾讯云短信SDK
寫在前面:
平常生活中老是能收到各種各樣的手機短信驗證碼,例如,快遞取包裹快遞柜上有一串密碼,網站app登錄,忘記密碼,確認身份,綁定用戶等都能收到各種驗證碼,再比如銀行里各種短信驗證碼……數不勝數。那時就感覺很神奇到底是怎么做到的。系統又是怎么知道我輸入的驗證碼和它發送的是否是一致的。后來慢慢接觸到了短信SDK,什么阿里云、華為云、騰訊云傳統的電信服務商上網一搜很多提供了短信發送業務。開發人員只需要集成它們提供的接口就能輕松實現發送短信功能。我這里用的是騰訊云的,為啥選擇它呢。因為它對首次認證的用戶免費贈送100條短信……獻上領取地址https://cloud.tencent.com/product/sms
API和SDK區別 API 前端調用后端數據的一個通道,就是我們俗說的接口,通過這個通道,可以訪問到后端的數據,但是又無需調用源代碼。 SDK 工程師為輔助開發某類軟件的相關文檔、范例和工具的集合,使用SDK可以提高開發效率,更簡單的接入某個功能。舉例說明:一個產品想實現某個功能,可以找到相關的SDK,工程師直接接入SDK,就不用再重新開發了 |
Let’s go
1.?首先要登錄剛才的網址
| https://cloud.tencent.com/product/sms |
進行登錄并認證領取。認證成功后進入到短信控制臺。左側列表有快速入門。跟著里面的提示一步步去完成即可。Ps我選用的是國內短信業務。創建短信簽名時,要注意簽名類型。我這里用的是自己的公眾號。
2.國內短信由簽名+正文組成,簽名符號為【】(注:全角),發送短信內容時必須帶簽名。創建正文模板,Ps:注意語言組織,提高審核通過率。還有短信模板id不要透露。
3.簽名+短信模板創建完成后(Ps:可能它們各自審核需要一段時間耐心等待。好像15分鐘左右就可以了)查看短信SDK。左側應用管理里應用列表就能看到。點擊基礎配置能對短信進行各自配置。SDK AppID是短信應用的唯一標識,調用短信API接口時,需要提供該參數。SDK AppID不要透露。
4.https://cloud.tencent.com/document/product/382/43194。1、2、3步驟完成后打開Java SDK API文檔。文檔很詳細,記錄了如何在后臺集成。跟著操作一步步來即可。Ps:注意這里的前提條件。SecretID 和 SecretKey還有endpoint后續都會用到。
5.【安裝SDK。通過 Maven 安裝】我用的是3.1.35版本的。后面可能版本不適配導致發送失敗,記得回過頭來看檢查下這里版本是否匹配。https://search.maven.org/search?q=tencentcloud-sdk-java查詢最新版本。
<dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.35</version> </dependency>6.【老樣子,配置完pom,去yml配置屬性。順帶把參數集成到GlobalConfig中統一管理】
//全局參數變量設置 @Configuration public?class?GlobalConfig?implements?InitializingBean?{//======================================短信配置========================================================@Value("${sms.sign}")private?String?sign;@Value("${sms.moduleId}")private?String?moduleId;@Value("${sms.sdkAppId}")private?String?sdkAppId;@Value("${sms.url}")private?String?url;@Value("${sms.secretId}")private?String?secretId;@Value("${sms.secretKey}")private?String?secretKey;//=====================短信配置======================public static String SMS_SIGN;public static String SMS_MODULEID;public static String SMS_SDKAPPID;public static String SMS_URL;public static String SMS_SECRETID;public?static?String?SMS_SECRETKEY;@Overridepublic void afterPropertiesSet() throws Exception {//=======短信配置=============SMS_SIGN = sign;SMS_MODULEID = moduleId;SMS_SDKAPPID = sdkAppId;SMS_URL = url;SMS_SECRETID = secretId;SMS_SECRETKEY = secretKey;} }7.【參考Java SDK中發送短信代碼】做成一個工具類,業務代碼中直接調用即可。已經修改了其中一些配置,如若自定義修改,閱讀代碼進行相應修改即可。
import com.example.demojinghuadianli.config.GlobalConfig; import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.sms.v20190711.SmsClient; import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest; import?com.tencentcloudapi.sms.v20190711.models.SendSmsResponse; //導入可選配置類 //導入 SMS 模塊的 client //導入要請求接口對應的?request?response?類/*** @description: 發送短信工具類*/ public class SendSmsUtil {/*** @param phoneNum 手機號* @param authCode 驗證碼* @param minute 有效時間*/public static boolean send(String phoneNum,String authCode,Integer minute) {/* 必要步驟:* 實例化一個認證對象,入參需要傳入騰訊云賬戶密鑰對 secretId 和 secretKey* 本示例采用從環境變量讀取的方式,需要預先在環境變量中設置這兩個值* 您也可以直接在代碼中寫入密鑰對,但需謹防泄露,不要將代碼復制、上傳或者分享給他人* CAM 密鑰查詢:https://console.cloud.tencent.com/cam/capi*///======================================實例化一個認證對象====必要================================================Credential cred = new Credential(GlobalConfig.SMS_SECRETID, GlobalConfig.SMS_SECRETKEY);//======================================實例化一個 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(GlobalConfig.SMS_URL);//======================================客戶端配置對象=====非必要=================================================/* 非必要步驟:* 實例化一個客戶端配置對象,可以指定超時時間等配置 */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,例如1400006666 */String appid = GlobalConfig.SMS_SDKAPPID;req.setSmsSdkAppid(appid);/* 短信簽名內容: 使用 UTF-8 編碼,必須填寫已審核通過的簽名,可登錄 [短信控制臺] 查看簽名信息 */String sign = GlobalConfig.SMS_SIGN;req.setSign(sign);/* 國際/港澳臺短信 senderid: 國內短信填空,默認未開通,如需開通請聯系 [sms helper] *///String senderid = "";//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 = GlobalConfig.SMS_MODULEID;req.setTemplateID(templateID);/* 下發手機號碼,采用 e.164 標準,+[國家或地區碼][手機號]* 例如+8613711112222, 其中前面有一個+號 ,86為國家碼,13711112222為手機號,最多不要超過200個手機號*/StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("+86").append(phoneNum);String[] phoneNumbers = {stringBuilder.toString()};//String[] phoneNumbers = {"+8621212313123", "+8612345678902", "+8612345678903"};req.setPhoneNumberSet(phoneNumbers);/* 模板參數: 若無模板參數,則設置為空*///authCode驗證碼 minute過期時間String[] templateParams = {authCode,String.valueOf(minute)};req.setTemplateParamSet(templateParams);//==============================================================================================================/* 通過 client 對象調用 SendSms 方法發起請求。注意請求方法名與請求對象是對應的* 返回的 res 是一個 SendSmsResponse 類的實例,與請求對象對應 */SendSmsResponse res = null;try {res = client.SendSms(req);} catch (TencentCloudSDKException e) {return false;}// 輸出 JSON 格式的字符串回包System.out.println(SendSmsResponse.toJsonString(res));// 可以取出單個值,您可以通過官網接口文檔或跳轉到 response 對象的定義處查看返回字段的定義System.out.println(res.getRequestId());return true;} }8.寫一個測試接口,校驗下是否可以。代碼里稍微加了手機號碼和格式的校驗。
@RestController @RequestMapping("/sms") public class SendSMSController {@PostMapping("/send/{phoneNum}")public WebResponse send(@PathVariable(value = "phoneNum",required = true)String phoneNum){if(null == phoneNum){return WebResponse.resFail("手機號碼不允許為空",0);//RegularUtil.validate(phoneNum,RegularUtil.MOBILE)校驗手機號碼格式}else if(RegularUtil.validate(phoneNum,RegularUtil.MOBILE)!=true&&phoneNum.length()!=11){return WebResponse.resFail("手機號碼格式錯誤",0);}//AuthCodeUtil.generateAuthCode()隨機生成6位校驗碼boolean send = SendSmsUtil.send(phoneNum, AuthCodeUtil.generateAuthCode(), 2);if(false != send){return WebResponse.resSuccess("發送成功",1);}return WebResponse.resFail("發送失敗",0);} }9.Postman來發起請求。
10.Bingo~發送成功。在短信控制臺業務統計也可以看到發送情況。
11.還可以結合Redis.存驗證碼有效期。后面再優化整合吧。
Nice~
總結
以上是生活随笔為你收集整理的我和我的项目之整合腾讯云短信SDK的全部內容,希望文章能夠幫你解決所遇到的問題。