1. 程式人生 > >PHP實現簡訊驗證碼

PHP實現簡訊驗證碼

手機驗證碼流程:

獲取手機驗證碼事件:正則驗證手機號,將手機號碼和驗證碼作為引數非同步訪問手機驗證碼ajax頁面

手機驗證碼ajax頁面:驗證驗證碼,生成手機驗證碼,生成流水號,引用介面頁面傳送驗證碼,如果成功則將驗證碼資訊寫入資料庫

註冊按鈕事件:將手機號和手機驗證碼作為引數傳入註冊ajax頁面

註冊ajax頁面:判斷手機驗證碼是否正確,判斷會員是否重複,將使用者資訊寫入資料庫

總之,驗證完驗證碼就傳送手機驗證碼,之後只驗證手機驗證碼

//手機驗證碼ajax頁面
if($p['act']=="telcode"){
    //驗證驗證碼
    $code = trim($p['code']);
    if($code!=$_SESSION["login_check_num"]){
        echo "codeHad";
    }else{
    
        //手機號
        $tel = trim($p['tel']);
        
        //生成手機驗證碼
        $code = "";
        for($i=0;$i<4;$i++){
            $code .= rand(0,9);
        }
        
        //流水號
    	list($usec, $sec) = explode(" ", microtime());
    	$time = (float)$usec + (float)$sec;
    	
    	
        //傳送驗證碼
        $sendSms->SpCode = '';//企業編號
        $sendSms->LoginName = '';//使用者名稱稱
        $sendSms->Password = '';//使用者密碼
        $sendSms->MessageContent = '您的驗證碼為'.$code;//簡訊內容
        $sendSms->UserNumber = $tel;//手機號碼
        $sendSms->SerialNumber = $time;//回執流水號,時間格式精確到毫秒
        $sendSms->ScheduleTime = '';//空為立即傳送
        $sendSms->ExtendAccessNum = '';//檢測方式引數
        $res = $sendSms->send();//send方法,返回布林值
        //如果傳送成功則寫入資料庫
        if($res){
            $sql = "INSERT INTO #__telcode
            SET tel = '$tel',
            code = '$code',
            time = '$time'";
            $db_my->query ($sql);
            echo 'success';
        }else{
            echo 'smsHad';
        }
        
        
        return;
    }
}
//註冊ajax頁面
if($p['act']=="reg_oa"){
		$username=trim($p['username']);
		$userpwd=trim($p['password']);
		$reg_rand = trim($p['reg_rand']); 
		$group_id=trim($p['group_id']); 
		$tel=trim($p['tel']); //手機號碼
		$reg_tel = trim($p['reg_tel']);//獲取手機驗證碼
        $uuid=str_replace('{','',guid());
        $uuid=str_replace('}','',$uuid);
        $uuid=str_replace('-','',$uuid);
        
        
        
		$memberoacunzai=$db_my->get_row("select * from  t_s_base_user WHERE username='".$username."'");
		//判斷手機驗證碼是否正確
		$telcodecheck=$db_my->get_row("select * from #__telcode WHERE tel='".$tel."' order by id desc limit 1");
		$telcode = $telcodecheck->code;
		
		if($reg_rand!=$_SESSION["login_check_num"]){
		echo "codeHad";
		}		
		elseif ($telcode!=$reg_tel){
		echo "telcodeHad";
		}
		elseif (count($memberoacunzai) == 1){
		echo "nameHad";
		}
		
		else{
		
	
		   $sql = "INSERT INTO t_s_base_user
						SET ID = '$uuid',
							username = '$username',
							usertype  = '$group_id',
							password = '".md5($userpwd)."'";
		    $db_my->query ($sql);
		

		  	$memberoa=$db_my->get_row("select * from  t_s_base_user WHERE username='".$username."'");

		
			$sql = "SELECT * FROM pms_owner_info WHERE userid = '".$memberoa->ID."'";
	        $memberoa_o = $db_my->get_row($sql);

		      //記錄登入
		
			  ///登入的時候判斷商城會員表是否有該會員記錄,沒有則寫入一條記錄
			  $membercunzai=$db_my->get_row("select * from  #__member WHERE userid='".$memberoa->ID."'");
			
			  
			  if(count($membercunzai)==1)
			  {
			  $_SESSION['memberoa'] = $memberoa;
			  $_SESSION['memberauth_id'] = $membercunzai->uid;
			  $_SESSION['member'] = $membercunzai;
			  }
			  else{
			  $sql = "INSERT INTO #__member
					  SET uid = NULL,
						  username = '$username',
						  group_id = '".$memberoa->usertype ."',
						  realname = '".$memberoa_o->cowername."',
						  password = '".md5($userpwd)."',
						  email = '$email',
						  tel = '".$tel ."',
						  userid = '".$memberoa->ID."',
						  reg_ip = '" . remote_addr() . "',
						  reg_time = UNIX_TIMESTAMP() ";
			  $db_my->query ($sql);
			  
			  
			  
			 //註冊會員,發放100積分。
		    //更新會員帳號當前積分
			 //reg_integral($username,100);

			  
			  
			  $_SESSION['memberoa'] = $memberoa;
			  $membercunzai=$db_my->get_row("select * from  #__member WHERE userid='".$memberoa->ID."'");
			  $_SESSION['memberauth_id'] = $membercunzai->uid;
			  $_SESSION['member'] = $membercunzai;
			  
			  }

   
			 echo "success";
		}
		
		return;
}

