1. 程式人生 > >通過聚合資料API實現快遞資料查詢-簡訊驗證碼-企業核名

通過聚合資料API實現快遞資料查詢-簡訊驗證碼-企業核名

有位朋友讓我給他新開的網站幫忙做幾個小功能,如下:

  1. 輸入快遞公司、快遞單號,查詢出這個快件的所有動態(從哪裡出發,到了哪裡)
  2. 在註冊、登入等場景下的手機驗證碼(要求有一定的防刷策略)
  3. 通過輸入公司名的關鍵詞,檢視這個公司是否已經註冊、法人資訊、有類似名稱的公司等等

並且可以用的介面、文件都提供給我了。
其中需求 1、2,都通過 聚合資料 這家網站提供的介面實現;需求 3 通過 雲聚資料 來實現。

本專案的檔案

因為朋友的網站是用 ThinkPHP 寫的,為了保持將來程式碼的相容,這三個功能也用 ThinkPHP 寫成。

專案的所有檔案都放在了 GitHub 上,部分敏感資料已經隱藏,你需要自行替換,地址如下:

因為這三個功能並不是正式產品,將來會需要嵌入到網站的各個功能模組中去,所以為了檢視起來方便,三個功能的程式碼都寫在一個檔案裡,你只要重點關注以下幾個檔案就好:

  • /Home/Conf/config.php 引數配置檔案
  • /Home/Controller/IndexController.class.php 後端程式碼、API的請求與處理
  • /Home/View/Index_index.html 前端 html

申請 KEY 和閱讀開發文件

分別到上面兩家網站上找到“快遞”、“簡訊”、“核名”的文件地址,根據裡面的說明,把 KEY、URL 等資訊放入配置檔案Home/Conf/config.php,方便後面重複使用。

核名-文件

注意 簡訊的 API 服務,要先到網站的後臺新增“簡訊模板”,讓管理員稽核後才可以正常呼叫

最後,Home/Conf/config.php 配置檔案裡的內容如下:

return array(
    // 快遞查詢
    'EXPRESS_APP_KEY' => '你的快遞 APPKEY',
    'EXPRESS_QUERY_URL' => 'http://v.juhe.cn/exp/index', //快遞單號查詢
    'EXPRESS_COM_URL' => 'http://v.juhe.cn/exp/com', //快遞公司查詢
    // 發簡訊
    'SEND_SMS_KEY' => '你的簡訊介面 APPKEY',
    'SEND_SMS_URL' => 'http://v.juhe.cn/sms/send',
    // 核名
    'COMPANY_KEY' => '核名 APPKEY',
    'COMPANY_URL' => 'http://eci.yjapi.com/ECIFast/Search',
    //資料庫配置資訊
    'DB_TYPE'   => 'mysql', // 資料庫型別
    'DB_HOST'   => 'localhost', // 伺服器地址
    'DB_NAME'   => '你的資料庫名', // 資料庫名
    'DB_USER'   => '你的資料庫使用者名稱', // 使用者名稱
    'DB_PWD'    => '密碼', // 密碼
    'DB_PORT'   => 3306, // 埠
    'DB_PREFIX' => 'pre_', // 資料庫表字首 
    'DB_CHARSET'=> 'utf8', // 字符集
);

設定資料庫

為了防止惡意使用者利用暴露在外的簡訊介面搗亂,需要對每個手機號碼的行為進行記錄。例如:

  • 向某個手機號碼傳送簡訊驗證碼後, 60 秒內不能再次傳送
  • 必須在 1 小時內填寫簡訊驗證碼,否則會過期
  • 避免 ajax 請求地址被機器人程式利用,在表單裡要使用圖片驗證碼才能提交資料

關於“表單驗證碼”我們後面程式碼會說明,這裡先建立表結構如下,用於記錄簡訊傳送記錄:

