我用的FLEA,可能大家都沒聽說過,但原理是一樣的,大家適當參考下吧。
-
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;
});