腾讯云短信发送验证码(超详细)

本文详细介绍了如何在腾讯云上获取免费短信并进行实名认证,创建签名和模板,以及如何通过Java SDK发送验证码。提供了相关链接和关键步骤,适合个人项目测试。

在大部分的短信平台,能免费送的短信条数也就是几条,太少了,测试都不够,基本上都是要充钱够买的。我也注册了好几个平台,发现腾讯云免费赠送200条试用短信,就很不错。在我们学生党项目测试来说的话,就已经绰绰有余了。
1、注册腾讯云的账号,然后去实名认证一下
腾讯云的官网: https://cloud.tencent.com/
2、免费领取短信,可以白薅200条短信(个人项目测试已经足够了)
在这里插入图片描述

云产品——短信
在这里插入图片描述

短信——概览,这里可以看见短信有效余量(也可以在这里免费领取)
在这里插入图片描述

短信——套餐包管理——国内套餐包(个人认证,免费赠送领取)
在这里插入图片描述

3、创建签名
签名审核一般会很严格,只要签名审核通过基本上就成功了。不过腾讯云相比阿里云会友好很多,审核比较宽松。(多申请几条,总有一条通过的,未通过的可以看一下失败的原因,改一下再提交,我一开始不太会只申请了一条,搞了好几天才通过)
创建成功后是这样的(这里的signName签名内容后面会用到)
在这里插入图片描述

阿里云只有项目上线或者备案后才可以申请,而腾讯云的签名申请个人的公众号提供公众号的管理界面截图即可申请成功。
签名类型(有公司、网站、APP、公众号、小程序),审核在2小时内处理完毕。
我比较推荐网站或者公众号,我用的是公众号,证明和委托的话就是营业执照 ,去网上找一下。
在这里插入图片描述

4、创建模板
模板申请都是非常容易通过的(模板templateID和内容参数{1},{2}下面会用到)
在这里插入图片描述
在这里插入图片描述

5、短信——应用管理——应用列表(SDKAppID,AppKey下面会用到)
默认都有,没有就创建
在这里插入图片描述

在这里插入图片描述

6、创建密钥(这里的SecreId/SecreKey在后面会用到)
在这里插入图片描述

选择继续使用
在这里插入图片描述

SecretId 用于标识 API 调用者的身份,SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。
在这里插入图片描述

上面的步骤就完成了,下面就是代码部分:

具体代码可查看官方腾讯云SDK 文档,里面有非常详细的java的接入指南
(地址:https://cloud.tencent.com/document/product/382/43194
在这里插入图片描述

您可以在 Maven仓库上找到最新的版本。Maven仓库中显示的4.0.11是废弃版本
(地址:https://search.maven.org/search?q=tencentcloud-sdk-java )
在这里插入图片描述

加入maven依赖(配置SDK)
引入短信验证的jar包,maven的pom.xml加入

<!--腾讯云短信-->
   		<!-- https://mvnrepository.com/artifact/com.tencentcloudapi/tencentcloud-sdk-java -->
   		<dependency>
   			<groupId>com.tencentcloudapi</groupId>
   			<artifactId>tencentcloud-sdk-java</artifactId>
   			<version>3.1.284</version>
   		</dependency>

随机验证码4/6位数

//验证码随机数
public  class  ValidateCode {

   public static Integer generateValidateCode(int length){
       Integer code =null;
       if(length == 4){
           code = new Random().nextInt(9999);//生成随机数,最大为9999
           if(code < 1000){
               code = code + 1000;//保证随机数为4位数字
           }
       }else if(length == 6){
           code = new Random().nextInt(999999);//生成随机数,最大为999999
           if(code < 100000){
               code = code + 100000;//保证随机数为6位数字
           }
       }else{
           throw new RuntimeException("只能生成4位或6位数字验证码");
       }
       return code;
   }
}

常量参数类(把上面要用到的SecretID, SecretKey, SdkAppID, signName, templateId参数封装)

/**
* 常量类
*/
public class Constants {

   //腾讯云账户密钥对: SecretID
   public static final String SecretID = "SecretID";
   //腾讯云账户密钥对: SecretKey
   public static final String SecretKey = "SecretKey";
   //SdkAppid
   public static final String SdkAppid = "SdkAppid";
   //signName :签名
   public static final String signName = "Sam先生";
   //短信模板id:
   public static final String templateId ="978194";

   public static  String voicode="";
}

自己封装一个发送短信的工具类(有些是加上去)

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.v20190711.SmsClient;
// 导入要请求接口对应的request response类
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20190711.models.SendStatus;

import javax.servlet.http.HttpSession;

public class SendSmsUtil {

   public static SendStatus[] sendSms(String[] phoneNumber ) {

      SendStatus[] returString= {};

       try {
           /* 必要步骤:
            * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。
            * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
            * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人,
            * 以免泄露密钥对危及你的财产安全。
            * CAM密匙查询: https://console.cloud.tencent.com/cam/capi*/
           Credential cred = new Credential(Constants.SecretID, Constants.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("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 sdkappid = Constants.SdkAppid;
           req.setSmsSdkAppid(sdkappid);

           /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */
           String sign = Constants.signName;
           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 = Constants.templateId;
           req.setTemplateID(templateID);

         /* 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
            * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/
           String[] phoneNumbers = {"+86"+phoneNumber};
           req.setPhoneNumberSet(phoneNumber);

//         随机验证码
           int vode=ValidateCode.generateValidateCode(6);
           String code=String.valueOf(vode);       

           /* 模板参数: 若无模板参数,则设置为空*/
           String[] templateParams = {code};
           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());
           returString=res.getSendStatusSet();

       } catch (TencentCloudSDKException e) {
           e.printStackTrace();
       }

       return returString;
   }
}

模板参数就是模板内容里的{参数1},{参数2},我用到是第3个模板,参数是随机验证码

//         随机验证码
           int vode=ValidateCode.generateValidateCode(6);
           String code=String.valueOf(vode);
           Constants.voicode=code;

    /* 模板参数: 若无模板参数,则设置为空*/
           String[] templateParams = {code};
           req.setTemplateParamSet(templateParams);

在这里插入图片描述

最后写个controller测试一下

//发送手机验证码
   @RequestMapping(value="/sendCodeAgain")
   @ResponseBody
   public SendStatus[] sendCodeAgain(@RequestParam(value="telephone",required=true)  String Phone){

       String[] Phones = {"+86" + Phone};
       SendStatus[] ret = SendSmsUtil.sendSms(Phones);
      
       return ret;
   }

发送验证码成功!!!
在这里插入图片描述

关于前端接收的代码,可以看一下我另外一篇文章https://blog.youkuaiyun.com/weixin_44541213/article/details/118073733

希望对你们有用,如果哪里分析不够恰当请指点

评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值