CREATE TABLE `pre_smsrecord` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `mobile` varchar(11) NOT NULL DEFAULT '',
  `tpl_id` int(11) NOT NULL,
  `code` int(6) NOT NULL,
  `time` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=M
  • mobile 是手機號碼
  • tpl_id是在網站後臺新增並通過稽核的簡訊模板
  • code是傳送的驗證碼(一般是4位或6位)
  • time是傳送時間戳

直接下載sql進行還原:在本專案的 GitHub 地址上也可以直接從 /Pubic 目錄找到 sql 檔案,你可以直接把它還原你的 MySQL 上。

表單驗證碼的實現

最終效果如下:

驗證碼

因為三個功能都需要表單驗證碼,所以首先實現它。

開啟 /Home/View/Index_index.html,注意裡面圖片驗證碼 img 標籤,以及對應的 javascript

<p>
    (通用)輸入驗證碼 <input type="text" name="verify" id="verify">
    <img id="verify-img" src="/?m=Home&c=Index&a=verify" alt="">
    <a id="btn-refresh-verify" href="javascript:;" title="">重新整理</a>
</p>
<script type="text/javascript" charset="utf-8">
jQuery(document).ready(function($) {
    // 重新整理驗證碼按鈕
    $("#btn-refresh-verify").click(function(event) {
    
        $("#verify-img").attr('src', '/?m=Home&c=Index&a=verify' + "&time=" + new Date().getTime());
    });
});
</script>


對應的後端程式碼在 /Home/Controller/IndexController.class.php 中
/**
* +--------------------------------------------------------------------------
* 生成驗證碼
*
* +--------------------------------------------------------------------------
*/
public function verify(){
    $Verify = new \Think\Verify();
    $Verify->entry();
}
/**
* +--------------------------------------------------------------------------
* 檢查驗證碼
*
* @param string $code 輸入的驗證碼
* @return boolean
* +--------------------------------------------------------------------------
*/
protected function check_verify($code){
    $verify = new \Think\Verify();
    return $verify->check($code);
}

通用的 Curl 方法,用來向第三方網站的 API 發起請求並獲取返回值

因為 3 個功能實際上都是通過網路來請求一個第三方網站的 API 介面地址,因此可以統一成一個通用的方法。程式碼如下,可以傳入三個變數,分別為 :url、引數陣列、請求方式(是否是post,預設為0),返回一個 json 格式的資料。

/**
* +--------------------------------------------------------------------------
* 通用的“聚合資料”請求介面,返回JSON資料
*
* @param string $url 介面地址
* @param array $params 傳遞的引數
* @param int $ispost 是否以POST提交,預設GET
* @return json
* +--------------------------------------------------------------------------
*/
public function juhecurl($url,$params=false,$ispost=0){
    $httpInfo = array();
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
    curl_setopt( $ch, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22' );
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 30 );
    curl_setopt( $ch, CURLOPT_TIMEOUT , 30);
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
    if( $ispost )
    {
        curl_setopt( $ch , CURLOPT_POST , true );
        curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
        curl_setopt( $ch , CURLOPT_URL , $url );
    }
    else
    {
        if($params){
            curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
        }else{
            curl_setopt( $ch , CURLOPT_URL , $url);
        }
    }
    $response = curl_exec( $ch );
    if ($response === FALSE) {
          //echo "cURL Error: " . curl_error($ch);
        return false;
    }
    $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
    $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
    curl_close( $ch );
    return $response;
}

後面我們獲取快遞資料、傳送簡訊、查詢企業名稱,都可以呼叫這個通用的方法。

獲取快遞資料列表的實現

最終效果如下:

開啟 /Home/View/Index_index.html

<h1>獲取快遞資料</h1>
<div id="express-module">
    <p>
        選擇公司
        <select name="express-company" id="express-company">
            <option value="sf">順豐</option>
            <option value="sto">申通</option>
            <option value="yt">圓通</option>
            <option value="yd">韻達</option>
            <option value="tt">天天</option>
            <option value="ems">EMS</option>
            <option value="zto">中通</option>
            <option value="ht">匯通</option>
        </select>
    </p>
    <p> 
        輸入單號 <input type="text" name="express-number" id="express-number"> 
    </p>
    <p>
        <button id="btn-query-express" type="button" class="btn btn-default">查詢快遞</button> 
    </p>
    
    <p>返回結果:</p>
    <p id="reason" style="color:#FF0000"></p>
    
    <p>快件動態:</p>
    <ul id="express-result">
        
    </ul>
