JAVA实现手机短信验证(详解)

目录

一、准备工作

二、具体实现

         JAVA代码

三、总结


一、准备工作

首先要找一个提供短信验证服务的平台。
上一年我写短信验证的时候,这种平台还是很容易就找到了,而且是注册就免费送余额,但是现在基本上都是要公司认证才能使用,或者用钱买短信条数,比如:阿里云,5000条起卖,卖几百块钱,这对于我们学生来说未免负担太大了。
我这一次也是找了秒嘀云平台(之前好像也是这个,注册就能用了,但是现在要公司认证,不过不用担心,接下来我会教你们一个小方法)
秒嘀云:http://www.miaodiyun.com/

1号才注册实现的,方法和代码都是最新的

1、注册

在秒嘀云注册完成后,首先要进行验证才可以使用
在这里插入图片描述
我这里是已经认证了,认证的时候需要提供自己公司的营业执照,但是自己只是一名普通学生没有公司怎么办呢?

以下有两种方法可以解决:

1. 上网找一个带红章的营业执照
2. 自己去周边的超市、饭店什么的都行,找到他们的营业执照拍下来就行了

我一开始是在网上随便找了一张营业执照去认证,结果客服小姐姐就打电话给我了,她先问了我用来干什么的,我很诚实地回答了:学生,测试。然后她告诉我:只有公司能用,你的营业执照是网上找的吧……😂(当然也有人找成功的,但我不好意思又让客服小姐姐打电话给我了😅)

方法一,pass。

然后我不死心跑去了我们学校的饭堂拍了他们的营业执照,上传,然后成功通过验证了🤫
这里需要注意以下几点:

  1. 营业执照不能有边框
  2. 姓名记得填营业执照上的法人代表
  3. 编号填“社会信用代码”
2、编辑短信模板

身份验证通过后,就可以去编辑验证码的短信模板了
在这里插入图片描述
点击“模板库”可以使用现成的模板
在这里插入图片描述
选好模板后继续填写剩下的内容:
在这里插入图片描述
注意:短信签名与营业执照上面的不一样时,会审核失败,但是没有关系,多审核几次就通过了😁😁

二、具体实现

1、API文档和demo下载

打开短信配置,点击API文档和demo下载。
也可不下载,直接看我的代码。
在这里插入图片描述

2、ACCOUNT_SID和AUTH_TOKEN的获取

还是同一个页面,点击查看即可获取
在这里插入图片描述

3、JAVA代码

1. Config.class(配置类)

ACCOUNT_SID和AUTH_TOKEN填入上一步获取到的内容

public class Config {
	/**
	 * url前半部分
	 */
	public static final String BASE_URL = "https://openapi.miaodiyun.com/distributor/sendSMS";

	/**
	 * 开发者注册后系统自动生成的账号,可在官网登录后查看
	 */
	public static final String ACCOUNT_SID = "***********";

	/**
	 * 开发者注册后系统自动生成的TOKEN,可在官网登录后查看
	 */
	public static final String AUTH_TOKEN = "****************";

	/**
	 * 响应数据类型, JSON或XML
	 */
	public static final String RESP_DATA_TYPE = "JSON";
}

2. Http请求工具

这里没有什么要改的,直接复制粘贴就行

package utils;

import org.apache.commons.codec.digest.DigestUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

/**
 * http请求工具
 */
public class HttpUtil {
    /**
     * 构造通用参数timestamp、sig和respDataType
     *
     * @return
     */
    public static String createCommonParam(String sid,String token) {
        // 时间戳
        long timestamp = System.currentTimeMillis();
        // 签名
        String sig = DigestUtils.md5Hex(sid + token + timestamp);

        return "&timestamp=" + timestamp + "&sig=" + sig + "&respDataType=" + Config.RESP_DATA_TYPE;
    }

