一、准备工作
- 聚合数据 首先在聚合数据官网中进行注册
- 然后申请短信API服务,初次使用赠送5次
- 申请成功之后,AppKey特别重要,不要让别人知道,然后再点击模板
- 点击模板,填写模板内容,要申请通过,不通过拿不到模板ID。最主要是要得到模板ID,这是要发送到你手机上的内容
- 这些弄好后可以写代码测试呢
二、短信API接口需要了解的地方
- 查看聚合数据中短信API接口,需要接口地址和请求参数(如果你要用请求示例的地址栏进行请求也是可以的)
- 请求返回的数据
三、写代码实现
1.Demo中使用的是httpclient包
- HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
2.创建项目java发送短信Demo链接
- 创建一个项目
- 在pom文件引入httpclient依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</version>
</dependency>
- 项目图,创建一个MyHttpClientDemo文件
- MyHttpClientDemo代码:
package com.ming;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyHttpClientDemo {
public static String doPost(String url, Map<String, String> params) {
//创建一个httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//返回参数
String result = "";
//构建响应对象
CloseableHttpResponse response = null;
try {
//构建post请求
HttpPost post = new HttpPost(url);
if (params != null){
//构建参数
List<NameValuePair> paramList = new ArrayList<>();
for (Map.Entry<String,String> param: params.entrySet()){
paramList.add(new BasicNameValuePair(param.getKey(),param.getValue()));
}
//模拟表单对象
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramList, Charset.defaultCharset());
post.setEntity(formEntity);
}
response = httpClient.execute(post);
result = EntityUtils.toString(response.getEntity(), Charset.defaultCharset());
} catch (Exception e) {
e.printStackTrace();
} finally {
close(httpClient,response);
}
return result;
}
private static void close(CloseableHttpClient httpClient, CloseableHttpResponse response){
try {
if (response != null){
response.close();
}
if (httpClient != null){
httpClient.close();
}
} catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Map<String, String> params = new HashMap<String, String>();
params.put("mobile","自己的手机号码"); //填写自己的手机号码
params.put("tpl_id","211907"); //提写自己的短信模板ID
params.put("tpl_value","%23code%23%3d5643"); //5643是验证码,可以自己随便填写
params.put("key","自己的AppKey"); //这里写自己的AppKey
params.put("dtype","json"); //返回的是json格式的数据
System.out.println(MyHttpClientDemo.doPost("http://v.juhe.cn/sms/send",params));
}
}
- 运行代码,看到控制台打印输出这个,证明发送验证码成功呢
- 手机上会收到短信验证码
- 完成
四、将验证码存储到Redis中(大概步骤)
- 用户进入到注册页面,有手机号,密码,验证码,点击获取验证码时,把手机号作为参数请求服务器端的验证码功能方法的url
- 服务器端首先根据传过来的手机号码,从redis中通过手机号码(key)获取验证码(value),如果验证码查询到说明验证码没有过期
- 如果没有在redis中通过手机号码查询到验证码,说明验证码不存在或者说已经过期
- 此时通过UUID随机生成4位数字,存储到redis中
- 然后将手机号码和验证码作为参数,调用短信API的代码,通过运营商发送给用户
- 如果发送成功,将手机号码和验证码及其过期时间存储到redis中
- 如果失败,则提示用户发送短信失败,请再次发送
- 用户点击注册按钮,通过用户传过来的手机号码和输入的验证码,在redis中通过手机号码查询验证码,该验证码与用户传过来的验证码进行比较,如果相等,则重定向到登录页面,增加用户体验