使用阿里大于的短信服务需要先去开通相应服务,具体过程:https://www.jb51.net/article/171902.htm,https://www.cnblogs.com/shubs/p/12092089.html

加依赖:

<!--阿里大于短信--><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.3</version></dependency>

然后拿到下面几个参数:

1、密钥:AccessKeyId、AccessKeySecret

2、模板CODE

3、短信签名(2和3在阿里云官网设置)

可以先去官网的OpenAPI Explorer中测试是否成功:

信息填好发送返回成功即可

再去看看官网是怎么发送请求的:

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
/*
pom.xml
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.3</version>
</dependency>
*/
public class SendSms {public static void main(String[] args) {DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>"); //密钥IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");request.putQueryParameter("RegionId", "cn-hangzhou");try {
//模板CODE、手机、签名等都在request中CommonResponse response = client.getCommonResponse(request); System.out.println(response.getData());} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}}
}

发现很简单,我们就是把一些参数封装进request中,其他基本可以照抄:

@Slf4j
public class SendSmsUtils {// 阿里云API密钥,注意空格private static String accessKeyId = "LTAI4FrRvd4jiP4EHy782";private static String accessSecret = "w7mImDkpvVorcKLL";//模板private static String templateCode= "SMS_202550742";//签名private static String signName = "ABC商城";/**** @param phoneNumber 接收手机号,可多个,验证码发送最好只一个手机号* @param signName 签名名称* @param templateCode 模板CODE* @param templateParam 模板参数,JSON字符串{code:123567}*/public static String SendMessage(String phoneNumber,String templateParam){DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessSecret);IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");request.putQueryParameter("RegionId", "cn-hangzhou");// 接收手机号码,多个以逗号隔开request.putQueryParameter("PhoneNumbers", phoneNumber);// 签名名称request.putQueryParameter("SignName", signName);// 模板CODErequest.putQueryParameter("TemplateCode", templateCode);// 模板缺失内容request.putQueryParameter("TemplateParam", templateParam);try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());return response.getData();} catch (ServerException e) {e.printStackTrace();return null;} catch (ClientException e) {e.printStackTrace();return null;}}}

这样我们在controller中调用该方法即可发送成功:

