• 如何使用腾讯云短信平台实现短信发送功能
  • 发布于 2个月前
  • 241 热度
    0 评论
简介

发送短信功能是现在最为常见的系统功能,不管是用手机号登录,还是用手机号找回密码,甚至手机号支付都需要用到发送短信验证码功能。现在市面上的短信云平台很多,百度,腾讯,阿里,华为,可以说基本上每一家云技术厂商都有相应的解决方案。今天我们介绍的是如何使用腾讯云短信平台来发送短信。


腾讯云短信(Short Message Service,SMS)沉淀腾讯十多年短信服务技术和经验,为 QQ、微信等亿级平台和10万+客户提供快速灵活接入的高质量的国内短信与国际/港澳台短信服务。

特点:
国内短信验证秒级触达,99%到达率。
国际/港澳台短信覆盖全球200+国家/地区,稳定可靠。
申请
只要开通并个人认证就会默认送国内短信100条,白嫖还是很开心的!

签名
签名类型有APP、网站、公众号、小程序,不论是个人还是企业你只要提供相关的证明文件即可。因为撸主本人在腾讯有备案网站,所以直接申请的是网站签名,但是值得注意的是签名必须和网站备案的名称保持一致,否则不予通过。

模板
提交签名申请后,才可创建正文模板。只要不是特别违规的信息一般都能通过。以上填写完毕,基本在十分钟之内就会收到审核消息,腾讯云的审核速度还是蛮快的。审核通过后会再送你100条免费短信额度,加上之前的100条,测试还是蛮够的!

集成
配置参数
# 腾讯云短信平台
tencentcloud.sms.secretId=**********
tencentcloud.sms.secretKey=**********
tencentcloud.sms.appId=**********
映射类:
/**
 * 腾讯云短信
 */
@Data
@ConfigurationProperties(prefix = "tencentcloud.sms")
public class SendSmsProperties {

    private String secretId;
    private String secretKey;
    private String appId;

}
工具类:
/**
 * 短信发送
 * 堆代码 duidaima.com
 * 参考:https://cloud.tencent.com/document/product/382/43194#example
 * CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
 * 短信控制台:https://console.cloud.tencent.com/smsv2
 */
@Component
@Configuration
@EnableConfigurationProperties({SendSmsProperties.class})
public class SendSmsUtils {

    private final static Logger LOGGER = LoggerFactory.getLogger(SendSmsUtils.class);

    private SendSmsProperties sendSms;

    public SendSmsUtils(SendSmsProperties sendSms) {
        this.sendSms = sendSms;
    }

    private static String code = "OK";

    /**
     * 发送
     */
    public void sand(Sms sms) {
        LOGGER.info("发送短信:{}",Arrays.toString(sms.getMobile()));
        try {
            /**
             * 实例化一个认证对象
             */
            Credential cred = new Credential(sendSms.getSecretId(), sendSms.getSecretKey());
            /**
             * 实例化一个客户端配置对象
             */
            ClientProfile clientProfile = new ClientProfile();
            /**
             * 实例化 SMS 的 client 对象
             */
            SmsClient client = new SmsClient(cred, "",clientProfile);
            /**
             * 实例化一个请求对象
             */
            SendSmsRequest req = new SendSmsRequest();
            /**
             * SDK appId 短信-应用管理-应用列表
             */
            req.setSmsSdkAppid(sendSms.getAppId());
            /**
             * 签名 短信-国内短信-签名管理,必须是审核通过的
             */
            req.setSign(sms.getSign());
            /**
             * 模板ID 短信-国内短信-正文模板管理,必须是审核通过的
             */
            req.setTemplateID(sms.getTemplateId());
            /**
             * 如+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号
             */
            String[] phoneNumberSet = new String[sms.getMobile().length];
            String[] array = sms.getMobile();
            for(int i=0;i<phoneNumberSet.length;i++){
                phoneNumberSet[i] = "+86"+array[i];
            }
            req.setPhoneNumberSet(phoneNumberSet);
            /**
             * 模板参数{}
             */
            String[] templateParams = sms.getParams();
            req.setTemplateParamSet(templateParams);
            /**
             * 发送请求
             */
            SendSmsResponse res = client.SendSms(req);
            /**
             * 打印成功失败信息
             */
            SendStatus[] status = res.getSendStatusSet();
            if(code.equals(status[0].getCode())){
                LOGGER.info("短信:{}发送成功", Arrays.toString(sms.getMobile()));
            }else{
                LOGGER.info("短信:{}发送失败", SendSmsResponse.toJsonString(res));
            }
        } catch (TencentCloudSDKException e) {
            LOGGER.error("短信:{}发送失败,{}",Arrays.toString(sms.getMobile()),e.getMessage());
        }
    }
}
实体参数:
/**
 * 短信参数
 */
@Data
public class Sms {

    /**
     * 签名
     */
    private String sign ;
    /**
     * 模板
     */
    private String templateId;
    /**
     * 手机号
     */
    private String[] mobile;
    /**
     * 模板参数 {}
     */
    private String[] params;
}
最后测试一下发送:
@RequestMapping("sms")
public Result sms() {
    try {
        Sms sms = new Sms();
        sms.setMobile(new String[]{"17788888888"});
        sms.setParams(new String[]{"堆代码"});
        sms.setSign("云图");
        sms.setTemplateId("844589");
        sendSmsUtils.sand(sms);
    } catch (Exception e) {
        return  Result.error();
    }
    return  Result.ok();
}
小结
个人渠道申请还是挺方便的,只要你拥有备案域名、小程序或者公众号就可以申请,小伙伴们速度来薅腾讯的羊毛吧。
用户评论