⽤阿⾥云发送验证码使⽤步骤以及验证码后台校验思路
⼀、阿⾥云短信服务使⽤介绍
  1、登录阿⾥云官⽹,到短信服务,选择签名管理
  2、添加签名,如何添加⾃⼰看就可以了,很简单,签名内容就是内容的第⼀句话,这⾥注意的就是通⽤签名现在只有公司才能⽤,个⼈只能⽤验证码签名
  3、除了签名以外,还要添加短息模板,我们将通过代码⽅式调⽤⼯具类,传⼊签名、短信模板、⼿机号来发送验证码,模板可以⽤⾃动⽣成的
  4、在时需要进⾏⾝份认证,只有认证通过才能,所以还需要在阿⾥云的右上⾓点击⽤户,获取密钥
  5、⽆论你选则下⾯哪个都⾏,我们选择⼦⽤户,指定⽤户权限,⽽不是分配所有权限。
  6、我们要点击编程访问
  7、新建⽤户成功后要进⾏授权,⾃⼰,懒得放图⽚了,到创建的⽤户就能看到授权两个字了
  8、给新建的⽤户添加权限内容,搜索⼀下短信服务,两个都点上
  9、然后就⽣成密钥,就是要注意,因为是点击的编程访问,所以密钥⼀定要记得复制然后保存,因为只会出现这⼀次,以后再也不会出现(我说的密钥就是下图的KeyID和
KeySecret)
  10、最后记得,这个服务要钱的,只不过不贵就是了
  11、java使⽤短信验证码api在官⽹上就能到,⽤户指南啥的,懒得去看了,我直接把我改了下的⼯具类放在这吧
/**
* 阿⾥云短信验证⼯具类
* */
public class AliSNMUtil {
public static final String TEMPLET_IDENTIFYING ="SMS_20475xxxx";//发送验证码的模板
/**
*
* 验证码
* phone:发送给哪个电话号码,需传⼊
* identifyingCode:发送的验证码内容
* templet:传⼊短信模板,阿⾥云⾥⾯有
*/
public static void sendVerification(String phone,Object identifyingCode,String templet) throws ClientException {
//设置超时时间-可⾃⾏调整
System.setProperty("sun.client.defaultConnectTimeout", "10000");
System.setProperty("sun.client.defaultReadTimeout", "10000");
//初始化ascClient需要的⼏个参数
final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,⽆需修改)
final String domain = "dysmsapi.aliyuncs";//短信API产品域名(接⼝地址固定,⽆需修改)
//替换成你的AK
final String accessKeyId = "xxxxxxxxxxxxxxxxxxx";//你的accessKeyId,参考本⽂档步骤2
final String accessKeySecret = "xxxxxxxxxxxxxxxx";//你的accessKeySecret,参考本⽂档步骤2
//初始化ascClient,暂时不⽀持多region(请勿修改)
IClientProfile profile = Profile("cn-hangzhou", accessKeyId,
accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
SendSmsRequest request = new SendSmsRequest();
//使⽤post提交
request.setMethod(MethodType.POST);
//必填:待发送⼿机号。⽀持以逗号分隔的形式进⾏批量调⽤,批量上限为1000个⼿机号码,批量调⽤相对于单条调⽤及时性稍有延迟,验证码类型的短信推荐使⽤单条调⽤的⽅式;发送国际/港澳台消息时,接收号码格式为国际区号+号码,如“852        request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中到
request.setSignName("ABC商城");
//必填:短信模板-可在短信控制台中到,发送国际/港澳台消息时,请使⽤国际/港澳台短信模版
request.setTemplateCode(templet);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
//友情提⽰:如果JSON中需要带换⾏符,请参照标准的JSON协议对换⾏符的要求,⽐如短信内容中包含\r\n的情况在JSON中需要表⽰成\\r\\n,否则会导致JSON在服务端解析失败
//参考:request.setTemplateParam("{\"变量1\":\"值1\",\"变量2\":\"值2\",\"变量3\":\"值3\"}")
request.setTemplateParam("{\"code\":\""+identifyingCode+"\"}");
//可选-上⾏短信扩展码(扩展码字段控制在7位或以下,⽆特殊需求⽤户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务⽅扩展字段,最终在短信回执消息中将此值带回给调⽤者
request.setOutId("yourOutId");
//请求失败这⾥会抛ClientException异常
SendSmsResponse sendSmsResponse = AcsResponse(request);
Code() != null && Code().equals("OK")) {
//请求成功
System.out.println("发送成功!");
}
}
}
  12、但是,你只复制了⼀个⼯具类,肯定满篇报错满篇红,别急,依赖都没加,玩个屁啊
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
⼆、验证码校验思路
    在项⽬中,你要发验证码简单,但你得校验啊,不是⼀哆嗦把短信发了然后就提裤⼦⾛⼈,你得负责啊,别⼈把验证码输⼊了,你怎么确定他输⼊正确呢?
    思路⾮常简单的,直接在redis中保存就好了,⽤收验证码的⼿机号码做key,⽤验证码内容做值,存储五分钟,发验证码之前先在redis中存储⼀份,提交表单后拿输⼊
