白卡读写开发(OCX)代码

调用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>

转载于:https://my.oschina.net/u/1177171/blog/779161

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值