java实现发送手机验证码功能
1. 进入秒嘀科技(http://www.miaodiyun.com/),注册一个账号
2. 注册好之后,点击 用户中心 -> 账户管理,就会进入如下界面 (顺便提一下,新注册的用户,平台会免费赠送你10元,足够大家学习和使用了,所以不用担心需要充钱) 你需要做的就是获取你自己的 ACCOUNT SID 和 AUTH TOKEN
3. 点击 用户中心 -> 认证,进行企业认证,企业的资质证件就是企业的营业执照,网上百度一张带有红色的公章就行,公司电话填写自己的就行,最后点击提交
4. 需要在秒嘀上新建一个发送手机验证码的模板,点击 配置管理 -> 验证码短信模板,就会进入如下界面
5. 点击“新建模板”按钮, 填写好模板名称、短信签名 和 短信内容(短信内容可以选择 验证码通知短信模板 或者 自己编写短信内容),点击“提交审核”按钮即可,界面如下
6. 然后等待 短信验证码模板 审核通过即可,点击 配置管理 -> 验证码短信模板,查看 短信验证码 是否审核通过
7. 接下来就是代码了,把我圈住的地方改成自己的就行,其他的不用动,tamp值 一定要与自己创建短信模板的短信内容保持一致
8. java短信发送验证码
导入阿里巴巴fastjson.jar包:
方式一:下载fastjson.jar包导入工程就行 链接:https://pan.baidu.com/s/1RH4-x82G8-sNmn7y5YhdjA
方式二:maven工程直接把 下面这段代码复制到 pom.xml 中就行
-
<dependency>
-
<groupId>com.alibaba
</groupId>
-
<artifactId>fastjson
</artifactId>
-
<version>1.2.47
</version>
-
</dependency>
源码如下 :
-
package com.group.util;
-
-
import java.io.BufferedReader;
-
import java.io.InputStreamReader;
-
import java.io.OutputStreamWriter;
-
import java.net.HttpURLConnection;
-
import java.net.URL;
-
import java.security.MessageDigest;
-
import java.security.NoSuchAlgorithmException;
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
-
import com.alibaba.fastjson.JSONObject;
-
-
/**
-
*
-
* @Title:GetMessageCode
-
* @Description:发送验证码
-
* @author:ヅ零碎de記憶ぷ
-
* @Date 2018年7月4日 下午9:27:04
-
*/
-
public
class GetMessageCode {
-
private
static
final String QUERY_PATH =
"https://api.miaodiyun.com/20150822/industrySMS/sendSMS";
-
private
static
final String ACCOUNT_SID =
"";
-
private
static
final String AUTH_TOKEN =
"";
-
-
// 根据相应的手机号发送验证码
-
public static String getCode(String phone) {
-
String rod = smsCode();
-
String timestamp = getTimestamp();
-
String sig = getMD5(ACCOUNT_SID, AUTH_TOKEN, timestamp);
-
String tamp =
"【联途旅游】尊敬的用户,您好,您的验证码为:" + rod +
",若非本人操作,请忽略此短信。";
-
OutputStreamWriter out =
null;
-
BufferedReader br =
null;
-
StringBuilder result =
new StringBuilder();
-
try {
-
URL url =
new URL(QUERY_PATH);
-
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-
connection.setRequestMethod(
"POST");
-
connection.setDoInput(
true);
// 设置是否允许数据写入
-
connection.setDoOutput(
true);
// 设置是否允许参数数据输出
-
connection.setConnectTimeout(
5000);
// 设置链接响应时间
-
connection.setReadTimeout(
10000);
// 设置参数读取时间
-
connection.setRequestProperty(
"Content-type",
"application/x-www-form-urlencoded");
-
// 提交请求
-
out =
new OutputStreamWriter(connection.getOutputStream(),
"UTF-8");
-
String args = getQueryArgs(ACCOUNT_SID, tamp, phone, timestamp, sig,
"JSON");
-
out.write(args);
-
out.flush();
-
// 读取返回参数
-
-
br =
new BufferedReader(
new InputStreamReader(connection.getInputStream(),
"UTF-8"));
-
String temp =
"";
-
while ((temp = br.readLine()) !=
null) {
-
result.append(temp);
-
}
-
}
catch (Exception e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
JSONObject json = JSONObject.parseObject(result.toString());
-
String respCode = json.getString(
"respCode");
-
String defaultRespCode =
"00000";
-
if (defaultRespCode.equals(respCode)) {
-
return rod;
-
}
else {
-
return defaultRespCode;
-
}
-
}
-
-
// 定义一个请求参数拼接方法
-
public static String getQueryArgs(String accountSid, String smsContent, String to, String timestamp, String sig,
-
String respDataType) {
-
return
"accountSid=" + accountSid +
"&smsContent=" + smsContent +
"&to=" + to +
"&"+
"timestamp=" + timestamp
-
+
"&sig=" + sig +
"&respDataType=" + respDataType;
-
}
-
-
// 获取时间戳
-
public static String getTimestamp() {
-
return
new SimpleDateFormat(
"yyyyMMddHHmmss").format(
new Date());
-
}
-
-
// sing签名
-
public static String getMD5(String sid, String token, String timestamp) {
-
-
StringBuilder result =
new StringBuilder();
-
String source = sid + token + timestamp;
-
// 获取某个类的实例
-
try {
-
MessageDigest digest = MessageDigest.getInstance(
"MD5");
-
// 要进行加密的东西
-
byte[] bytes = digest.digest(source.getBytes());
-
for (
byte b : bytes) {
-
String hex = Integer.toHexString(b &
0xff);
-
if (hex.length() ==
1) {
-
result.append(
"0" + hex);
-
}
else {
-
result.append(hex);
-
}
-
}
-
}
catch (NoSuchAlgorithmException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
-
return result.toString();
-
}
-
-
// 创建验证码
-
public static String smsCode() {
-
String random = (
int) ((Math.random() *
9 +
1) *
100000) +
"";
-
return random;
-
}
-
}
-
9. 测试发送手机短信验证码 源码如下 (手机号码换成你想要发送到指定手机的手机号码即可)
-
package com.message.test;
-
-
public
class Test {
-
-
public static void main(String[] args) {
-
String phone =
"12345678910";
-
GetMessageCode.getCode(phone);
-
}
-
-
}
10. 常见的问题
(1)返回错误码 00104 “相同的应用当天给同一手机号发送短信的条数小于等于n” 如何处理?
答:此错误是同一手机号短信发送请求频率限制,请求失败也算次;
验证码短信下发次数限制为:1分钟2次、1小时4次、24小时内10次;
通知类短信下发次数限制为:24小时内20次;
营销类短信下发次数限制为:24小时内20次。
验证码短信24小时下发10次,不能修改
通知类短信有需要可调整下发次数
该类配置的修改需要在后台中修改设置,客户端不能设置
如果在测试时候遇到请求限制,可联系客服添加白名单
(2)返回错误码 00134 "没有和内容匹配的模板” 如何处理?
答:请检查是否在官网建立模板,smscontent=【短信签名】+内容,发送内容要与模板匹配。
(3)返回错误码 0005 "timestamp已过期” 如何处理?
答:把获取时间戳 getTimestamp()方法中的 return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());换成return System.currentTimeMillis()+""; 即可。
本文作者:TwcatL_tree
本文链接:https://www.cnblogs.com/twcat/p/16912651.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步