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. 代碼執行之後很快就能收到驗證碼,如果沒有可以去秒嘀雲上查看一下是不是審覈沒有通過
(這裏需要注意一下,審覈沒通過後臺也給我返回了發送成功的信息,我一直以爲自己代碼出問題了)
在這裏插入圖片描述
在產品概覽那裏能看到發送成功還是失敗
在這裏插入圖片描述

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