的验证码跟redis中的验证码匹配⼀下就知道对不对了。步骤搞起来:
  1、因为要⽤到redis,所以还得加redis依赖,下⾯就不细分步骤了,直接跟着⼀步步来就可以
依赖:我没有指定版本号,⾃⼰选择⽐较好
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>at.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端⼝ -->
<port>84</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
配置l,spring整合redis
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:p="/schema/p"
xmlns:context="/schema/context"
xmlns:dubbo="code.alibabatech/schema/dubbo"
xmlns:mvc="/schema/mvc"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd
/schema/mvc
/schema/mvc/spring-mvc.xsd
code.alibabatech/schema/dubbo
code.alibabatech/schema/dubbo/dubbo.xsd
log4j2 appender
/schema/context
/schema/context/spring-context.xsd">
<!--Jedis连接池的相关配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal">
<value>200</value>
</property>
<property name="maxIdle">
<value>50</value>
</property>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="true"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6379" type="int" />
<constructor-arg name="timeout" value="30000" type="int" />
</bean>
</beans>
⽇志⽂件,log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
配置l,启动加载spring容器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"
xmlns="java.sun/xml/ns/javaee"
xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>      <!-- 下⾯的两个 * ,前⾯⼀个表⽰当前⼯程依赖的⼯程⾥⾯如果有相同⽂件名的配置,也会被当前⼯程加载                后⾯⼀个表⽰这个⽂件名后⾯⽆        <param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.t.ContextLoaderListener</listener-class>
</listener>
</web-app>
这样创建的⼯程环境应该就没有问题了,如果出现什么爆红什么的,⾃⼰动动⼿看看什么情况吧,可能是格式错误
  2、现在开始调⽤⼯具类发送验证码,并将验证码存⼊redis中
/**
* 发送验证码
* */public class Test001{
/**
* 发送验证码
* */
@Test
public static void main test02(){
try {
//⽣成验证码,我⽤的是⼯具类,RandomizationUtil,在我的⼩⼯具分类的随笔中有
Integer identifyingCode = (ateValidateCode(6));
//将验证码存⼊redis五分钟,第⼀个参数是电话号,第⼆个是在redis中存多久,单位是秒,第三个是⽣成的验证码
//调⽤⽅法,参数去看发送验证码的⼯具类就⾏了,在上⾯
AliSNMUtil.sendVerification(131********,String(),ALiSNMUtil.TEMPLET_IDENTIFYING);
return new Result(true,"验证码发送成功");
} catch (ClientException e) {
e.printStackTrace();
return new Result(true,"验证码发送失败");
}
}
}
  3、从redis中取验证码⽐较,上⾯这段代码和下⾯这段代码不要拷贝,因为我是从⾃⼰项⽬中拷贝出来的,随意修改,只需要看⽤了什么⽅法就⾏了,代码不多//校验验证码是否正确,第⼀⾏代码是操作redis,根据key获取值,第⼆⾏代码是从map中获取⽤户输⼊的验证码,第三⾏就是判断了
String redisVerificationCode = Resource().get(telephone);
String validateCode = (String) ("validateCode");
if (StringUtils.isEmpty(redisVerificationCode)|| StringUtils.isEmpty(validateCode)||!redisVerificationCod
e.equals(validateCode)) {
return new Result(false, MessageConstant.VALIDATECODE_ERROR);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。