生成验证码
@Autowired
private StringRedisTemplate redisTemplate;.

    @Value("${tx.cloud.sms.login.templateId}")private String templateId;@Value("${tx.cloud.secretId}")private String secretId;@Value("${tx.cloud.sms.sdkAppId}")private String sdkAppId;@Value("${tx.cloud.sms.signName}")private String signName;
public String generateCaptcha(ChannelEntity entity) {//判断是否符合手机号发送的标准SySAuthUserEntity userEntity =new SySAuthUserEntity();userEntity.setPhoneNo(entity.getPhoneNo());//feign调用查看该手机号是否在数据库中存在List<SySAuthUserEntity> list =sysUcClient.getUserByPhone(userEntity).getData();if(CollectionUtils.isEmpty(list)){throw BizException.wrap(ResultCode.VALIDATE_FAILED.build("当前手机号在系统中不存在对应用户"));}//判断1分钟内是否已经调用过短信发送if(redisTemplate.hasKey("captcha"+entity.getPhoneNo())){throw BizException.wrap(ResultCode.VALIDATE_FAILED.build("短信已发送,请勿重复点击"));}//生成6位随机数ThreadLocalRandom random =ThreadLocalRandom.current();String captcha =String.format("%6d",random.nextInt(999999));//写入缓存,并设置60s过期时间redisTemplate.opsForValue().set("captcha"+entity.getPhoneNo(),captcha,60,TimeUnit.SECONDS);ChannelEntity channelEntity =new ChannelEntity();channelEntity.setPhone(entity.getPhoneNo());channelEntity.setTemplateParamSet(new String[]{captcha});//发送短信验证码sendSms(channelEntity,templateId);return captcha;}

发送短信

public void sendSms(ChannelEntity channelEntity,String templateId) {//由于腾讯限制,每次调用设置0.5s延迟try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}try{/*** 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId, secretKey*/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-singapore,地域列表可参考* https://intl.cloud.tencent.com/document/api/382/4066?lang=en#region-list*/SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);/*** 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数* 你可以通过官网查询SDK源码确定接口有哪些属性可以设置* 属性可能是基本类型,也可能引用了另一个数据结构* 推荐使用idea进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明*/SendSmsRequest req = new SendSmsRequest();/*** 填充请求参数,这里request对象的成员变量即对应接口的入参* 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义* 基本类型的设置:* 帮助链接:* 短信控制台:https://console.cloud.tencent.com/smsv2* sms helper:* https://intl.cloud.tencent.com/document/product/382/3773?from_cn_redirect=1*//* 短信应用ID: 短信SDKAppId在【短信控制台】添加应用后生成的实际的sdkAppId,示例 1400006666*/req.setSmsSdkAppId(sdkAppId);/* 短信签名内容:使用UTF-8编码,必须填写自己审核通过的签名,签名信息可登录【短信控制台】查看 */req.setSignName(signName);/* 国际/港澳台短信 SsenderId :中国大陆地区短信您填空,默认未开通,如需开通请联系【sms helper】 */String senderid = "";req.setSenderId(senderid);/* 用户的session 内容:可以携带用户侧ID等上下文信息,server会原样返回 */String sessionContext = "XXX";req.setSessionContext(sessionContext);/* 短信号码扩展号:默认为开通,如需开通请联系【sms helper】*/String extendCode = "";req.setExtendCode(extendCode);/* 模板id :必须填写已审核通过的模板ID 模板ID可登录【短信控制台】查看*/req.setTemplateId(templateId);/*** 下发手机号码,采用E.164标准,+【国家或地区码】【手机号】* 示例如:+8613711112222 ,其中前面有一个+号* 86为国家码 ,13711112222为手机号,最多不要超过200个手机号*/String[] phoneNumberSet = {channelEntity.getPhone()};if (CollectionUtils.isNotEmpty(channelEntity.getPhoneList())) {phoneNumberSet = new String[channelEntity.getPhoneList().size()];phoneNumberSet = channelEntity.getPhoneList().toArray(phoneNumberSet);}req.setPhoneNumberSet(phoneNumberSet);/* 模板参数:若无模板参数,则设置为空*/String[] templateParamSet = channelEntity.getTemplateParamSet();req.setTemplateParamSet();/*** 通过client 对象调用SendSms 方法发起请求,注意请求方法与请求对象是对应的* 返回的 res 是一个SendSmsResponse 类的实例,与请求对象对应*/SendSmsResponse res = client.SendSms(req);//输出json格式的字符串回包System.out.println(SendSmsResponse.toJsonString(res));//也可以取出单个值,可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义System.out.println(res.getRequestId());}catch(TencentCloudSDKException e){e.printStackTrace();}}

实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
public class ChannelEntity {private String fileFolderName;private String taskName;private String objectName;private String photo;private String deptName;/*** 通知开关 0关闭 1打开*/private String msgSwitch;/*** 模板入参数组*/private String[] templateParamSet;/*** 手机号集合*/private List<String> phoneList;
}

【生成短信验证码,发送短信】相关推荐

  1. [风一样的创作]二次封装阿里云短信 验证码 发送短信 查询短信 编辑短信

    1.首先要注册阿里云,购买阿里云短信服务,拿到AccessKey ID和AccessKey Secret 链接: https://usercenter.console.aliyun.com/#/man ...

  2. php调用nexmo发送短信,在 Laravel 中 “规范” 的开发短信验证码发送功能

    Laravel简介 Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行 ...

  3. 短信验证码测试——短信轰炸之横向轰炸和纵向轰炸

    短信轰炸也分为水平轰炸和垂直轰炸.按字面意思猜一下,就像这样.据我所知,目前还有很多短信接口可以被水平轰炸,尤其是在网页中,没有对短信接口做一些必要的限制,导致无限呼叫和滥用的存在. 因为手机号码格式 ...

  4. QPW 手机短信验证码发送日志表(tf_sms_send_log)

    文章目录 手机短信验证码发送日志表 需求说明 手机短信验证码发送日志表 CREATE TABLE `tf_sms_send_log` (`send_id` bigint(11) NOT NULL AU ...

  5. flask项目之5:短信验证码发送

    概述: 短信验证码的发送需要限制验证码的发送间隔不能不停的发,因为测试时发送的验证码是要花钱的,不可能不花钱就办事 短信验证码要根据图片验证码是不是正确再进行发, 进行短信验证码的实验要测试容联云平台 ...

  6. TP5 短信宝 发送短信验证码

    一.请求发送短信接口 public function sendCode(){//接收手机号$data['phone'] = input('get.phone');//判断是否接到手机号$validat ...

  7. java实现发送短信验证码、短信验证码防刷校验-49

    一:认证服务环境搭建 1.新建gulimail-auth-server 2.整合相关依赖 <!--引入commom依赖--><dependency><groupId> ...

  8. 网易云信-短信验证码发送、验证

    提示:本文仅记录本人工作中遇到的难点与个人见解,仅供参考,如有问题请见谅. 目录 前言 一.网易云信短信服务是什么? 二.使用步骤 1.创建网易云信工具类CheckSumBuilder 2.短信验证码 ...

  9. 阿里云短信服务 发送短信验证码 区分业务场景

    总结: 配置好阿里云短信服务API调用所需配置项信息 按业务场景自定义标识码,做到正确发送不同场景的短信验证码 有一点需要特别注意:写这篇文章时,偶然发现阿里云短信服务API,在遇到以数字0开头的随机 ...

  10. 如何使用阿里巴巴短信服务发送短信验证码

    关于调用阿里巴巴短信服务发送短信验证的接口的方法: 用户的注册 1.首先我们需要在阿里大于(www.alidayu.com)注册一个账号登录 点击进入控制台 点击使用短信服务 然后需要你申请签名和模板 ...

最新文章

  1. 送餐机器人市场达11.6亿 美团将成“搅局者”?
  2. Elasticsearch 与 Kafka 整合剖析
  3. PHPStorm不能修改PHP langauge level
  4. Python面向对象(三)
  5. 2019年的第三场LiveVideoStackCon有何不同?
  6. mysql怎么合并行_mysql怎么合并行
  7. 软考笔记(数据结构篇)———— 二叉树、树、森林转换
  8. vmlinuz/vmlinux、Image、zImage与uImage的区别
  9. 软件测试学习(一)软件测试基础知识
  10. 华为的薪酬体系整体框架,值得收藏
  11. Windows 10 的快捷关机方式
  12. 日更第1天:Linux常用命令之dnf用法
  13. 金蝶标准版迷你版常见问题汇总
  14. 基于MODBUS通讯协议的酒厂温湿度、光照度数据采集系统的设计与实现
  15. 【办公实用网站收集】免费模板
  16. MongoError: The dotted field .. is not valid for storage
  17. 625线,525线什么意思?
  18. 开发脚手架及封装自动化构建工作流
  19. 怎么就那么多SlectObject和DeleteObject···········
  20. 从GPT到chatGPT(二):GPT2

热门文章

  1. 微信公众号调用视频列表(自定义菜单)
  2. hdu5775 Bubble Sort(线段树求逆序数)
  3. 设备维护保养管理系统
  4. java代码如何写正则汉字规则_JAVA 正则表达式、汉字正则、 java正则代码
  5. 斜滑块斜导柱计算公式_如何计算模具斜导柱长度
  6. 输出1000以内的所有”水仙花数“,所谓”水仙花数“是指一个一个三位数,其各位数字立方和等于该数本身
  7. 智慧井盖-物联网智能井盖系统-管网数字化监测,守护城市生命线
  8. lis3dh与lis3dsh官方驱动及例子
  9. DeepLab V2学习笔记
  10. 20230228英语学习