因為項目需要,所以就去研究了這個后台用ukey登錄,也就是必須使用u盤才能進行登錄網站后台
下面先放一個淘寶的鏈接,這個東西就是在他哪買的
https://item.taobao.com/item.htm?_u=81p7of6sd7c7&id=42619542116
資料下載頁面
http://www.dgyzt.com/D8_Download.html
php需要下載的資料如下
下載這三個即可里面有對應的文檔跟需要的工具跟代碼列子
解壓出來會得到
里面相關的工具跟代碼列子對應各種語言
拿到ukey如何實現后台登錄
1、打開開發工具去生成一個鎖的種子ID
這是操作步驟,必須要在插入ukey的時候進行。
2、找到對應的代碼列子可以直接復制他們的代碼讓他自動讀取
讀取的內容包括你設置好的賬號密碼等等,寫入賬戶密碼的工具如下
代碼片段,我用到只有自動讀取KeyID,也就是上面設置的鎖ID
這里是相關代碼,可以直接復制過去用,代碼在例子里面都能找到,如果無法使用也可以去咨詢客服,他們會有技術人員幫你,這點還是很不錯的。

<SCRIPT LANGUAGE=javascript> var bConnect=0; function load() { if(frmlogin.KeyID.value!="")return ;//如果已自動登錄則退出 //如果是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;//代表已經連接,用於判斷是否安裝了客戶端服務 setTimeout( login_onclick, 500); } //在使用事件插撥時,注意,一定不要關掉Sockey,否則無法監測事件插撥 s_pnp.Socket_UK.onmessage =function got_packet(Msg) { } s_pnp.Socket_UK.onclose = function() { } setTimeout( err_Connect, 3000);//如果在一定時間內還沒有連接成功,就提示要安裝服務 } 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; //判斷是否安裝了服務程序,如果沒有安裝提示用戶安裝 if(bConnect==0) { window.alert ("未能連接服務程序,請確定服務程序是否安裝。請訪問“"+url+"/SetUp.zip”下載驅動安裝即可,復制鏈接即可下載!");return false; } var DevicePath,ret,n,mylen,ID_1,ID_2; try { //由於是使用事件消息的方式與服務程序進行通訊, //好處是不用安裝插件,不分系統及版本,控件也不會被攔截,同時安裝服務程序后,可以立即使用,不用重啟瀏覽器 //不好的地方,就是但寫代碼會復雜一些 var s_simnew1=new SoftKey3W(); //創建UK類 s_simnew1.Socket_UK.onopen = function() { s_simnew1.ResetOrder();//這里調用ResetOrder將計數清零,這樣,消息處理處就會收到0序號的消息,通過計數及序號的方式,從而生產流程 } //寫代碼時一定要注意,每調用我們的一個UKEY函數,就會生產一個計數,即增加一個序號,較好的邏輯是一個序號的消息處理中,只調用我們一個UKEY的函數 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 ;//如果不是流程處理消息,則跳過 /** * 自動獲取uk設置的賬號密碼跟ukeyid * 要求只獲取ukeyid所以沒用上,后續需要對換一下switch即可 */ /* switch(UK_Data.order) { case 0: { s_simnew1.FindPort(0);//發送命令取UK的路徑 } break;//!!!!!重要提示,如果在調試中,發現代碼不對,一定要注意,是不是少了break,這個少了是很常見的錯誤 case 1: { if( UK_Data.LastError!=0){window.alert ( "未發現加密鎖,請插入加密鎖");s_simnew1.Socket_UK.close();return false;} DevicePath=UK_Data.return_value;//獲得返回的UK的路徑 //獲取設置在鎖中的用戶名 //先從地址0讀取字符串的長度,使用默認的讀密碼"FFFFFFFF","FFFFFFFF" s_simnew1.YReadEx(0,1,"ffffffff","ffffffff",DevicePath);//發送命令取UK地址0的數據 } break; case 2: { if( UK_Data.LastError!=0){ window.alert("讀數據時錯誤,錯誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} s_simnew1.GetBuf(0);//發送命令從數據緩沖區中數據 } break; case 3: { if( UK_Data.LastError!=0){ window.alert("調用GetBuf時錯誤,錯誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} mylen=UK_Data.return_value;//獲得返回的數據緩沖區中數據 //再從地址1讀取相應的長度的字符串,,使用默認的讀密碼"FFFFFFFF","FFFFFFFF" s_simnew1.YReadString(1,mylen, "ffffffff", "ffffffff", DevicePath);//發送命令從UK地址1中取字符串 } break; case 4: { if( UK_Data.LastError!=0){ window.alert("讀取字符串時錯誤,錯誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} frmlogin.username.value=UK_Data.return_value;//獲得返回的UK地址1的字符串 //獲到設置在鎖中的用戶密碼, //先從地址20讀取字符串的長度,使用默認的讀密碼"FFFFFFFF","FFFFFFFF" s_simnew1.YReadEx(20,1,"ffffffff","ffffffff",DevicePath);//發送命令取UK地址20的數據 } break; case 5: { if( UK_Data.LastError!=0){ window.alert("讀數據時錯誤,錯誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} s_simnew1.GetBuf(0);//發送命令從數據緩沖區中數據 } break; case 6: { if( UK_Data.LastError!=0){ window.alert("調用GetBuf時錯誤,錯誤碼為:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} mylen=UK_Data.return_value;//獲得返回的數據緩沖區中數據 //再從地址21讀取相應的長度的字符串,,使用默認的讀密碼"FFFFFFFF","FFFFFFFF" s_simnew1.YReadString(21,mylen,"ffffffff", "ffffffff", DevicePath);//發送命令從UK地址21中取字符串 } break; case 7: { if( UK_Data.LastError!=0){ window.alert("讀取字符串時錯誤,錯誤碼為:"+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); //發送命令取ID_1 } break; case 8: { if( UK_Data.LastError!=0){ window.alert("返回ID號錯誤,錯誤碼為:"+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); //發送命令取ID_2 } break; case 9: { if( UK_Data.LastError!=0){ window.alert("取得ID錯誤,錯誤碼為:"+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); //!!!!!注意,這里一定要主動提交,不能用提交類型的按鈕,否則無法完全處理所有的消息 // frmlogin.submit (); //所有工作處理完成后,關掉Socket s_simnew1.Socket_UK.close(); } break; } */ /** * 自動獲取ukeyid * 要求只獲取ukeyid所以沒用上,如果需要自動獲取ukey設置好的賬號密碼對換一下switch即可 */ switch(UK_Data.order) { case 0: { s_simnew1.FindPort(0);//發送命令取UK的路徑 } break;//!!!!!重要提示,如果在調試中,發現代碼不對,一定要注意,是不是少了break,這個少了是很常見的錯誤 case 1: { if( UK_Data.LastError!=0){window.alert ( "未發現加密鎖,請插入加密鎖");s_simnew1.Socket_UK.close();return false;} DevicePath=UK_Data.return_value;//獲得返回的UK的路徑 s_simnew1.GetID_1(DevicePath); //發送命令取ID_1 } break; case 2: { if( UK_Data.LastError!=0){ window.alert("返回ID號錯誤,錯誤碼為:"+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); //發送命令取ID_2 } break; case 3: { if( UK_Data.LastError!=0){ window.alert("取得ID錯誤,錯誤碼為:"+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); //!!!!!注意,這里一定要主動提交,不能用提交類型的按鈕,否則無法完全處理所有的消息 // frmlogin.submit (); //所有工作處理完成后,關掉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("未能連接服務程序,請確定服務程序是否安裝。請訪問“"+url+"/SetUp.zip”下載驅動安裝即可,復制鏈接即可下載!"); } function Handle_IE10() { try { var DevicePath,mylen,ret; var s_simnew1; //創建或控件 s_simnew1=new ActiveXObject("Syunew3A.s_simnew3"); DevicePath = s_simnew1.FindPort(0);//'來查找加密鎖,0是指查找默認端口的鎖 if( s_simnew1.LastError!= 0 ) { window.alert ( "未發現加密鎖,請插入加密鎖");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錯誤,錯誤碼是"+s_simnew1.LastError.toString()); return false; } // frmlogin.submit (); return true; } } catch(e) { alert(e.name + ": " + e.message+"。可能是沒有安裝相應的控件或插件"); return false; } } </SCRIPT>
此處是放一個自動安裝包到你域名根目錄下,當他提示服務沒有安裝的時候讓他下載安裝,就不用每次都來煩你為什么不能登錄,安裝包下面會有說明你選一個改一下名字就可以了放到網站根目錄即可
上面的代碼片段有一個switch是可以獲取設置好的賬戶密碼跟KeyID的,已標注出來,但是因為用不上就注釋掉代碼了,另外一個是只獲取KeyID。
form表單代碼如下

<form action="?op=login" id="frmlogin" name="main" method="POST" onSubmit="return check_data()"> <div id="login_box" style="display:none; "> <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" style="width:120px" value=""></td> </tr> <tr> <td height="30" align="right">登錄密碼:</td> <td><input name="password" id="password" type="password" class="input" size="20" style="width:120px"></td> </tr> <tr> <td height="30" align="right">uKey序號:</td> <td><input name="KeyID" id="KeyID" type="text" class="input" size="20" value="" style="width:120px" 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="登錄系統" 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>
還有個一個特別需要注意的點
這里必須要加載他的函數,否則可能會無法自動讀取,親身踩出來的坑
在此頁面還需要引用一個Syunew3.js文件,代碼列子里面能找到
3.進行測試
做好這些工作之后你就可以開始進行測試了,打開你需要驗證的登錄頁面,他應該會提示你 “未能連接服務程序,請確定服務程序是否安裝” ,那么想就需要安裝一個程序
程序在這里一個是可以設置網址一個是不可以設置網址,可以設置網址的意思就是你插入ukey他會自動打開到你設置好的一個網址,怎么用里面有說明。
然后安裝好程序再打開之后,他會自動獲取到你的KeyID了如下。
驗證的時候你把你生成的KeyID,放到數據庫,如何是需要對應用戶,那么就在你用戶表多建一個字段存放,能自動獲取到之后就剩下如何驗證了。
如果上面自動獲取的代碼實在不會可以去咨詢客服客服會教你的,里面還有更高級的代碼驗證,需要的話可以去研究一下。