//timer處理方法
var InterValObj; //timer變數
var count = 10; //間隔時間
var curCount;//當前剩餘秒數
function SetRemainTime() {
    if (curCount == 0) {                
        window.clearInterval(InterValObj);//停止計時器
        $("#telreg").removeAttr("disabled");//啟用按鈕
        $("#telreg").val("重新發送驗證碼");
    }
    else {
        curCount--;
        $("#telreg").val("請輸入驗證碼" + curCount);
    }
}


//獲取手機驗證碼事件
function gettelcode(){
	
	
    
    //獲取簡訊驗證碼按鈕事件:驗證驗證碼,驗證手機號碼,手機號作為引數訪問介面頁面,非同步將手機號和驗證碼存入資料庫中
	var $tel=$("#tel").val();
	var $code=$("#reg_rand").val();
	
	//驗證手機號碼
	if ($.trim($tel)==''){
		showtip("請輸入手機號!");
		$("#tel").focus();
		return false;
	}
	var TelFont= /^1[3|4|5|8][0-9]\d{4,8}$/;
	if($.trim($tel)!=''&&!TelFont.test($.trim($tel))){
		showtip("手機號碼格式錯誤,請重新輸入!");
		$("#tel").focus();
		return false;
	}


//手機號碼和驗證碼作為引數訪問ajax頁面
	$.ajax({
		type: "POST",
		url: ajaxurl+"ajax.php",
		data: "act=telcode&tel="+$tel+"&code="+$code,
		success: function(msg){
				alert(msg);
	            if(msg.replace(/[\r\n]/g,'')=='codeHad')showtip('驗證碼錯誤!');
	            if(msg.replace(/[\r\n]/g,'')=='smsHad')showtip('驗證碼傳送失敗!');
				if(msg.replace(/[\r\n]/g,'')=='success'){
				showtip('驗證碼傳送成功!');
				//成功傳送之後設定間隔
				curCount = count;
			    $("#telreg").attr("disabled", "true");
			    $("#telreg").val("請在" + curCount + "秒內輸入驗證碼");
			    InterValObj = window.setInterval("SetRemainTime()", 1000); //啟動計時器,1秒執行一次
				}
			}
			
	});
	
	
	
}


