腾讯短信及服务调用验证
1.导包
<!-- 腾讯短信/tencentcloud-sdk-java --> <dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java</artifactId> <version>3.1.270</version> <!--<version>4.0.11</version>--> </dependency>
2.工具类
package com.dlb.utils; 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.*; import lombok.Data; import java.util.Random; //腾讯短信 @Data @SuppressWarnings("all") public class TencentMsg { //秘钥 private static String secretId="XXXXXXXXXXX"; private static String secretKey="XXXXXXXX"; /* 短信应用ID: 短信SdkAppId在 [应用管理列表] */ private static String sdkAppId = "1400XXXXX"; /* 短信签名内容 必须填写已审核通过的签名 */ private static String signName = "XXX网"; /* 国际/港澳台短信 SenderId: 国内短信填空,默认未开通 */ private static String senderid = ""; /* 短信号码扩展号: 默认未开通,如需开通请联系 [sms helper] */ private static String extendCode = ""; /** * 1232XXX 普通短信 * 大萝卜 * 您正在申请手机注册,验证码为:{1},{2}分钟内有效! * 已通过 2021-12-09 10:25:18 * 1232XXX 普通短信 * 大萝卜 * 您正在修改注册手机号码,验证码为:{1},5分钟有效,为保障帐户安全,请勿向任何人提供此验证码。 * 已通过 2021-12-09 09:40:33 * 1232XXX 普通短信 * 大萝卜 * 验证码为:{1},您正在登录,若非本人操作,请勿泄露。 */ private static String templateId = "1232XXX"; //初始化短信发送客户端 public static SmsClient initClient(){ //必要步骤: 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,或者引用预设的常量 */ return new SmsClient(cred, "ap-guangzhou",clientProfile); } //使用短信登录 public String sendLogin(String msgCode,String phoneNumber,String userInfo){ SmsClient client = initClient(); // 实例化一个请求对象 SendSmsRequest req = new SendSmsRequest(); //------组装短信内容 req.setSmsSdkAppId(sdkAppId);//应用id req.setSignName(signName);//网站签名 req.setSenderId(senderid);//国外短信 req.setSessionContext(userInfo);//请求信息自定义,也可以为"xxx" req.setExtendCode(extendCode);//扩展号码 req.setTemplateId(templateId);//申请的模板id String[] arr = {phoneNumber}; req.setPhoneNumberSet(arr);//手机号,最大200个 String[] code = {msgCode}; req.setTemplateParamSet(code);//模板里的变量,按数组顺序放入 try { //发送短信 SendSmsResponse res = client.SendSms(req); //通过官网接口文档或跳转到response对象的定义处查看返回字段的定义 System.out.println(res.getRequestId()); //发送成功返回发送信息 return SendSmsResponse.toJsonString(res); } catch (TencentCloudSDKException e) { e.printStackTrace(); } return null; } public String getMsgCode(){ Random random = new Random(); String a= ""; int j = random.nextInt(9); for (int i = 0; i < 6; i++) { a += String.valueOf(random.nextInt(9)); } return a; } /** * 开放式发送短信 * @param verifyInfo 模板里的变量: 验证码:code必须是数字类型的字符串 时间5分钟 * String[] templateParamSet = {"code","5"}; * @param phoneNumberSet 手机号 前面要写+86 国内用 * String[] phoneNumberSet = {"+8617639563050"}; * @param sessionContext * 用户的 session 内容: 不写就用xxx代替,server 会原样返回 * @return 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 * {"SendStatusSet":[ * {"SerialNo":"2640:246877675516390197684686305", * "PhoneNumber":"+861763956xxxx", * "Fee":1, * "SessionContext":"xxx", * "Code":"Ok", * "Message":"send success", * "IsoCode":"CN"} * ], * "RequestId":"d240c44b-a2e5-45ef-b3b5-00f23ac42b5f"} * * d240c44b-a2e5-45ef-b3b5-00f23ac42b5f */ public String sendMsg(String[] verifyInfo,String[] phoneNumberSet,String sessionContext){ SmsClient client = initClient(); // 实例化一个请求对象 SendSmsRequest req = new SendSmsRequest(); //------组装短信内容 req.setSmsSdkAppId(sdkAppId);//应用id req.setSignName(signName);//网站签名 req.setSenderId(senderid);//国外短信 req.setSessionContext(sessionContext);//请求信息自定义,也可以为"xxx" req.setExtendCode(extendCode);//扩展号码 req.setTemplateId(templateId);//申请的模板id req.setPhoneNumberSet(phoneNumberSet);//手机号,最大200个 req.setTemplateParamSet(verifyInfo);//模板里的变量,按数组顺序放入 try { //发送短信 SendSmsResponse res = client.SendSms(req); //通过官网接口文档或跳转到response对象的定义处查看返回字段的定义 System.out.println(res.getRequestId()); //发送成功返回发送信息 return SendSmsResponse.toJsonString(res); } catch (TencentCloudSDKException e) { e.printStackTrace(); } return null; } /** * 获取回执状态 * @param limit 设置拉取最大条数,最多100条 Long类型 5L * @return {"PullSmsSendStatusSet":[],"RequestId":"65d63875-b902-45c2-81be-810f01ea0ee3"} */ public String getReceipt(Long limit){ SmsClient client = initClient(); /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数*/ PullSmsSendStatusRequest req = new PullSmsSendStatusRequest(); req.setSmsSdkAppId(sdkAppId);//应用id req.setLimit(limit); /* 通过 client 对象调用 PullSmsSendStatus 方法发起请求。注意请求方法名与请求对象是对应的 * 返回的 res 是一个 PullSmsSendStatusResponse 类的实例,与请求对象对应 */ try { PullSmsSendStatusResponse res = client.PullSmsSendStatus(req); String s = PullSmsSendStatusResponse.toJsonString(res); // 输出json格式的字符串回包 System.out.println(s); return s; } catch (TencentCloudSDKException e) { e.printStackTrace(); } return null; } /** * 统计短信发送数据 * @return {"SendStatusStatistics":{ * "FeeCount":1,"RequestCount":1,"RequestSuccessCount":1}, * "RequestId":"b5f388f0-bdf3-4c8c-8cc7-be8ca8bdda3f"} */ public String statisticalSendData(){ SmsClient client = initClient(); /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数*/ SendStatusStatisticsRequest req = new SendStatusStatisticsRequest(); req.setSmsSdkAppId(sdkAppId); // 设置拉取最大条数,最多100条 Long limit = 5L; req.setLimit(limit); /* 偏移量 注:目前固定设置为0 */ Long offset = 0L; req.setOffset(offset); /* 开始时间,yyyymmddhh 需要拉取的起始时间,精确到小时 */ String beginTime = "2021120908"; req.setBeginTime(beginTime); /* 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时 * 注:EndTime 必须大于 beginTime */ String endTime = "2021120912"; req.setEndTime(endTime); /* 通过 client 对象调用 SendStatusStatistics 方法发起请求。注意请求方法名与请求对象是对应的 * 返回的 res 是一个 SendStatusStatisticsResponse 类的实例,与请求对象对应 */ try { SendStatusStatisticsResponse res = client.SendStatusStatistics(req); String s = SendStatusStatisticsResponse.toJsonString(res); // 输出json格式的字符串回包 System.out.println(s); return s; } catch (TencentCloudSDKException e) { e.printStackTrace(); } return null; } /** * //申请模板,需要企业认证类型账号!!! * @param templatename String templatename = "阿里云"; * @param templatecontent 模板内容 "{1}为您的登录验证码,请于{2}分钟内填写"; * @param smstype 短信类型:0表示普通短信, 1表示营销短信 建议:0 * @param international 是否国际/港澳台短信:0:表示国内短信,1:表示国际/港澳台短信。建议:0 * @param remark 模板备注:例如申请原因,使用场景等 "xxx" * @return json */ public static String a(String templatename, String templatecontent, long smstype, long international, String remark){ SmsClient client = initClient(); /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数*/ AddSmsTemplateRequest req = new AddSmsTemplateRequest(); req.setTemplateName(templatename); req.setTemplateContent(templatecontent); req.setSmsType(smstype); req.setInternational(international); req.setRemark(remark); try { AddSmsTemplateResponse res = client.AddSmsTemplate(req); // 可以取出单个值,您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义 System.out.println(res.getRequestId()); String s = AddSmsTemplateResponse.toJsonString(res); // 输出 JSON 格式的字符串回包 System.out.println(s); return s; } catch (TencentCloudSDKException e) { e.printStackTrace(); } return null; } }
3.服务调用
//获取手机验证码 @RequestMapping("/getCode") @ResponseBody public String getPhoneCode(String phone,HttpServletRequest request){ if (phone == null) return ""; System.err.println("用户输入:"+phone); HttpSession session = request.getSession(); TencentMsg tencentMsg = new TencentMsg(); String msgCode = tencentMsg.getMsgCode();//获取随机验证码 System.err.println("msgCode = " + msgCode); JSONObject jsonObject = new JSONObject(); jsonObject.put("msgCode",msgCode);//存验证码 jsonObject.put("createTime",System.currentTimeMillis());//存当前时间 session.setAttribute("verifyInfo",jsonObject); String aaa = tencentMsg.sendLogin(msgCode, phone, "aaa"); System.out.println("aaa = " + aaa); return aaa; } //验证手机验证码 @RequestMapping("/regAccount") @ResponseBody public String regAccount(String phone,String phoneCode,HttpServletRequest request){ HttpSession session = request.getSession(); JSONObject json = (JSONObject) session.getAttribute("verifyInfo"); if (!json.getString("msgCode").equals(phoneCode)){ return "验证码错误"; } if ((System.currentTimeMillis()-json.getLong("createTime"))>5*60*1000){ return "验证码过期"; } return "ok"; }