調用OCX讀寫白卡,使用的是JS代碼,讀寫卡的JS代碼以下javascript
讀卡(readCard.html)html
<html> <head> <title>讀白卡卡號</title> <OBJECT id="CardReader" classid = clsid:43E4D4FC-3CD8-459A-AAA1-698C1288DE93> <PARAM NAME="_Version" VALUE="65536"><PARAM NAME="_ExtentX" VALUE="2646"> <PARAM NAME="_ExtentY" VALUE="1323"><PARAM NAME="_StockProps" VALUE="0"> </OBJECT> </head> <body bgcolor="FFFFFF"> <form id="readForm" action="" method="post"> <table width="500" border="1px"> <tr> <td width="30%" align="right"> 請選擇寫卡器: </td> <td> <select id="cardList" style="width:250"></select> </td> </tr> <tr> <td width="30%" align="right"> 手機號碼: </td> <td> <input type="text" id="phoneNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> 訂單號: </td> <td> <input type="text" id="orderNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> <input type="button" value="讀取卡號" onclick="callGetCardNum();"> </td> <td> <input type="text" id="cardNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> <input type="button" value="確認" onclick="submitInfo();"> </td> <td></td> </tr> </table> </form> </body> </html> <script type="text/javascript"> /** * 列出寫卡器 */ function doListCard() { var obj = document.getElementById("CardReader"); var str = obj.ListCard(); if(str == null || str == "") { alert("沒有取到讀卡器,請檢查控件是否註冊或者驅動是否安裝或者鏈接是否正常!"); return; } //動態加載下拉框,將寫卡器列出來 if(str != null && str != "") { var list = document.getElementById("cardList"); for(var i = list.options.length-1; i >= 0; i--) { list.remove(i); } var strArray =str.split(";"); for(var i = 0; i < strArray.length; i++) { var newOption = document.createElement("option"); newOption.setAttribute("value", strArray[i]); newOption.appendChild(document.createTextNode(strArray[i])); list.appendChild(newOption); } } } doListCard(); /** * 讀取IMSI,判斷是否爲白卡 */ function getIMSI() { var str = ""; str = doSendCard("A0A40000023F00"); if(str == "-1") { alert("獲取IMSI數據失敗1!"); return false; } str = doSendCard("A0A40000027F20"); if(str == "-1") { alert("獲取IMSI數據失敗2!"); return false; } str = doSendCard("A0A40000026F07"); if(str == "-1") { alert("獲取IMSI數據失敗3!"); return false; } str = doSendCard("A0B0000009"); if(str == "-1") { alert("獲取IMSI數據失敗4!"); return false; } str = str.substr(0,18); if (str.toUpperCase() != "FFFFFFFFFFFFFFFFFF") { alert("該卡已寫入IMSI,請換卡後重試!"); return false; } return true; } /** * 讀取卡號 */ function getCardNum() { var str=""; str=doSendCard("A0A40000023F00"); if(str == "-1") { alert("獲取ICCID數據失敗1!"); return false; } str=doSendCard("A0A40000022FE2"); if(str == "-1") { alert("獲取ICCID數據失敗2!"); return false; } str=doSendCard("A0B000000A"); if(str == "-1") { alert("獲取ICCID數據失敗3!"); return false; } //指令返回98 68 10 41 48 10 00 60 14 13 90 00 ,前20位轉置後爲卡號,後四位爲返回碼 str = trim(str); //去空格 if(!isnumber(str)) { alert("讀取的ICCID號只能爲數字:" + str); return false; } if(str == "6999" ) { alert("獲取ICCID數據失敗:" + str); return false; } if(str.length != "24" ) { alert("讀取的ICCID號格式不對:" + str); return false; } if(str.substr(20, 4) != "9000" ) { alert("讀ICCID失敗,返回碼:" + str.substr(20,4)); return false; } str=str.substr(0,20); str = dealCardNum(str); //解碼 return str; } /** * 讀取卡號 */ function callGetCardNum() { //鏈接讀卡器 var connRet = doConnectCard(); if(!connRet) { doDisConnectCard(); //報錯後要斷開,不然再連會失敗 return; } //讀取IMSI,判斷是否爲白卡 var imsiRet = getIMSI(); if(!imsiRet) { doDisConnectCard(); //報錯後要斷開,不然再連會失敗 return; } //讀取卡號 numRet = getCardNum(); document.getElementById("cardNum").value = numRet; doDisConnectCard(); } /** * 請求服務器,提交卡號信息 */ function submitInfo() { var cardNum = document.getElementById("cardNum").value; if(cardNum == null || cardNum == "" || cardNum.length != "20") { alert("卡號有誤!卡號:" + cardNum); return; } //請求PHP服務,發送卡號信息 document.getElementById("readForm").submit(); } /** * 轉換卡號 0123456789>1032547698 第一二位對換、三四位對換... */ function dealCardNum(cardStr) { var cardLength = cardStr.length; var cardNum=""; for(var i = 0; i < cardLength; i++) { if(i%2 == 0) { cardNum += cardStr.charAt(i+1); } else{ cardNum += cardStr.charAt(i-1); } } return cardNum; } /** * 鏈接讀卡器 */ function doConnectCard() { var obj = document.getElementById("CardReader"); //獲取對象 var cardName = document.getElementById("cardList").value; if(cardName == null || cardName == "") { alert("請選擇讀卡器!"); return false; } //鏈接讀卡器,報錯後要斷開,不然再連會失敗 var retConnect = obj.ConnectCard(cardName); //鏈接失敗 if(!(retConnect == "0" || retConnect == "")) { alert("鏈接讀卡器失敗!報錯:" + obj.GetErrMsg()); return false; } return true; } /** * 斷開鏈接 */ function doDisConnectCard() { var obj = document.getElementById("CardReader"); var str = document.getElementById("cardList").value; var ret = obj.DisconnectCard(str); if(ret!="0") return false; else return true; } /** * 發送指令 */ function doSendCard(str) { var obj = document.getElementById("CardReader"); var ret = obj.TransmitCard(str, document.getElementById("cardList")); var ErrMsg = obj.GetErrMsg(); console.info("ErrMsg:" + ErrMsg + " ret:" + ret); if(ErrMsg != "" && ErrMsg != "0") { return "-1"; } ret = trim(ret);//去掉空格 if(ret == "6999") { return "-1"; } return ret; } /** * 去掉全部的空格 */ function trim(str) { return str.replace(/\s+/g,""); } /** * 判斷是否爲數字 */ function isnumber(strs) { for(var i = 0; i<strs.length; i++) { var str = strs.charAt(i); if((str<'0') || (str>'9')) return false; } return true; } </SCRIPT>
寫卡( writeCard.html)java
<html> <head> <title>寫白卡</title> <OBJECT id="CardReader" classid=clsid:43E4D4FC-3CD8-459A-AAA1-698C1288DE93> <PARAM NAME="_Version" VALUE="65536"><PARAM NAME="_ExtentX" VALUE="2646"> <PARAM NAME="_ExtentY" VALUE="1323"><PARAM NAME="_StockProps" VALUE="0"> </OBJECT> </head> <body bgcolor="FFFFFF"> <form id="writeForm" action="" method="post"> <table width="500" border="1px"> <tr> <td width="30%" align="right"> 寫卡器: </td> <td> <select id="cardList" style="width:250"></select> </td> </tr> <tr> <td width="30%" align="right"> 手機號碼: </td> <td> <input type="text" id="phoneNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> 訂單號: </td> <td> <input type="text" id="orderNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> 卡號: </td> <td> <input type="text" id="cardNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> IMSI: </td> <td> <input type="text" id="imsiNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> 短信中心號碼: </td> <td> <input type="text" id="smsNum" style="width:250" readonly="true"> </td> </tr> <tr> <td width="30%" align="right"> <input type="button" value="寫卡" onclick="callWriteCard();"> </td> <td></td> </tr> </table> </form> </body> </html> <script type="text/javascript"> /** * 列出寫卡器 */ function doListCard() { var obj = document.getElementById("CardReader"); var str = obj.ListCard(); if(str == null || str == "") { alert("沒有取到讀卡器,請檢查控件是否註冊或者驅動是否安裝或者鏈接是否正常!"); return; } //動態加載下拉框,將寫卡器列出來 if(str != null && str != "") { var list = document.getElementById("cardList"); for(var i = list.options.length-1; i >= 0; i--) { list.remove(i); } var strArray = str.split(";"); for(var i = 0; i < strArray.length; i++) { var newOption = document.createElement("option"); newOption.setAttribute("value", strArray[i]); newOption.appendChild(document.createTextNode(strArray[i])); list.appendChild(newOption); } } } doListCard(); /** * 讀取IMSI,判斷是否爲白卡 */ function getIMSI() { var str = ""; str = doSendCard("A0A40000023F00"); if(str == "-1") { alert("獲取IMSI數據失敗1!"); return false; } str = doSendCard("A0A40000027F20"); if(str == "-1") { alert("獲取IMSI數據失敗2!"); return false; } str = doSendCard("A0A40000026F07"); if(str == "-1") { alert("獲取IMSI數據失敗3!"); return false; } str = doSendCard("A0B0000009"); if(str == "-1") { alert("獲取IMSI數據失敗4!"); return false; } str = str.substr(0,18); if (str.toUpperCase() != "FFFFFFFFFFFFFFFFFF") { alert("該卡已寫入IMSI,請換卡後重試!"); return false; } return true; } /** * 讀取卡號 */ function getCardNum() { var str = ""; str = doSendCard("A0A40000023F00"); if(str == "-1") { alert("獲取ICCID數據失敗1!"); return false; } str = doSendCard("A0A40000022FE2"); if(str == "-1") { alert("獲取ICCID數據失敗2!"); return false; } str = doSendCard("A0B000000A"); if(str == "-1") { alert("獲取ICCID數據失敗3!"); return false; } //指令返回98 68 10 41 48 10 00 60 14 13 90 00 ,前20位轉置後爲卡號,後四位爲返回碼 if(!isnumber(str)) { alert("讀取的卡號只能爲數字:" + str); return false; } if(str == "6999" ) { alert("獲取卡數據失敗:" + str); return false; } if(str.length != "24" ) { alert("讀取的卡號格式不對:" + str); return false; } if(str.substr(20, 4) != "9000" ) { alert("讀卡失敗,返回碼:" + str.substr(20,4)); return false; } str = dealCardNum(str); //解碼 return str; } /** * 讀取卡號 */ function callGetCardNum() { //鏈接讀卡器 var connRet = doConnectCard(); if(!connRet) { doDisConnectCard(); //報錯後要斷開,不然再連會失敗 return; } //讀取IMSI,判斷是否爲白卡 var imsiRet = getIMSI(); if(!imsiRet) { doDisConnectCard(); //報錯後要斷開,不然再連會失敗 return; } //讀取卡號 numRet = getCardNum(); doDisConnectCard(); return numRet; } /** * 寫卡 */ function writeCard() { var cardNum = document.getElementById("cardNum").value; var cardNumD = callGetCardNum(); cardNumD = cardNumD.substr(0, 20); if(cardNum.toUpperCase() != cardNumD.toUpperCase()) { alert("請插入["+cardNum.toUpperCase()+"]這張白卡(你目前插入的是["+cardNumD.toUpperCase()+"]),而後重試!"); return false; } var str = ""; //寫短信中心號碼 var SMS = document.getElementById("smsNum").value; SMS = trim(SMS); SMS = SMS.substr(3, 11) + "F"; var smsCode = dealCardNum(SMS); smsCode = "A0DC010428FFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF089168" + smsCode + "FFFFFFFFFFFF"; str = doSendCard("A0A40000023F00"); if(str == "-1") { alert("寫短信中心失敗1!"); return false; } str = doSendCard("A0A40000027F10"); if(str == "-1") { alert("寫短信中心失敗2!"); return false; } str = doSendCard("A0A40000026F42"); if(str == "-1") { alert("寫短信中心失敗3!"); return false; } str = doSendCard(smsCode); if(str == "-1") { alert("寫短信中心失敗4!"); return false; } //寫IMSI var IMSI = "809" + document.getElementById("imsiNum").value; IMSI = trim(IMSI); var imsiCode = dealCardNum(IMSI); str = doSendCard("A0A40000023F00"); if(str == "-1") { alert("寫IMSI失敗1!"); return false; } str = doSendCard("A0A40000027F20"); if(str == "-1") { alert("寫IMSI失敗2!"); return false; } str = doSendCard("A0A40000026F07"); if(str == "-1") { alert("寫IMSI失敗3!"); return false; } str = doSendCard("A0F4000012" + imsiCode + imsiCode); str = trim(str); if(str != "9000") { alert("寫IMSI失敗4!"); return false; } return true; } function callWriteCard() { //鏈接讀卡器 var connRet = doConnectCard(); if(!connRet) { doDisConnectCard(); //報錯後要斷開,不然再連會失敗 return; } //寫卡 var writeCardRet = writeCard(); if(writeCardRet == true) { doDisConnectCard(); alert("寫卡成功!"); //請求服務器,提交寫卡信息 submitInfo(); } else { doDisConnectCard(); } } /** * 請求服務器,提交寫卡信息 */ function submitInfo() { //請求服務器,提交寫卡信息 document.getElementById("writeForm").submit(); } /** * 轉換卡號 0123456789>1032547698 第一二位對換、三四位對換... */ function dealCardNum(cardStr) { var cardLength = cardStr.length; var cardNum = ""; for(var i = 0; i < cardLength; i++) { if(i%2 == 0) { cardNum += cardStr.charAt(i+1); } else{ cardNum += cardStr.charAt(i-1); } } return cardNum; } /** * 鏈接讀卡器 */ function doConnectCard() { var obj = document.getElementById("CardReader"); //獲取對象 var cardName = document.getElementById("cardList").value; if(cardName == null || cardName == "") { alert("請選擇讀卡器!"); return false; } //鏈接讀卡器,報錯後要斷開,不然再連會失敗 var retConnect = obj.ConnectCard(cardName); //鏈接失敗 if(!(retConnect == "0" || retConnect == "")) { alert("鏈接讀卡器失敗!報錯:" + obj.GetErrMsg()); return false; } return true; } /** * 斷開鏈接 */ function doDisConnectCard() { var obj = document.getElementById("CardReader"); var str = document.getElementById("cardList").value; var ret = obj.DisconnectCard(str); if(ret != "0") return false; else return true; } /** * 發送指令 */ function doSendCard(str) { var obj = document.getElementById("CardReader"); var ret = obj.TransmitCard(str, document.getElementById("cardList").value); var ErrMsg = obj.GetErrMsg(); console.info("ErrMsg:" + ErrMsg + " ret:" + ret); if(ErrMsg != "" && ErrMsg != "0") { return "-1"; } ret = trim(ret);//去掉空格 if(ret == "6999") { return "-1"; } return ret; } /** * 去掉全部的空格 */ function trim(str) { return str.replace(/\s+/g,""); } /** * 判斷是否爲數字 */ function isnumber(strs) { for(var i = 0; i<strs.length; i++) { var str = strs.charAt(i); if((str<'0') || (str>'9')) return false; } return true; } </SCRIPT>