Java调用腾讯云短信API实现手机登陆验证码

一、效果展示:

短信验证码截图
腾讯云短信验证

二、必要条件

  1. 首先得准备一个腾讯云账号吧,也就是需要的腾讯云短信API的SDKAppleID和AppKey。
  2. 配置腾讯云SDK。
  3. 腾讯云新人都会有赠送的短信条数,有几百条呢,对于测试验证来讲,暂时用不完。
  4. 账号必须是实名制的。
  5. 在控制台找到短信,https://console.cloud.tencent.com/smsv2,如果要使用还必须得有一下准备(如下图片):

按照网站给出的步骤去创建短信签名和短信正文模板,等待审核通过就好了。

准备好之后的样例如下:

SDK在这:系统会默认给出一个应用,当然,您也可以自己创建一个应用。

接下来是签名:这里的签名内容是用Java发送短信时需要的。

然后是模板,根据自己想要的去设定模板就行,但是必须得合规,对吧。

最后是jar包了,可以通过官网去下载SDK:https://cloud.tencent.com/document/product/382/43193

 当然也可以通过pom来引入jar包:

<!-- 腾讯云API -->
<dependency>
  <groupId>com.tencentcloudapi</groupId>
  <artifactId>tencentcloud-sdk-java</artifactId>
  <version>3.1.99</version>
</dependency>
<dependency>
  <groupId>com.github.qcloudsms</groupId>
  <artifactId>qcloudsms</artifactId>
  <version>1.0.6</version>
</dependency>

若已经准备好了上面所需要的的东西那么就可以开始我们的短信发送旅程了。

三、完成了所有前提条件,start coding

  • 常量类Tencent:
/**
 * @ClassName: Tencent
 * @Description: TODO
 * @author: martin-wj
 * @createDate: 2020-12-21
 */
public class Tencent {
    // 短信API
    // SDK AppID是短信应用的唯一标识,调用短信API接口时,需要提供该参数。
    public final static String SMSAPPID="您的SDKAppID";
    // App Key是用来校验短信发送合法性的密码,与SDK AppID对应,需要业务方高度保密,切勿把密码存储在客户端。
    public final static String SMSSDKAPPID="AppKey";
    // sms签名  签名内容
    public final static String SMSSIGN="签名内容";
    // 短信模板ID,这是自己的短信模板的ID,根据自己的需要添加
    public final static String UPDATEPHONE_SMSTEMPLATEID = "更新手机号的ID";
    public final static String RESETPASSWORD_SMSTEMPLATEID = "重置密码的ID";
    public final static String LOGIN_SMSTEMPLATEID = "登陆的ID";
    public final static String REGISTER_SMSTEMPLATEID = "注册的ID";
}
  • 工具类:
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
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 org.json.JSONException;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: SmsUtils
 * @Description: TODO 腾讯云短信接口工具类
 * @author: martin-wj
 * @createDate: 2020-12-03
 */
@Component
public class SmsUtils {