//註冊按鈕事件
function checkreg_oa() 
{

    var $username=$("#username").val();
	var $password =$("#password").val();
	var $password1 =$("#password1").val();
	var $reg_rand =$("#reg_rand").val();
	var $group_id =$("#group_id").val();
	var $url =$("#url").val();
	var $tel = $("#tel").val();//手機號碼
	var $reg_tel = $("#reg_tel").val();//手機驗證碼

		if ($.trim($username)==''){
		showtip("請輸入您的註冊賬號!");
		$("#username").focus();
		return false;
		}
		
		if(getByteLen($.trim($username))<4 || getByteLen($.trim($username))>20)
		{
		showtip("註冊帳號格式錯誤!");
		$("#username").focus();
		return false;
		}
		
		if ($.trim($password)==''){
		showtip("請輸入密碼!");
		$("#password").focus();
		return false;
		}
				
		if ($.trim($password1)==''){
		showtip("請確認密碼!");
		$("#password1").focus();
		return false;
		}
		
		if ($.trim($password1)!=$.trim($password)){
		showtip("兩次輸入的密碼不一致,請重新輸入!");
		$("#password1").focus();
		return false;
		}
		
		if ($.trim($reg_rand)==''){
		showtip("請輸入驗證碼!");
		$("#reg_rand").focus();
		return false;
		}
		
		if ($.trim($tel)==''){
		showtip("請輸入手機號!");
		$("#tel").focus();
		return false;
		}
		
		if ($.trim($reg_tel)==''){
		showtip("請輸入您手機上的驗證碼!");
		$("#reg_tel").focus();
		return false;
		}
		
	 //傳入手機驗證碼reg_tel手機號tel
    $.ajax({
        type: "POST",
        url: ajaxurl+"ajax.php",
        data: "act=reg_oa&tel=" + $tel + "&username=" + $username + "&reg_tel=" + $reg_tel + "&group_id=" + $group_id + "&password=" + $password +"&reg_rand=" + $reg_rand +"&time="+new Date().toString(),
        success: function (msg) {
			alert(msg);
            if(msg.replace(/[\r\n]/g,'')=='telcodeHad')showtip('手機驗證碼錯誤!');
            if(msg.replace(/[\r\n]/g,'')=='nameHad')showtip('使用者名稱已經存在!');
			if(msg.replace(/[\r\n]/g,'')=='success'){showtip('註冊成功!');window.location.href=$url;}//
   		}
	});
}


//介面頁面
<?php
/**
 * HTTP介面傳送簡訊,引數說明見文件,需要安裝CURL擴充套件
 * 
 * 使用示例:
 * $sendSms = new SendSmsHttp();
 * $sendSms->SpCode = '123456';
 * $sendSms->LoginName = 'abc123';
 * $sendSms->Password = '123abc';
 * $sendSms->MessageContent = '測試簡訊';
 * $sendSms->UserNumber = '15012345678,13812345678';
 * $sendSms->SerialNumber = '';
 * $sendSms->ScheduleTime = '';
 * $sendSms->ExtendAccessNum = '';
 * $sendSms->f = '';
 * $res = $sendSms->send();
 * echo $res ? '傳送成功' : $sendSms->errorMsg;
 * 
 */
class SendSmsHttp {
	private $_apiUrl = 'http://gd.ums86.com:8899/sms/Api/Send.do'; // 傳送簡訊介面地址
	public $SpCode;
	public $LoginName;
	public $Password;
	public $MessageContent;
	public $UserNumber;
	public $SerialNumber;
	public $ScheduleTime;
	public $ExtendAccessNum;
	public $f;
	public $errorMsg;
	
	/**
	 * 傳送簡訊
	 * @return boolean
	 */
	public function send() {
		$params = array(
				"SpCode" => $this->SpCode,
				"LoginName" => $this->LoginName,
				"Password" => $this->Password,
				"MessageContent" => iconv("UTF-8", "GB2312//IGNORE", $this->MessageContent),
				"UserNumber" => $this->UserNumber,
				"SerialNumber" => $this->SerialNumber,
				"ScheduleTime" => $this->ScheduleTime,
				"ExtendAccessNum" => $this->ExtendAccessNum,
				"f" => $this->f,
		);
		$data = http_build_query($params);
		$res = iconv('GB2312', 'UTF-8//IGNORE', $this->_httpClient($data));
		$resArr = array();
        parse_str($res, $resArr);
	
		if (!empty($resArr) && $resArr["result"] == 0) return true;
		else {
			if (empty($this->errorMsg)) $this->errorMsg = isset($resArr["description"]) ? $resArr["description"] : '未知錯誤';
			return false;
		}
	}
	
	
	/**
	 * POST方式訪問介面
	 * @param string $data
	 * @return mixed
	 */
	private function _httpClient($data) {
		try {
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL,$this->_apiUrl);
			curl_setopt($ch, CURLOPT_HEADER, 0);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
			$res = curl_exec($ch);
			curl_close($ch);
			return $res;
		} catch (Exception $e) {
			$this->errorMsg = $e->getMessage();
			return false;
		}
	}
	
	
}
$sendSms = new SendSmsHttp;