</div>    
<!-- 引入jquery庫 -->
<script src="__PUBLIC__/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" charset="utf-8">
jQuery(document).ready(function($) {
    //點選快遞查詢按鈕
    $("#btn-query-express").click(function(event) {
        $("#reason").html("");
        // 更新驗證碼
        $("#verify-img").attr('src', '/?m=Home&c=Index&a=verify' + "&time=" + new Date().getTime());
        $.getJSON(
            '/?m=Home&c=Index&a=getExpressData', 
            {
                company: $("#express-company").val(),
                number: $("#express-number").val(),
                verify: $("#verify").val(),
            }, 
            function(json, textStatus) {
                if(json['resultcode'] == 200){
                    var result_list = json['result']['list'];
                    $("#express-result").html("");
                    for(var i = 0, l = result_list.length; i < l; i++) {
                        $("#express-result").append("<li>" + result_list[i]['datetime'] + "," + result_list[i]['remark'] + "," +result_list[i]['zone'] + "</li>");
                    }
                }
                $("#reason").html(json['reason']);
        });
    });
});
</script>
對應的後端程式碼為如下,特別注意,你要把 $content = $this->juhecurl(C("EXPRESS_QUERY_URL"), $params, 1); 這段的註釋去掉(因為我開發的時候查詢餘額不足,所以使用了一個寫死的陣列來讓程式能正常執行)
/** 
* +--------------------------------------------------------------------------
* 獲取快遞資料
*
* @param string $get.company 快遞公司程式碼
* @param string $get.number 快遞單號
* @return json
* +--------------------------------------------------------------------------
*/
public function getExpressData(){
    // 傳入 get 引數,包括公司代號、快遞單號、驗證碼
    $com    = I("get.company");
    $no     = I("get.number");
    $verify = I("get.verify");
    // 處理驗證碼
    if ( !$this->check_verify($verify) ) {
        $content = array('resultcode'=>1000, 'reason'=>'驗證碼填寫錯誤');
        echo json_encode($content);
        exit();
    }
    // 處理機器人程式刷介面(目前通過IP判斷)
    $ip = get_client_ip(0, true);
    $Record = M("expressrecord");
    $express_record = $Record->where("ip='" . $ip . "'")->find();
    if( $express_record && ( (time() - $express_record['time']) < 60 ) ){
        echo json_encode(array('reason'=>'60秒內只能查詢一次'));
        exit();
    }
    if ( $com && $no ) {
        $params = array(
            'key' => C("EXPRESS_APP_KEY"),
            'com'  => $com,
            'no' => $no
        );
        // 開發測試階段直接返回值,不請求 API
        // $content = $this->juhecurl(C("EXPRESS_QUERY_URL"), $params, 1);
        $content = array('resultcode'=>200, 'reason'=>'查詢成功', 'result'=>array('list'=>array()));
        // 刪除舊記錄(如果有),然後新增新的記錄
        $Record->where("ip='" . $ip . "'")->delete();
        $data = array(
            'ip' => $ip,
            'time'=>time()
        );
        $Record->add($data);
        //$returnArray = json_decode($content,true);
        echo json_encode($content, true);
    }
}

簡訊驗證碼的傳送和檢驗

廢話不多說,前端html直接上程式碼。這裡實際上有兩個動作,一個是“給我手機號碼 xxxxx 發個驗證碼”,另一個是“我已經收到了,並填寫了,請看我填寫的驗證碼對不對”。

