短信接口API


我用的FLEA,可能大家都沒聽說過,但原理是一樣的,大家適當參考下吧。

  1. token和client_token我是配置在一個config文件里的

    array( 'token' => ' aaaa', 'param' =>array( 'url' => 'http://', // 短信接口地址 'method'=>'sms.send', // 接口名稱 自己定義的 'client_token' => 'bbbbbbb', ) ), ); ?>

2.api接口

<?php
        FLEA::loadClass('TMIS_Controller');
        class Controller_Org_Sms extends TMIS_Controller {
                    var $_json;//從json文件載入后的對象
                    var $_arr_method=array();//所有的方法名列表
                    var $_method;//當前的方法
                    var $_params;//當前參數
                    var $_success;//是否成功
                    var $_msg;//失敗的錯誤信息,或者成功后的結果json
                    // var $_modelExample;

                    function __construct() {
                            // $this->_modelExample = & FLEA::getSingleton('Model_Jichu_Message'); 這個是記錄發送短信的信息內容,發送人,時間等的表,如果不需要存數據庫,可以不用
                            $this->_url = "發送短信的url";
                    }



        /**
             * 生成簽名的算法,這個算法應該每個短信接口的網站都有自己的算法規則,我這里是互億的簽名算法
        */
                  private function getSign($params ,$token_client = ''){
   
                        //簽名步驟一:按字典序排序參數
                         ksort($params , SORT_STRING);

                        $string = http_build_query($params);

                        //簽名步驟二:在string后加入Token
                        $string = $string . "&client_token=".$token_client;
                        return strtoupper(md5($string));
                }

//發送短信的接口
                public function sendSms($params = array()){
                        $data = array(
                                'to'           =>$params['to'],
                                'content'      =>$params['content'],
                                'curtime'      =>time()-1,
                            );
                        return $this->callApi($data);
                }

            function callApi($post) {
                        require "Config/sms_config.php";
                        $arrSMS = $sms_config['SMS'];
                        $param = $arrSMS['param'];

                        $url = $param['url'];
                        $token = $arrSMS['token'];

                        $post['client_token'] = $arrSMS['param']['client_token'];
                        $post['method'] = $arrSMS['param']['method'];

                        $post['sign'] = $this->getSign($post ,$token);

                        //curl post 請求
                        $objRequest = FLEA::getSingleton('Api_Httprequest'); //調用第三步Api_Httprequest類
                        $result = $objRequest->post($post,$url);

                        $result = json_decode($result ,1);
                        return $result;
}

}
?>

3.curl 的 post請求和get請求封裝成一個類

    <?php
        /*********************************************************************\
         *  Remark :用curl模擬http請求,用來訪問api,一般在api的調用方被包含
        \*********************************************************************/
        class Api_Httprequest{

        //post方式提交數據,注意post_data不能有嵌套的數組
        public function post($post_data,$url) {
                        $ch = curl_init();
                        curl_setopt($ch, CURLOPT_POST, 1);
                        curl_setopt($ch, CURLOPT_HEADER, 0);
                        curl_setopt($ch, CURLOPT_URL,$url);
                        //設置cURL 參數,要求結果保存到字符串中還是輸出到屏幕上, 0為直接輸出屏幕,非0則不輸出
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                        //為了支持cookie
                        //curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
                        /*
                        // POST數據
                        curl_setopt($ch, CURLOPT_POST, 1);
                        // 把post的變量加上
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                        */
                        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
                        //curl_excc會輸出內容,而$result只是狀態標記
                        $result = curl_exec($ch);
                        $errorCode = curl_errno($ch);
                        //釋放curl句柄
                        curl_close($ch);

                        if(0 !== $errorCode) {
                                $this->_success = false;
                                $this->writeLog($url ,$post_data);
                        return false;
                        }

            $this->_success = true;
            $this->_msg = $result;
            $this->writeLog($url ,$post_data);
            // $result = ob_get_contents();
            // ob_end_clean();
            return $result;
    }

    function get($query,$url) {
            $info = parse_url($url);#print_r($info);exit;
            $fp = fsockopen($info["host"], 80, $errno, $errstr, 3);
            $head = "GET ".$info['path']."?".$info["query"]." HTTP/1.0\r\n";
            $head .= "Host: ".$info['host']."\r\n";
            $head .= "\r\n";
            $write = fputs($fp, $head);
            while (!feof($fp)) {
                    $line = fread($fp,4096);
                    echo $line;
            }
}

}
?>

4.前台傳值代碼












獲取驗證碼

		        </div>
      
                       <button type="submit" id="submit" tabindex="4">登 錄</button>
<script type="text/javascript">
    //點擊獲取驗證碼按鈕
        $('.action-get-verifycode').click(function(e){
		e.preventDefault();
        var el = document.getElementById('username') ;
        var elp = document.getElementById('password') ;
        if(this.hasClass('disabled')) return false;
        sendVerify(this,'username' + '=' + el.value + '&password' + '=' + elp.value);
});

	function sendVerify(el,data) {
    var url = el.href;
    var textCont = el.getElement('span span');
	el.addClass('disabled');
 	// $(el).find('span').attr('disabled',true);
 	// $(el).attr('disabled',true);
    textCont.innerHTML = el.innerText + '(<i>0</i> )';
    var ttt = textCont.getElement('i');
    var cd = new countdown(textCont.getElement('i'), {
        start: 60,
        secondOnly: true,
        callback: function(e) {
            el.removeClass('disabled');
            textCont.innerHTML = '重發驗證碼';
        }
    });
    Query.send(url, el, data, function(rs) {
        if(rs.success) {
            cd.stop();
            el.removeClass('disabled');
            textCont.innerHTML = '重發驗證碼';
        }else{
            cd.stop();
        	el.removeClass('disabled');
            textCont.innerHTML = '獲取驗證碼';
        }
    });
}

5.驗證用戶名,密碼,短信發送次數等,然后 調用方法:

//隨機取6位字符數
public function randomkeys($length){
$key = '';
$pattern = '1234567890'; //字符池
for($i=0;$i<$length;$i++){
$key .= $pattern{mt_rand(0,9)}; //生成php隨機數
}
return $key;
}

//設置session保存時間

public function start_session($expire = 0) {
if ($expire == 0) {
$expire = ini_get('session.gc_maxlifetime');
} else{
ini_set('session.gc_maxlifetime', $expire);
}
session_start();
setcookie(session_name(), session_id(), time() + $expire, "/");
}

從前台傳入用戶名和密碼,判斷是否正確
function actionSetVcode(){

	//判斷是否填寫用戶名
	if($_POST['username']){
		$p['username']=$_POST['username'];
	}else{
		$msg = "無效用戶名!";
		echo json_encode(array('success'=>false,'msg'=>$msg));
		exit;
	}

	$m=FLEA::getSingleton('Model_Acm_User');//加載用戶的數據庫

	//判斷用戶名和密碼是否一致
	$str = " SELECT passwd from acm_userdb where userName='{$p['username']}'";
	$passwd = $m->findBySql($str);

	if($passwd[0]['passwd']!=$_POST['password']){
		$msg = "用戶名和密碼不一致!";
		echo json_encode(array('success'=>false,'msg'=>$msg));
		exit;
	}

	//判斷用戶是否綁定手機號
	$sql = "SELECT phone from acm_userdb where userName='{$p['username']}'";
	$rs = $m->findBySql($sql);

	if(!$rs[0]['phone'] && $p['username']!='admin'){
		$msg = "對應用戶可能沒綁定手機號!";
		echo json_encode(array('success'=>false,'msg'=>$msg));
		exit;
	}

	$_SESSION['count'] = isset($_SESSION['count'])?$_SESSION['count']:0;
	if($_SESSION['count']>=3){
		$msg = "今日發送次數已用完";
		echo json_encode(array('success'=>false,'msg'=>$msg));
		exit;
	}

    if( time() - $_SESSION['lastmodify'] < 120 ){
                $msg = '2分鍾發送一次,還沒到兩分鍾則不進行發送';
                echo json_encode(array('success'=>false,'msg'=>$msg));
	    exit;
        }




    $vcode = $this->randomkeys(6);//取得隨機6位數驗證碼

    $mobile = $rs[0]['phone'];
    $time_sess = 3600 * 3;//設置驗證碼有效時間
	$this->start_session($time_sess);

    $_SESSION['VcodeforLogin'] = $vcode;
    $_SESSION['mobileforLogin'] = $mobile;
    $_SESSION['username'] = $_POST['username'];
    $_SESSION['password'] = $_POST['password'];
    $_SESSION['count'] ++;
    $_SESSION['lastmodify'] = time();

    $content = "您的驗證碼是:".$vcode."。請不要把驗證碼泄露給其他人。";

$Sms = FLEA::getSingleton('Controller_Org_Sms');//加載api控制器接口
$result = $Sms->sendSms(array('to'=>$mobile ,'content'=>$content));//調用sendSms方法,$mobile是發送給誰,$content是發送的內容,

    $result =  json_decode($result,1);

    $arr = array('success'=>true);
	echo json_encode($arr);exit;//
}

6.點擊登錄,傳用戶名,密碼,填寫的驗證碼和發送的驗證碼是否一致;
//確定按鈕點擊后效果
$('#form_login').submit(function(){

		var verify = $('#verify').val();
		var username = $('#username').val();
		var password = $('#password').val();


			//填寫驗證碼
		var url = "?controller=Login&action=loginIndex";
		var param = {
				'username':username,
				'password':password,
				'verify':verify
		};
		$('#submit').attr('disabled',true);
		$.ajax({
	            type: "POST",
	            url: url,
	            data: param,
	            dataType: 'json',
	            async: false,//同步操作
	            success:function(json){
	            	console.log(json);
		            if(json.success==false){
		                showError(json.msg);
		                setTimeout(function(){
							$('#submit').attr('disabled',false);
							$('#submit').text('登 錄');

						}, 500);
		        		return false;

		            }else{
		                showMsg('登陸成功');
		            }
	           },

	        });
	        var urls = "?controller=Main&action=Index";
		setTimeout(function(){window.location.href=urls;}, 500);

	        return false;

		$('#submit').attr('disabled',true);
		$('#submit').text('登錄中…');
		$(this).ajaxSubmit({
			'data':{'is_ajax':true},
			success:function(t,b,f){
				var json = eval("("+t+")");
				if(json.success==true){
					showMsg('登陸成功');
					setTimeout(function(){window.location.href=json.href;}, 500);
				}else{
					showError(json.msg);
					setTimeout(function(){
						$('#submit').attr('disabled',false);
						$('#submit').text('登 錄');
					}, 500);
				}
			}
		});
		
		return false;
	});


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM