PHP网站后台使用ukey登录
因?yàn)轫?xiàng)目需要,所以就去研究了這個(gè)后臺(tái)用ukey登錄,也就是必須使用u盤才能進(jìn)行登錄網(wǎng)站后臺(tái)
下面先放一個(gè)淘寶的鏈接,這個(gè)東西就是在他哪買的
https://item.taobao.com/item.htm?_u=81p7of6sd7c7&id=42619542116
資料下載頁(yè)面
http://www.dgyzt.com/D8_Download.html
php需要下載的資料如下
下載這三個(gè)即可里面有對(duì)應(yīng)的文檔跟需要的工具跟代碼列子
解壓出來(lái)會(huì)得到
里面相關(guān)的工具跟代碼列子對(duì)應(yīng)各種語(yǔ)言
拿到ukey如何實(shí)現(xiàn)后臺(tái)登錄
1、打開(kāi)開(kāi)發(fā)工具去生成一個(gè)鎖的種子ID
這是操作步驟,必須要在插入ukey的時(shí)候進(jìn)行。
2、找到對(duì)應(yīng)的代碼列子可以直接復(fù)制他們的代碼讓他自動(dòng)讀取
讀取的內(nèi)容包括你設(shè)置好的賬號(hào)密碼等等,寫入賬戶密碼的工具如下
代碼片段,我用到只有自動(dòng)讀取KeyID,也就是上面設(shè)置的鎖ID
這里是相關(guān)代碼,可以直接復(fù)制過(guò)去用,代碼在例子里面都能找到,如果無(wú)法使用也可以去咨詢客服,他們會(huì)有技術(shù)人員幫你,這點(diǎn)還是很不錯(cuò)的。
<SCRIPT LANGUAGE=javascript>
var bConnect=0;
function load()
{
if(frmlogin.KeyID.value!="")return ;//如果已自動(dòng)登錄則退出
//如果是IE10及以下瀏覽器,則使用AVCTIVEX控件的方式
if(navigator.userAgent.indexOf("MSIE")>0 && !navigator.userAgent.indexOf("opera") > -1)
{
setTimeout( Handle_IE10, 1000);
return ;
}
try
{
var s_pnp=new SoftKey3W();
s_pnp.Socket_UK.onopen = function()
{
bConnect=1;//代表已經(jīng)連接,用于判斷是否安裝了客戶端服務(wù)
setTimeout( login_onclick, 500);
}
//在使用事件插撥時(shí),注意,一定不要關(guān)掉Sockey,否則無(wú)法監(jiān)測(cè)事件插撥
s_pnp.Socket_UK.onmessage =function got_packet(Msg)
{
}
s_pnp.Socket_UK.onclose = function()
{
}
setTimeout( err_Connect, 3000);//如果在一定時(shí)間內(nèi)還沒(méi)有連接成功,就提示要安裝服務(wù)
}
catch(e)
{
alert(e.name + ": " + e.message);
return false;
}
}
var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function toHex( n ) {
var result = ''
var start = true;
for ( var i=32; i>0; ) {
i -= 4;
var digit = ( n >> i ) & 0xf;
if (!start || digit != 0) {
start = false;
result += digitArray[digit];
}
}
return ( result == '' ? '0' : result );
}
function login_onclick()
{
var url = window.location.host;
//判斷是否安裝了服務(wù)程序,如果沒(méi)有安裝提示用戶安裝
if(bConnect==0)
{
window.alert ("未能連接服務(wù)程序,請(qǐng)確定服務(wù)程序是否安裝。請(qǐng)?jiān)L問(wèn)“"+url+"/SetUp.zip”下載驅(qū)動(dòng)安裝即可,復(fù)制鏈接即可下載!");return false;
}
var DevicePath,ret,n,mylen,ID_1,ID_2;
try
{
//由于是使用事件消息的方式與服務(wù)程序進(jìn)行通訊,
//好處是不用安裝插件,不分系統(tǒng)及版本,控件也不會(huì)被攔截,同時(shí)安裝服務(wù)程序后,可以立即使用,不用重啟瀏覽器
//不好的地方,就是但寫代碼會(huì)復(fù)雜一些
var s_simnew1=new SoftKey3W(); //創(chuàng)建UK類
s_simnew1.Socket_UK.onopen = function() {
s_simnew1.ResetOrder();//這里調(diào)用ResetOrder將計(jì)數(shù)清零,這樣,消息處理處就會(huì)收到0序號(hào)的消息,通過(guò)計(jì)數(shù)及序號(hào)的方式,從而生產(chǎn)流程
}
//寫代碼時(shí)一定要注意,每調(diào)用我們的一個(gè)UKEY函數(shù),就會(huì)生產(chǎn)一個(gè)計(jì)數(shù),即增加一個(gè)序號(hào),較好的邏輯是一個(gè)序號(hào)的消息處理中,只調(diào)用我們一個(gè)UKEY的函數(shù)
s_simnew1.Socket_UK.onmessage =function got_packet(Msg)
{
var UK_Data = JSON.parse(Msg.data);
// alert(Msg.data);
if(UK_Data.type!="Process")return ;//如果不是流程處理消息,則跳過(guò)
/**
* 自動(dòng)獲取uk設(shè)置的賬號(hào)密碼跟ukeyid
* 要求只獲取ukeyid所以沒(méi)用上,后續(xù)需要對(duì)換一下switch即可
*/
/*
switch(UK_Data.order)
{
case 0:
{
s_simnew1.FindPort(0);//發(fā)送命令取UK的路徑
}
break;//!!!!!重要提示,如果在調(diào)試中,發(fā)現(xiàn)代碼不對(duì),一定要注意,是不是少了break,這個(gè)少了是很常見(jiàn)的錯(cuò)誤
case 1:
{
if( UK_Data.LastError!=0){window.alert ( "未發(fā)現(xiàn)加密鎖,請(qǐng)插入加密鎖");s_simnew1.Socket_UK.close();return false;}
DevicePath=UK_Data.return_value;//獲得返回的UK的路徑
//獲取設(shè)置在鎖中的用戶名
//先從地址0讀取字符串的長(zhǎng)度,使用默認(rèn)的讀密碼"FFFFFFFF","FFFFFFFF"
s_simnew1.YReadEx(0,1,"ffffffff","ffffffff",DevicePath);//發(fā)送命令取UK地址0的數(shù)據(jù)
}
break;
case 2:
{
if( UK_Data.LastError!=0){ window.alert("讀數(shù)據(jù)時(shí)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
s_simnew1.GetBuf(0);//發(fā)送命令從數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)
}
break;
case 3:
{
if( UK_Data.LastError!=0){ window.alert("調(diào)用GetBuf時(shí)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
mylen=UK_Data.return_value;//獲得返回的數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)
//再?gòu)牡刂?讀取相應(yīng)的長(zhǎng)度的字符串,,使用默認(rèn)的讀密碼"FFFFFFFF","FFFFFFFF"
s_simnew1.YReadString(1,mylen, "ffffffff", "ffffffff", DevicePath);//發(fā)送命令從UK地址1中取字符串
}
break;
case 4:
{
if( UK_Data.LastError!=0){ window.alert("讀取字符串時(shí)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
frmlogin.username.value=UK_Data.return_value;//獲得返回的UK地址1的字符串
//獲到設(shè)置在鎖中的用戶密碼,
//先從地址20讀取字符串的長(zhǎng)度,使用默認(rèn)的讀密碼"FFFFFFFF","FFFFFFFF"
s_simnew1.YReadEx(20,1,"ffffffff","ffffffff",DevicePath);//發(fā)送命令取UK地址20的數(shù)據(jù)
}
break;
case 5:
{
if( UK_Data.LastError!=0){ window.alert("讀數(shù)據(jù)時(shí)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
s_simnew1.GetBuf(0);//發(fā)送命令從數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)
}
break;
case 6:
{
if( UK_Data.LastError!=0){ window.alert("調(diào)用GetBuf時(shí)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
mylen=UK_Data.return_value;//獲得返回的數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)
//再?gòu)牡刂?1讀取相應(yīng)的長(zhǎng)度的字符串,,使用默認(rèn)的讀密碼"FFFFFFFF","FFFFFFFF"
s_simnew1.YReadString(21,mylen,"ffffffff", "ffffffff", DevicePath);//發(fā)送命令從UK地址21中取字符串
}
break;
case 7:
{
if( UK_Data.LastError!=0){ window.alert("讀取字符串時(shí)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
frmlogin.password.value=UK_Data.return_value;//獲得返回的UK地址21的字符串
s_simnew1.GetID_1(DevicePath); //發(fā)送命令取ID_1
}
break;
case 8:
{
if( UK_Data.LastError!=0){ window.alert("返回ID號(hào)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_1=UK_Data.return_value;//獲得返回的UK的ID_1
s_simnew1.GetID_2(DevicePath); //發(fā)送命令取ID_2
}
break;
case 9:
{
if( UK_Data.LastError!=0){ window.alert("取得ID錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_2=UK_Data.return_value;//獲得返回的UK的ID_2
frmlogin.KeyID.value=toHex(ID_1)+toHex(ID_2);
frmlogin.ukey.value=toHex(ID_1)+toHex(ID_2);
frmlogin.KeyID.value=frmlogin.KeyID.value.substr(0,6)+'****'+frmlogin.KeyID.value.substr(10);
//!!!!!注意,這里一定要主動(dòng)提交,不能用提交類型的按鈕,否則無(wú)法完全處理所有的消息
// frmlogin.submit ();
//所有工作處理完成后,關(guān)掉Socket
s_simnew1.Socket_UK.close();
}
break;
}
*/
/**
* 自動(dòng)獲取ukeyid
* 要求只獲取ukeyid所以沒(méi)用上,如果需要自動(dòng)獲取ukey設(shè)置好的賬號(hào)密碼對(duì)換一下switch即可
*/
switch(UK_Data.order)
{
case 0:
{
s_simnew1.FindPort(0);//發(fā)送命令取UK的路徑
}
break;//!!!!!重要提示,如果在調(diào)試中,發(fā)現(xiàn)代碼不對(duì),一定要注意,是不是少了break,這個(gè)少了是很常見(jiàn)的錯(cuò)誤
case 1:
{
if( UK_Data.LastError!=0){window.alert ( "未發(fā)現(xiàn)加密鎖,請(qǐng)插入加密鎖");s_simnew1.Socket_UK.close();return false;}
DevicePath=UK_Data.return_value;//獲得返回的UK的路徑
s_simnew1.GetID_1(DevicePath); //發(fā)送命令取ID_1
}
break;
case 2:
{
if( UK_Data.LastError!=0){ window.alert("返回ID號(hào)錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_1=UK_Data.return_value;//獲得返回的UK的ID_1
s_simnew1.GetID_2(DevicePath); //發(fā)送命令取ID_2
}
break;
case 3:
{
if( UK_Data.LastError!=0){ window.alert("取得ID錯(cuò)誤,錯(cuò)誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_2=UK_Data.return_value;//獲得返回的UK的ID_2
frmlogin.KeyID.value=toHex(ID_1)+toHex(ID_2);
frmlogin.ukey.value=toHex(ID_1)+toHex(ID_2);
frmlogin.KeyID.value=frmlogin.KeyID.value.substr(0,6)+'****'+frmlogin.KeyID.value.substr(10);
//!!!!!注意,這里一定要主動(dòng)提交,不能用提交類型的按鈕,否則無(wú)法完全處理所有的消息
// frmlogin.submit ();
//所有工作處理完成后,關(guān)掉Socket
s_simnew1.Socket_UK.close();
}
break;
}
}
s_simnew1.Socket_UK.onclose = function(){
}
return true;
}
catch (e)
{
alert(e.name + ": " + e.message);
}
}
function err_Connect()
{
var url = window.location.host;
if(bConnect==1)return ;
alert("未能連接服務(wù)程序,請(qǐng)確定服務(wù)程序是否安裝。請(qǐng)?jiān)L問(wèn)“"+url+"/SetUp.zip”下載驅(qū)動(dòng)安裝即可,復(fù)制鏈接即可下載!");
}
function Handle_IE10()
{
try
{
var DevicePath,mylen,ret;
var s_simnew1;
//創(chuàng)建或控件
s_simnew1=new ActiveXObject("Syunew3A.s_simnew3");
DevicePath = s_simnew1.FindPort(0);//'來(lái)查找加密鎖,0是指查找默認(rèn)端口的鎖
if( s_simnew1.LastError!= 0 )
{
window.alert ( "未發(fā)現(xiàn)加密鎖,請(qǐng)插入加密鎖");return false;
}
else
{
//獲取鎖的ID
frmlogin.KeyID.value=toHex(s_simnew1.GetID_1(DevicePath))+toHex(s_simnew1.GetID_2(DevicePath));
if( s_simnew1.LastError!= 0 )
{
window.alert( "獲取ID錯(cuò)誤,錯(cuò)誤碼是"+s_simnew1.LastError.toString());
return false;
}
// frmlogin.submit ();
return true;
}
}
catch(e)
{
alert(e.name + ": " + e.message+"。可能是沒(méi)有安裝相應(yīng)的控件或插件");
return false;
}
}
</SCRIPT>
相關(guān)代碼
此處是放一個(gè)自動(dòng)安裝包到你域名根目錄下,當(dāng)他提示服務(wù)沒(méi)有安裝的時(shí)候讓他下載安裝,就不用每次都來(lái)煩你為什么不能登錄,安裝包下面會(huì)有說(shuō)明你選一個(gè)改一下名字就可以了放到網(wǎng)站根目錄即可
上面的代碼片段有一個(gè)switch是可以獲取設(shè)置好的賬戶密碼跟KeyID的,已標(biāo)注出來(lái),但是因?yàn)橛貌簧暇妥⑨尩舸a了,另外一個(gè)是只獲取KeyID。
form表單代碼如下
<form action="?op=login" id="frmlogin" name="main" method="POST" onSubmit="return check_data()">
<div id="login_box">
<div id="box_top"></div>
<div id="login_area">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="20" colspan="2"></td>
</tr>
<tr>
<td width="39%" height="30" align="right">用戶姓名:</td>
<td width="61%"><input name="username" id="username" type="text" class="input" size="20" value=""></td>
</tr>
<tr>
<td height="30" align="right">登錄密碼:</td>
<td><input name="password" id="password" type="password" class="input" size="20"></td>
</tr>
<tr>
<td height="30" align="right">uKey序號(hào):</td>
<td><input name="KeyID" id="KeyID" type="text" class="input" size="20" value="" autocomplete="off"></td>
<input type="hidden" name="ukey" id="ukey" value="">
</tr>
<tr>
<td height="20" colspan="2"></td>
</tr>
<tr align="center">
<td align="right"></td>
<td align="left"><input type="submit" value="登錄系統(tǒng)" class="button"></td>
</tr>
<tr>
<td colspan="2" height="40"></td>
</tr>
<tr>
<td colspan="2" height="38" align="center"></td>
</tr>
</table>
</div>
<div id="box_bottom"></div>
</div>
</form>
View Code
還有個(gè)一個(gè)特別需要注意的點(diǎn)
這里必須要加載他的函數(shù),否則可能會(huì)無(wú)法自動(dòng)讀取,親身踩出來(lái)的坑
在此頁(yè)面還需要引用一個(gè)Syunew3.js文件,代碼列子里面能找到
3.進(jìn)行測(cè)試
做好這些工作之后你就可以開(kāi)始進(jìn)行測(cè)試了,打開(kāi)你需要驗(yàn)證的登錄頁(yè)面,他應(yīng)該會(huì)提示你“未能連接服務(wù)程序,請(qǐng)確定服務(wù)程序是否安裝”,那么想就需要安裝一個(gè)程序
程序在這里一個(gè)是可以設(shè)置網(wǎng)址一個(gè)是不可以設(shè)置網(wǎng)址,可以設(shè)置網(wǎng)址的意思就是你插入ukey他會(huì)自動(dòng)打開(kāi)到你設(shè)置好的一個(gè)網(wǎng)址,怎么用里面有說(shuō)明。
然后安裝好程序再打開(kāi)之后,他會(huì)自動(dòng)獲取到你的KeyID了如下。
驗(yàn)證的時(shí)候你把你生成的KeyID,放到數(shù)據(jù)庫(kù),如何是需要對(duì)應(yīng)用戶,那么就在你用戶表多建一個(gè)字段存放,能自動(dòng)獲取到之后就剩下如何驗(yàn)證了。
如果上面自動(dòng)獲取的代碼實(shí)在不會(huì)可以去咨詢客服客服會(huì)教你的,里面還有更高級(jí)的代碼驗(yàn)證,需要的話可以去研究一下。
總結(jié)
以上是生活随笔為你收集整理的PHP网站后台使用ukey登录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 19:啤酒厂选址
- 下一篇: delphi 金额大小写转换函数