    @AutowiredSmsService smsService;@ApiOperation("获取手机验证码")@GetMapping("/sms")@ApiImplicitParam(value = "手机号",name = "phone",required = true,dataType = "string",paramType = "query")public String getSMSCode(@RequestParam("phone") String phone){//向验证码服务请求发送验证码return smsService.sendMsg(phone);}

上面是一个简单的发送验证码的例子,验证码一般是用于登陆/注册时用到,而真实的项目,可以在接到请求时在后台生成验证码,然后将其放到redis中(设置过期时间),在用户收到验证码时则填写完发到后端,此时再去和redis中的验证码进行对比。

然而这样还是有多个问题需要考虑:
1、前端中请求验证码的接口暴露,可能被恶意刷接口

2、用户多次请求,重复请求(接口幂等性)

3、换ip/手机去刷

前端控制每60分钟发送一次,在接口调用时添加图形验证码(在提交时增加图片验证码来限制机器请求,一般图片验证码可以防止大部分的机器刷码)、单ip请求限制、限定每天每个号码获取短信验证码的次数、限制短信验证码的调用频率等

正常用户重复请求可以前端控制60s一次就可以了,也可以利用token机制,在前端和后端(redis)放同一个码,每次请求过来检验通过才给发验证码。

如果使用token机制还需要考虑另一个点,当数据要求比较严格时,如订单提交的幂等性,此时如果系统是分布式,考虑到并发高、且数据要求严格,此时则要对其token加上分布式锁,以保证只有一个进程拿到redis中的token并进行后面的操作。

当然一个接口保证幂等性除了token机制,还可以在后端维护一个重复表,每次请求来看下有没有重复的,重复的则不进行处理,

还有一些对数据库的操作本身是具有幂等性的,如查询,更新删除时不对值进行增量计算(例不要用a+=2,或-1等变量操作)

!!!!!!!!!!!!!!!!!扯太远了

(如果是订单的别忘了要考虑分布式事务的处理啊)

https://blog.csdn.net/weixin_42023666/article/details/89680342

阿里大于短信——发送手机验证码相关推荐

  1. 阿里大于短信发送调用

    阿里大于使用文档 Sdk 所需sdk文件:taobao-sdk-java-auto_1455552377940-20160607.jar 下载地址:https://www.alidayu.com/ce ...

  2. java实现阿里大于短信发送服务

    这篇文章主要介绍一下手机号注册,发送短信验证码的功能 觉得有帮助的点赞支持一下吧. 这里我们采用的是阿里大于的服务来实现,链接如下:阿里云 界面描述还是比较详细的,展示了短信服务的完整流程快速学习短信 ...

  3. C#使用极光短信发送手机验证码

    引用极光官方类库,或下载提供的资源. JpushEvents.cs using System; using System.Collections.Generic; using System.Linq; ...

  4. Java 阿里大于短信功能

    最近做了阿里大于短信的功能,记录一下 创建应用,并记录下应用的KeyId 及 KeySecret 下载sdk 准备完毕,直接上代码 随便弄个  controller @ApiOperation(&qu ...

  5. springMVC+阿里云API = 实现发送手机验证码短信

    springMVC+阿里云API = 实现发送手机验证码短信 前段时间vue框架做了一个旅游APP软件,其中在用户登录APP的时候,我不仅提供了用户可以自己手动先去注册账号在进行登陆App.然后我还提 ...

  6. 阿里大于短信接口php,附件六 阿里大于短信接口

    # 附件六 阿里大于短信接口 [TOC] * 2017-12-10 阿里大于 短信API接口 TP5专用类库 https://www.kancloud.cn/mikkle/thinkphp5_stud ...

  7. JAVA对接阿里大于短信验证

    本文介绍的是JAVA的阿里大于短信验证对接,网上好多版本都是旧版本,我自己写完之后觉得应该更新一下,现在记录一下,怕以后忘记,申请步骤忽略 首先,去阿里大于下载SDK 第一步,就是安装阿里大于的SDK ...

  8. 阿里大鱼短信发送接口开发

    一. API接口介绍 alibaba.aliqin.fc.sms.num.send (短信发送) 向指定手机号码发送模板短信,模板内可设置部分变量.使用前需要在阿里大于管理中心添加短信签名与短信模板. ...

  9. Java阿里云短信发送工具类

    短信服务API介绍 阿里云短信发送:调用SendSms发送短信_短信服务-阿里云帮助中心 <!--springboot项目阿里云发送短信--> <dependency>< ...

最新文章

  1. 斯坦福大学开发自主无人机摄影的算法,可显著提高电影中无人机镜头品质
  2. 光荣与梦想 | XMove动作捕捉系统(一)
  3. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径
  4. RDL/RDLC批量单据打印 [转]
  5. 周五话分析 | 方法论难落地?来个量身定制版本吧(AARRR模型)
  6. linux scull 的内存使用
  7. 模板原理和操作数据类的观点【艰难的一天,慢慢的会过去的】
  8. Node.js 部署免费/自动续订 HTTPS
  9. python拓展7(Celery消息队列配置定时任务)
  10. 高效的企业测试–测试框架(5/6)
  11. 认识CUBA平台的CLI
  12. 主存和cache每一块相等_CPU中的Cache实现原理
  13. oracle11g基目录和主目录,Red Hat Enterprise Linux4.0 安装oracle11g
  14. ASP.NET Forms验证 实现子域名(SubDomain)共享登陆下的缺陷 [转]
  15. 关于DOS/DDOS攻击和防御
  16. 投影html连接电脑,投影仪怎么连接电脑 电脑与投影仪的连接方法
  17. android如何加密所有的布局文件夹,android:是否可以加密文件夹
  18. 计算机怎样安装硬盘,固态硬盘安装-笔记本和台式电脑分别如何安装SSD详细图文教程...
  19. conda create创建虚拟环境失败
  20. 云服务器ecs是虚拟机,云服务器ecs虚拟机

热门文章

  1. 物联网卡流量池是什么东西?
  2. 计算机存储一个字节数是,一个字节可以存储多大的数字?
  3. NPS如何成为流量增长破局点
  4. [POI2008]CLO
  5. 使用dependency-check-maven对项目进行漏洞检查
  6. 微信小程序输入框小数点后保留两位
  7. UE4嵌入网页的方法
  8. 图形学笔记(十三)光线追踪3——双向反射分布函数BRDF(反射方程、递归方程)、辐射度量学基础radiometry、立体角、Radiant Energy、Flux、Irrdiance、Radiance
  9. java左手握右手_队列动作要领:
  10. [英语单词] stack的含义