    /**
     * post请求
     *
     * @param url
     *            功能和操作
     * @param body
     *            要post的数据
     * @return
     * @throws IOException
     */
    public static String post(String url, String body) {
        System.out.println("body:" + System.lineSeparator() + body);

        String result = "";
        try {
            OutputStreamWriter out = null;
            BufferedReader in = null;
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();

            // 设置连接参数
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(20000);
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 提交数据
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            out.write(body);
            out.flush();

            // 读取返回数据
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line = "";
            // 读第一行不加换行符
            boolean firstLine = true;
            while ((line = in.readLine()) != null) {
                if (firstLine) {
                    firstLine = false;
                } else {
                    result += System.lineSeparator();
                }
                result += line;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 回调测试工具方法
     *
     * @param url
     * @return
     */
    public static String postHuiDiao(String url, String body) {
        String result = "";
        try {
            OutputStreamWriter out = null;
            BufferedReader in = null;
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();

            // 设置连接参数
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(20000);

            // 提交数据
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            out.write(body);
            out.flush();

            // 读取返回数据
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line = "";
            // 读第一行不加换行符
            boolean firstLine = true;
            while ((line = in.readLine()) != null) {
                if (firstLine) {
                    firstLine = false;
                } else {
                    result += System.lineSeparator();
                }
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

3. 发送工具

这里只需修改一些发送的短信内容就可以了,尽量从自己的模板复制粘贴过来,不然有可能会审核不通过。然后直接将其中的变量{1}替换成自己生成的验证码。

package utils;

import java.net.URLEncoder;

/**
 * @author 0416
 * @date 2019/11/1
 **/
public class SendMessageUtil {

    /**
     * 短信发送(验证码通知)
     */
    public static Integer execute(String phone) throws Exception {
        StringBuilder sb = new StringBuilder();
        sb.append("accountSid").append("=").append(Config.ACCOUNT_SID);
        sb.append("&to").append("=").append(phone);
        sb.append("&param").append("=").append(URLEncoder.encode("", "UTF-8"));
        // 验证码
        Integer verifyCode = UUIDUtil.getVerifyCode();

        sb.append("&smsContent").append("=").append(URLEncoder.encode(
                "【自己的签名】尊敬的用户,您的短信验证码为" + verifyCode +
                        ",2分钟内有效,若非本人操作请忽略。", "UTF-8"));
        String body = sb.toString() + HttpUtil.createCommonParam(Config.ACCOUNT_SID, Config.AUTH_TOKEN);
        String result = HttpUtil.post(Config.BASE_URL, body);
        System.out.println(result);

        return verifyCode;
    }

}

  1. 验证码生成工具
package utils;

/**
 * @author 0416
 * @date 2019/11/1
 **/
public class UUIDUtil {

    /**
     * 获取六位随机验证码
     * @return
     */
    public static int getVerifyCode(){
        int vertifyCode = (int)(Math.random()*(999999-100000+1)+100000);
        return vertifyCode ;
    }
}

5. 调用方法

我写代码的时候是使用了ssm框架的。

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import static utils.SendMessageUtil.execute;


/**
 * @author 0416
 * @date 2019/11/1
 **/
@Controller
public class SendMessageController {

    @RequestMapping("/sendMessage.do")
    public void sendMessage(String phone){
        try{
            Integer verifyCode = execute(phone);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

三、总结

1. 发送的短信内容一定要在自己的模板那里添加并审核通过
(我一开始因为模板内容有点出入,找不到原因就去问客服了,结果还是同一个客服小姐姐给我打了电话,问我是不是需要技术支持,我说是的;然后她说:你是学生测试吧,学生是不可以使用的……看来她已经记住我了,太尴尬了🤣🤣不知道一开始就一口咬定是公司使用回是什么结果,你们可以试一下👀)

2. 代码执行之后很快就能收到验证码,如果没有可以去秒嘀云上查看一下是不是审核没有通过
(这里需要注意一下,审核没通过后台也给我返回了发送成功的信息,我一直以为自己代码出问题了)
在这里插入图片描述
在产品概览那里能看到发送成功还是失败
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章