调用OCX读写白卡,使用的是JS代码,读写卡的JS代码如下
读卡(readCard.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)
<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>