<h1>傳送簡訊驗證碼與檢查</h1>
<div id="sms-module">
    <p>
        簡訊模板:
        <select name="send-sms-tplid" id="send-sms-tplid">
            <option value="5596">申請註冊</option>
            <option value="5602">申請找回密碼</option>
            <option value="5603">線上核名</option>
        </select>
    </p>
    
    <p>
        手機號碼:<input type="text" name="send-sms-mobile" id="send-sms-mobile">
    </p>
    
    <p>
        輸入手機驗證碼:<input type="text" name="send-sms-code" id="send-sms-code">
        <span id="sms-count-down"></span>
        <button id="btn-send-sms" type="button" class="btn btn-default">傳送驗證碼</button>
    </p>
    
    <p>
        <button id="btn-check-sms" type="button" class="btn btn-default">提交手機驗證碼</button>
    </p>
</div>
<script type="text/javascript" charset="utf-8">
/**
* 傳送簡訊驗證碼後,60秒倒計時
*/
var seconds_left = 60;
function sms_count_down(){
    if(seconds_left > 0){
        seconds_left = seconds_left-1;
        //var b=new Date();
        
        document.getElementById("sms-count-down").innerHTML = seconds_left + "秒";
        setTimeout("sms_count_down()",1000);
    } else {
        //根據 http://stackoverflow.com/questions/7526601/setattributedisabled-false-changes-editable-attribute-to-false
        // 不能為 setAttribute 設定任何值,都會變成 ”disabled“,要使用 removeAttribute
        document.getElementById("btn-send-sms").removeAttribute("disabled");
        document.getElementById("btn-send-sms").innerHTML = "重新發送";
        document.getElementById("sms-count-down").innerHTML = "";
    }
}
jQuery(document).ready(function($) {
//傳送簡訊
    $("#btn-send-sms").click(function(event) {
        $("#reason").html("");
        $.getJSON(
            '/?m=Home&c=Index&a=sendSMS', 
            {
                tplid: $("#send-sms-tplid").val(),
                mobile: $("#send-sms-mobile").val(),
            }, 
            function(json, textStatus) {
                $("#reason").html(json['reason']);
                var error_code = json['error_code'];
                if(error_code == 0){
                    // 測試階段,不禁用,可檢查 60 秒重複傳送
                    //$("#btn-send-sms").attr("disabled", true);
                    //開始倒計時
                    sms_count_down();
                }else{
                    $("#btn-send-sms").html("重新發送");
                }
    
        });
    });
    //檢查簡訊驗證碼
    $("#btn-check-sms").click(function(event) {
        $("#reason").html("");
        // 更新驗證碼
        $("#verify-img").attr('src', '/?m=Home&c=Index&a=verify' + "&time=" + new Date().getTime());
        $.getJSON(
            '/?m=Home&c=Index&a=checkSmsCode', 
            {
                tplid: $("#send-sms-tplid").val(),
                mobile: $("#send-sms-mobile").val(),
                code: $("#send-sms-code").val(),
                verify: $("#verify").val(),
            }, 
            function(json, textStatus) {
                $("#reason").html(json['reason']);
    
        });
    });
    
});
同樣因為有兩個動作,後端會稍微複雜一點點
/**
* +--------------------------------------------------------------------------
* 請求傳送簡訊介面,60秒後才能重新發送
*
* @param int $get.tplid 簡訊模板id
* @param string $get.mobile 手機號碼
* @return json
* +--------------------------------------------------------------------------
*/
public function sendSMS(){
    $tpl_id = I("get.tplid"); // 簡訊模板id:註冊 5596 找回密碼 5602 線上核名 5603
    $mobile = I("get.mobile"); // 手機號碼
    // 檢查資料庫記錄 ,是否在 60 秒內已經發送過一次
    $Record = M("smsrecord");
    $where = array(
        'mobile' => $mobile,
        'tpl_id' => $tpl_id,
    );
    $sms_record = $Record->where($where)->find();
    if( $sms_record && ( (time() - $sms_record['time']) < 60 ) ){
        echo json_encode(array('reason'=>'60秒內不能多次傳送'));
        exit();
    }
    // 如果60秒內沒有發過,則傳送驗證碼簡訊(6位隨機數字)
    $code = mt_rand(100000, 999999);
    $smsConf = array(
        'key'   => C("SEND_SMS_KEY"), //您申請的APPKEY
        'mobile'    => $mobile, //接受簡訊的使用者手機號碼
        'tpl_id'    => $tpl_id, //您申請的簡訊模板ID,根據實際情況修改
        'tpl_value' =>'#code#=' . $code //您設定的模板變數,根據實際情況修改 '#code#=1234&#company#=聚合資料'
    );
     
    //測試階段,不發簡訊,直接設定一個“傳送成功” json 字串
    $content = $this->juhecurl(C("SEND_SMS_URL") ,$smsConf, 1); //請求傳送簡訊
    //$content = json_encode(array('error_code'=>0, 'reason'=>'傳送成功'));
    if($content){
        $result = json_decode($content,true);
        $error_code = $result['error_code'];
        if($error_code == 0){
            // 狀態為0,說明簡訊傳送成功
            // 資料庫儲存傳送記錄,用於處理倒計時和輸入驗證,首先要刪除舊記錄
            $Record->where("mobile=" . $mobile)->delete();
                $data = array(
                    'mobile' => $mobile,
                    'tpl_id'=> $tpl_id,
                    'code'=>$code,
                    'time'=>time()
                );
                $Record->data($data)->add();
            //echo "簡訊傳送成功,簡訊ID:".$result['result']['sid'];
        }else{
            //狀態非0,說明失敗
            //echo "簡訊傳送失敗(".$error_code."):".$msg;
        }
    }else{
        //返回內容異常,以下可根據業務邏輯自行修改
        //$result['reason'] = '簡訊傳送失敗';
    }
    echo $content;
}
/**
* +--------------------------------------------------------------------------
* 檢查填寫的手機驗證碼是否填寫正確
* 可以新增更多欄位改造成註冊、登入等表單
*
* @param string $get.verify 驗證碼
* @param string $get.mobile 手機號碼
* @param int $get.tplid 簡訊模板ID
* @param int $get.code 手機接收到的驗證碼
* +--------------------------------------------------------------------------
*/
public function checkSmsCode(){
    $verify = I("get.verify");
    $tpl_id = I("get.tplid"); // 簡訊模板id:註冊 5596 找回密碼 5602 線上核名 5603
    $mobile = I("get.mobile"); // 手機號碼
    $code = I("get.code"); // 手機收到的驗證碼
    if(!$this->check_verify($verify)){
        $content = array('resultcode'=>1000, 'reason'=>'驗證碼填寫錯誤');
        echo json_encode($content);
        exit();
    }
    // 檢查資料庫記錄,輸入的手機驗證碼是否和之前通過簡訊 API 傳送到手機的一致
    $Record = M("smsrecord");
    $where = array(
        'mobile' => $mobile,
        'tpl_id' => $tpl_id,
        'code' => $code,
    );
    $sms_record = $Record->where($where)->find();
    if($sms_record){
        echo json_encode(array('reason'=>'簡訊驗證碼核對成功'));
        // 處理後面的程式(如繼續登入、註冊等)
    }else{
        echo json_encode(array('reason'=>'簡訊驗證碼錯誤'));
    }

最後是企業核名

因為這個介面本來只提供了每次查詢一個關鍵詞,而朋友的網站要求能每次查詢用“,”分隔的多個關鍵詞,因此需要對提交的資料和返回到前端的進行一番處理(迴圈處理多個列表)。

前端程式碼比較簡單

<h1>企業核名</h1>
<div id="company-module">
    <p>
        省份:上海
        <input type="hidden" name="company-province" id="company-province" value="SH">
    </p>
    <p>
        <input type="text" name="company-name" id="company-name">
    </p>
</div>
<button id="btn-company" type="button" class="btn btn-default">企業核名</button>
<p>公司查詢列表:</p>
<ul id="company-result">
    
</ul>
<javascript 略……
//企業核名(可輸入多個以逗號分隔的名稱來多次查詢)
$("#btn-company").click(function(event) {
    $("#reason").html("");
    $("#company-result").html("");
    // 更新驗證碼
    $("#verify-img").attr('src', '/?m=Home&c=Index&a=verify' + "&time=" + new Date().getTime());
    $.getJSON(
        '/?m=Home&c=Index&a=getCompanyName', 
        {
            province: $("#company-province").val(),
            companyName: $("#company-name").val(),
            verify: $("#verify").val(),
        }, 
        function(json, textStatus) {
            if(json['reason']){
                $("#reason").html(json['reason']);
            } else {
                //console.log(json);
                var json_list = JSON.parse(json);
                if (json_list.length > 0){
                    for(i in json_list){
                        var result_list = json_list[i].Result;
                        if (result_list.length > 0){
                            for(j in result_list){
                                //console.log(result_list[j]);
                                $("#company-result").append("<li> 名稱:" + result_list[j].Name + ", 法人:" + result_list[j].OperName + ", 狀態:" + result_list[j].Status + "</li>");
                            }
                        }
                    }
                }
            }
    });
});
</javascript>
後端程式碼
/** 
* +--------------------------------------------------------------------------
* 企業核名
* 該介面 http://eci.yjapi.com/ECIFast/Search 僅支援 GET 方式,因此 $param 為字串形式
*
* @param string $get.province 省份
* @param string $get.companyName 公司名
* @return json
* +--------------------------------------------------------------------------
*/
public function getCompanyName(){
    // 傳入 get 引數
    $province                = I("get.province");
    $companyName    = I("get.companyName");
    $verify         = I("get.verify");
    // 處理驗證碼
    if ( !$this->check_verify($verify) ) {
        $content = array('resultcode'=>1000, 'reason'=>'驗證碼填寫錯誤');
        echo json_encode($content);
        exit();
    }
    // 處理機器人程式刷介面(目前通過IP判斷)
    $ip = get_client_ip(0, true);
    $Record = M("companyrecord");
    $company_record = $Record->where("ip='" . $ip . "'")->find();
    // if( $company_record && ( (time() - $company_record['time']) < 60 ) ){
    //     echo json_encode(array('reason'=>'60秒內只能查詢一次企業名稱'));
    //     exit();
    // }
    $resultArray = array();
    if ( $province && $companyName ) {
        // 刪除舊記錄(如果有),然後新增新的記錄
        $Record->where("ip='" . $ip . "'")->delete();
        // 迴圈處理多個公司名
        $companies = explode(",", $companyName);
        foreach ($companies as $key => $value) {
            $params = "key=" . C("COMPANY_KEY") . "&province={$province}&companyName={$value}";
            // 開發測試階段直接返回值,不請求 API
            $content = $this->juhecurl(C("COMPANY_URL"), $params, 0);
            $returnArray = json_decode($content,true);
            // 迴圈插入新的結果
            $resultArray[] = $returnArray;
            //$content = array('resultcode'=>200, 'reason'=>'查詢成功', 'result'=>array('list'=>array()));
        }
        $data = array(
            'ip' => $ip,
            'time'=>time()
        );
        $Record->add($data);
        $content = json_encode($resultArray, true);
        echo json_encode($content, true);
    }
}

結束

至此三個功能都已經完成了,但是在防止惡意使用者利用接口乾壞事的策略上,還可以更進一步。例如

  • 必須要註冊使用者才能傳送請求
  • 手機號碼每天只能限制傳送有限的驗證碼(因為目前即使每分鐘傳送一次,一天下來也比較可觀了)
  • 手機號碼註冊後,再次請求傳送驗證碼時,只能發給“已有”的手機號碼資料表裡的手機號碼,而不能把“找回密碼”發給一個還沒註冊的人。






相關推薦

通過聚合資料API實現快遞資料查詢-簡訊驗證-企業

有位朋友讓我給他新開的網站幫忙做幾個小功能,如下: 輸入快遞公司、快遞單號,查詢出這個快件的所有動態(從哪裡出發,到了哪裡)在註冊、登入等場景下的手機驗證碼(要求有一定的防刷策略)通過輸入公司名的關鍵詞,檢視這個公司是否已經註冊、法人資訊、有類似名稱的公司等等 並且可以用

【外掛分享】如何實現EmPireCMS帝國系統簡訊驗證功能

找到了一家不錯的簡訊外掛,有需要對接的可以檢視學習,在這邊分享一下,有需要的可以詳細看看,瞭解一下。http://www.ihuyi.com/ 外掛說明 本外掛系互億無線針對EmpireCMS v7.2 utf-8版本開發,外掛內的所有檔案均為對原檔案的修改,如果你的系統經過二次開發,安裝本外掛之前,請仔

JS實現註冊登入傳送簡訊驗證動態顯示60S倒計時完整案例

通常在web專案中都會遇到賬戶註冊或者忘記密碼時需要傳送簡訊驗證碼的功能,雖然說這種功能很常見,但是實際開發過程中很多人還會遇到不少坑。筆者經過整理把最近專案中的用到的這個傳送簡訊驗證碼動態顯示60S倒計時的完整實現過程分享給廣大開發者朋友。 1、頁面傳送簡訊驗證碼的表

【外掛分享】 簡訊如何實現Destoonb2b_V6.0對接簡訊驗證

對接簡訊的時候發現一家簡訊公司,有些不錯的簡訊驗證碼的外掛,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/ 外掛說明本外掛系互億無線針對DestoonB2B_V6.0簡訊外掛開發,外掛內的所有檔案均為對原檔案的修改,如果你的系統經過二次開發,安裝本外掛之前,請仔細核對修改。

ThinkPHP5聚合資料簡訊驗證介面實現註冊/忘記密碼功能

1、前端頁面主要程式碼 這裡點擊發送驗證碼按鈕通過ajax將相關資訊傳到後端getSms方法中。 <form class="form-horizontal form-signin" method="post" action="{:url('register/forget')

基於redis的zSet集合做資料快取實現分頁查詢 java

      需要場景:最近公司要做手機頁面展示新聞文章資料查詢的優化工作,讓我提個優化方案。現狀是目前手機頁面的資料請求系統後臺,系統後臺然後呼叫其他系統的介面,返回分頁資料到前臺展示,這樣一來,使用者每次下拉到頁面底部載入更多資料都要呼叫其他介面,使用者體驗顯然不是很好,那

JavaWeb企業級專案中接入順豐官方API實現物流實時查詢(親測有效)

由於現在順豐與快遞100鬧掰了,所以使用快遞一百已經查不到順豐的物流資訊了,包括快遞鳥等,現在想要在專案中實現順豐快遞的物流查詢只能用順豐官方API來查詢,然而這個官方的API並沒有快遞一百那些介面那麼容易,需要很複雜的一套流程,並且順豐用的返回形式都是XML檔案,就需要設計到XML檔案的修改與

安卓Bmob資料新增和查詢以及驗證

記錄一下利用Bmob對資料的增加和查詢以及驗證碼的索取,記錄以便以後的使用 原始碼點這裡,該demo實現了驗證簡訊以及資料上傳和圖片上傳 1,對於Bmob的基本配置建議百度,別人介紹的比我要好。 2,新建一個Lost類 package com.example.bmob; im

JavaWeb實現快遞物流查詢

網上的物流查詢介面有很多,但是大部分都比較麻煩。所以這裡介紹一個比較簡單的查詢方法,不需要註冊,只需要快遞單號和物流公司就可以的檢視物流資訊了。 介面連結 主要是利用 快遞100 的查詢網址: http://www.kuaidi100.com/query?type=快遞公司英文&

JMETER通過java程式碼通過程式碼/ JMETER API實現示例進行負載測試

本教程試圖解釋Jmeter的基本設計,功能和用法,Jmeter是用於在應用程式上執行負載測試的優秀工具。通過使用jmeter GUI,我們可以根據我們的要求為請求建立測試樣本並執行具有多個使用者負載的樣本。由於jmeter工具是使用JAVA完全開發的,我們可以編寫java程式碼來做同樣的事情而不使用jmete

通過潤乾API實現raq後臺匯出pdf

一、問題描述 客戶希望在JSP展現raq檔案的同時後臺將該raq匯出為pdf,儲存在相關路徑下。 二、解決思路 通過潤乾API實現該功能。 三、實現步驟 <%@pagecontentType="text/html;charset=gb2312"%>

關於java實現需要登入且帶驗證的定時網路爬蟲(爬取的資料存庫)

 博主6月初的時候換了個工作,剛進來的時候什麼事沒有,愣是上班喝茶逛網站渡過了一週。那週週五的boss突然問我會不會爬蟲。 作為一個才工作一年的javaer表示根本沒接觸過,但是那種情況下你還敢說不會麼,但是當時也不敢說的很絕對,因此就和boss就會一點。 當時就隱隱約約有爬

flask + sqlite3 + android 構建RESTful API實現個人資訊查詢系統 (上(伺服器端))

手裡有一些資料,原來是xls格式的,需要查詢一些資訊的時候用ecxel很不方便,所以便想做一套查詢系統,最好是Andriod的,隨時隨地就可以查詢,說幹就幹。 一、伺服器端 1.1 以前沒有接觸過後端,只做過安卓和前端,在問了其他人和上網搜尋比較之後,有以下幾種方案:

vue結合百度地圖Api實現周邊配置查詢及根據篩選結果顯示對應座標詳情

在我們平常寫房地產相關專案的時候經常會用到百度地圖,因為這一塊客戶會考慮到房源周圍的配套或者地鐵線路所以在這類專案中就不可以避免的會用到百度地圖,當然這只是其中一種,其他地圖工具也可以,因為我這個專案恰好要求用百度地圖,所以就好好學習了一波百度地圖,大概看了官方文件,發現沒有想象中那麼難,要相信自己可以做出來

接收簡訊訊息介面API,使用ajax跨域無重新整理實現根據手機號碼傳送6位簡訊驗證

應用場景:登入驗證,註冊賬號,密碼找回,繫結手機號等功能 1. 本介面採用的是聚合資料介面:https://www.juhe.cn/docs/api/id/54 2. 首先,註冊賬號申請快遞單號介面:獲取申請的key 3. 簡訊模板申請 3.1. 因為等會需

laravel中實現短信發送驗證

http client quest request 之前 name -i tid back 前段時間想實現一個短信驗證碼的功能,但是卡了很長時間。 首先我用的是阿裏雲的短信服務業務,其首次接入流程如下: 在阿裏雲上開通短信服務後需要做的: 1,申請簽名 2,申請模板

實現發送短信驗證後60秒倒計時

led () var class button jquery 計時 重新發送 jquery實現 方法一:js實現發送短信驗證碼後60秒倒計時 1、input[type=‘button’]按鈕 js方法實現 <!DOCTYPE html><html>&

Java使用SSM框架實現登錄頁面的驗證功能

def ssa bar double trac ext tst setattr info 最終效果展示: 代碼展示: 1、前端登錄頁面代碼展示 <div class="form-group"> <div class="input-ico

用countdowntimer實現60秒倒計時獲取驗證

博主android新手,有什麼不足求輕噴。 下面看下我的程式碼先 private void countDown() { timer = new CountDownTimer(60900, 1000) { @Override publ

簡訊外掛】微贊微信管理系統如何實現簡訊驗證功能

找到了一家不錯的簡訊外掛,有需要對接的可以檢視學習,在這邊分享一下,有需要的可以詳細看看,瞭解一下。http://www.ihuyi.com/外掛說明本外掛系互億無線針對微贊管理系統簡訊外掛開發,請按以下說明進行安裝,外掛內的所有檔案均為對原檔案的修改,如果你的系統經過二次開發,安裝本外掛之前,請仔細核對修改