    /**
     * 发送短信到手机号:群发短信
     * @param valcode 验证码值
     * @param time 过期时间
     * @param phoneNumbers 手机号的数组
     * @param SMSTEMPLATEID 短信模板(常量)
     * @return
     */
    public static String[] sendSms(String valcode, String time, String[] phoneNumbers, String SMSTEMPLATEID) {
        List<String> reStrs = new ArrayList<>();
        for(String phoneNumber : phoneNumbers) {
            reStrs.add(sendSms(valcode, time, phoneNumber, SMSTEMPLATEID));
        }
        return (String[]) reStrs.toArray();
    }
    /**
     * 发送短信到手机号:只发一个
     * @param valcode 验证码值
     * @param time 过期时间
     * @param phoneNumber 手机号
     * @param SMSTEMPLATEID 短信模板(常量)
     * @return
     */
    public static String sendSms(String valcode, String time, String phoneNumber, String SMSTEMPLATEID) {
        //定义返回值
        String reStr = "";
        try {
            //参数,一定要对应短信模板中的参数顺序和个数,
            String[] params = {valcode, time};
            //创建ssender对象
            SmsSingleSender sSender = new SmsSingleSender(Integer.parseInt(Tencent.SMSAPPID), Tencent.SMSSDKAPPID);
            // 发送验证码给手机
            SmsSingleSenderResult result = sSender.sendWithParam("86",
                    phoneNumber, Integer.parseInt(SMSTEMPLATEID), params, Tencent.SMSSIGN, "", "");
            System.err.println(result.result);
            // 签名参数未提供或者为空时,会使用默认签名发送短信
            System.out.println(result.toString());
            if(result.result==0){
                reStr = "success";
                System.out.println("短信发送成功!");
            }else{
                reStr = "error";
                System.out.println("短信发送失败!");
            }
        } catch (HTTPException e) {
            // HTTP响应码错误
            e.printStackTrace();
        } catch (JSONException e) {
            // json解析错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络IO错误
            e.printStackTrace();
        }catch (Exception e) {
            // 网络IO错误
            e.printStackTrace();
        }
        return reStr;
    }

    /**
     * 更新手机号验证短信模板,发送多个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumbers 手机号数组
     * @return
     */
    public static String[] sendSmsUpdatePhone(String valcode, String time, String[] phoneNumbers) {
        return sendSms(valcode, time, phoneNumbers, Tencent.UPDATEPHONE_SMSTEMPLATEID);
    }

    /**
     * 更新手机号验证短信模板,发送给单个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumber 手机号
     * @return
     */
    public static String sendSmsUpdatePhone(String valcode, String time, String phoneNumber) {
        return sendSms(valcode, time, phoneNumber, Tencent.UPDATEPHONE_SMSTEMPLATEID);
    }

    /**
     * 密码重置验证的短信模板,发送多个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumbers 手机号数组
     * @return
     */
    public static String[] sendSmsResetPassword(String valcode, String time, String[] phoneNumbers) {
        return sendSms(valcode, time, phoneNumbers, Tencent.RESETPASSWORD_SMSTEMPLATEID);
    }

    /**
     * 密码重置验证的短信模板,发送给单个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumber 手机号
     * @return
     */
    public static String sendSmsResetPassword(String valcode, String time, String phoneNumber) {
        return sendSms(valcode, time, phoneNumber, Tencent.RESETPASSWORD_SMSTEMPLATEID);
    }

    /**
     * 登陆验证的短信模板,发送多个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumbers 手机号数组
     * @return
     */
    public static String[] sendSmsLogin(String valcode, String time, String[] phoneNumbers) {
        return sendSms(valcode, time, phoneNumbers, Tencent.LOGIN_SMSTEMPLATEID);
    }

    /**
     * 登陆验证的短信模板,发送给单个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumber 手机号
     * @return
     */
    public static String sendSmsLogin(String valcode, String time, String phoneNumber) {
        return sendSms(valcode, time, phoneNumber, Tencent.getLOGIN_SMSTEMPLATEID);
    }

    /**
     * 注册的手机号验证短信模板,发送多个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumbers 手机号数组
     * @return
     */
    public static String[] sendSmsRegister(String valcode, String time, String[] phoneNumbers) {
        return sendSms(valcode, time, phoneNumbers, Tencent.REGISTER_SMSTEMPLATEID);
    }

    /**
     * 注册的手机号验证短信模板,发送给单个手机号的短信验证
     * @param valcode 验证码值
     * @param time 验证码值在session中存留时间
     * @param phoneNumber 手机号
     * @return
     */
    public static String sendSmsRegister(String valcode, String time, String phoneNumber) {
        return sendSms(valcode, time, phoneNumber, Tencent.REGISTER_SMSTEMPLATEID);
    }

}

如果我确实帮到了你,给一个赞,让我知道。
如有不足,欢迎指出。


版权声明:本文为qq_41702154原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。