/// <summary> /// 8. 读返写区文件 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool GetEF5(ref string info) { bool bRet = false; if (!CardReader.IsUse) { info = "6811002B02000001000001000000629276002013007233000017E80000001700000000010004010000001510051026FE169000"; return(true); } try { byte[] bOut = new byte[2048]; int nOut = 0; CardReader.Status sRet = CardReader.CardChipIO(GET_EF5, GET_EF5.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("GetEF5:" + info); if (info.Substring(info.Length - 4) == RET_STRING) { bRet = true; info = info.Substring(0, info.Length - 4); } else { Log.Warn("GetEF5:" + info); } } } catch (Exception ex) { Log.Error("GetEF5:" + ex); } return(bRet); }
public bool LimitAuth(string limitPsd) { bool bRet = false; try { Log.Debug("写权限认证:" + limitPsd); byte[] bOut = new byte[2048]; int nOut = 0; string info = ""; byte[] bLimit = PubFunc.HexStringToByteArray(limitPsd); byte[] bCommand = new byte[LIMIT_AUTH.Length + bLimit.Length]; Array.Copy(LIMIT_AUTH, bCommand, LIMIT_AUTH.Length); Array.Copy(bLimit, 0, bCommand, LIMIT_AUTH.Length, bLimit.Length); //bCommand[bCommand.Length - 1] = 0x00; Log.Debug("写权限命令:" + PubFunc.ByteArrayToHexString(bCommand, bCommand.Length)); CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("写权限:" + info); if (info == RET_STRING) { bRet = true; } } } catch (Exception ex) { Log.Error("LimitAuth:" + ex.ToString()); } return(bRet); }
public bool ExtAuth(string extPsd) { bool bRet = false; try { Log.Debug("购电外部认证" + extPsd); byte[] bOut = new byte[2048]; int nOut = 0; string info = ""; byte[] bExt = PubFunc.HexStringToByteArray(extPsd); byte[] bCommand = new byte[EXT_AUTH.Length + bExt.Length]; Array.Copy(EXT_AUTH, bCommand, EXT_AUTH.Length); Array.Copy(bExt, 0, bCommand, EXT_AUTH.Length, bExt.Length); Log.Debug("购电外部命令:" + PubFunc.ByteArrayToHexString(bCommand, bCommand.Length)); CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("购电外部:" + info); if (info == RET_STRING) { bRet = true; } } } catch (Exception ex) { Log.Error("ExtAuth:" + ex.ToString()); } return(bRet); }
/// <summary> /// 读钱包文件 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool GetEF2(ref string info) { bool bRet = false; if (!CardReader.IsUse) { info = "0000283C000000019000"; return(true); } try { byte[] bOut = new byte[2048]; int nOut = 0; CardReader.Status sRet = CardReader.CardChipIO(GET_EF2, GET_EF2.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("GetEF2:" + info); if (info.Substring(info.Length - 4) == RET_STRING) { bRet = true; info = info.Substring(0, info.Length - 4); } else { Log.Warn("GetEF2:" + info); } } } catch (Exception ex) { Log.Error("GetEF2:" + ex); } return(bRet); }
/// <summary> /// 判断电卡类型 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool GetCardType(ref string info) { bool bRet = false; try { byte[] bOut = new byte[2048]; int nOut = 0; CardReader.Status sRet = CardReader.CardChipIO(GET_CARD_TYPE, GET_CARD_TYPE.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("GetCardType:" + info); if (info == RET_CARDTYPE_2) { bRet = true; } else { Log.Warn("GetCardType:" + info); } } } catch (Exception ex) { Log.Error("GetCardType:" + ex); } return(bRet); }
/// <summary> /// 上电获取卡片序列号 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool GetCardNo(ref string info) { bool bRet = false; if (!CardReader.IsUse) { info = "10110800000F82CA"; return(true); } try { byte[] bAnswer = new byte[512]; int nLen = 0; int nChip = 0; CardReader.Status status = CardReader.CardPowerUp(bAnswer, ref nLen, ref nChip); Log.Error("GetCardResult:" + Enum.GetName(typeof(CardReader.Status), status)); if (status == CardReader.Status.CARD_SUCC) { bRet = true; info = PubFunc.ByteArrayToHexString(bAnswer, nLen); Log.Debug("GetCardNO:" + info); info = info.Substring(info.Length - 16); } } catch (Exception ex) { Log.Error("GetCardNo:" + ex); } return(bRet); }
public bool UpdateKey(string key) { bool bRet = false; try { byte[] bOut = new byte[2048]; string sKey = "84D401FF20"; int nOut = 0; string info = ""; byte[] bCommand = PubFunc.HexStringToByteArray(sKey + key); CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); if (info == RET_STRING) { bRet = true; } } } catch (Exception ex) { Log.Error("UpdateKey:" + ex); } return(bRet); }
protected Result DefaultRead() { string trk1 = "", trk2 = "", trk3 = ""; CardReader.Status ret = CardReader.InsertCard(ref trk1, ref trk2, ref trk3); if (ret == CardReader.Status.CARD_SUCC) { if (CardReader.IsUse) { CommonData.BIsCardIn = true;//有卡进入 } if (trk1.Trim() == "") { Log.Debug("Track1 : NULL"); } else { Log.Debug("Track1 : IN"); } if (trk2.Trim() == "") { Log.Debug("Track2 : NULL"); } else { Log.Debug("Track2 : IN"); } if (trk3.Trim() == "") { Log.Debug("Track3 : NULL"); } else { Log.Debug("Track3 : IN"); } Track1 = trk1; Track2 = trk2; Track3 = trk3; string CardNumber = Utility.GetCardNumber(trk2, trk3); BankCardNum = CardNumber; if (CardNumber.Trim().Length > 0) { return(Result.Success); } else { return(Result.Fail); } } else if (ret == CardReader.Status.CARD_WAIT) { return(Result.Again); } else { Log.Error("ReaderOnce:" + ret.ToString()); return(Result.HardwareError); } }
/// <summary> /// 插入带芯片卡 /// </summary> /// <returns></returns> protected Result InsertICCard() { CardReader.Status ret = CardReader.Insert_ICcard(); if (ret != CardReader.Status.CARD_WAIT) { CommonData.BIsCardIn = true; } switch (ret) { case CardReader.Status.CARD_WAIT: { return(Result.Again); } case CardReader.Status.CARD_SUCC: { ReportSync("none"); return(Result.Success); } default: return(Result.HardwareError); } }
private byte[] EXT_AUTH = { 0x00, 0x82, 0x00, 0x04, 0x08 }; //外部认证 + 密钥 /// <summary> /// 获取电卡信息 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool GetCardInfo(ref string info) { bool bRet = false; if (!CardReader.IsUse) { info = "5DDC19FC1287506465BE2C70D5080817C28C009B181DA1C46ADC7285F5D1FCCD7CD2E7CAE3EA664F5754B8AC2C6DF4189B14A56696A950B915BE6794C7F49E41849C8756619EA31922FE5D04326128B03A32FB122697F077F932274EF10E320790EAF47E1304D7BF33DC2176D9FFE4E2F29069BF5C8E3D47ED9CAC426C38ADC69000"; return(true); } try { byte[] bOut = new byte[2048]; int nOut = 0; CardReader.Status sRet = CardReader.CardChipIO(GET_CARD_INFO, GET_CARD_INFO.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("GetCardInfo:" + info); if (info.Substring(info.Length - 4) == RET_STRING) { bRet = true; info = info.Substring(0, info.Length - 4); } else { Log.Warn("GetCardInfo:" + info); } } } catch (Exception ex) { Log.Error("GetCardInfo:" + ex); } return(bRet); }
/// <summary> /// 8. 写返写区文件 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool SetEF5(string ef5) { bool bRet = false; try { byte[] bOut = new byte[2048]; string sCommand = "04D6850035"; int nOut = 0; string info = ""; byte[] bCommand = PubFunc.HexStringToByteArray(sCommand + ef5); CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); if (info == RET_STRING) { bRet = true; } } } catch (Exception ex) { Log.Error("SetEF5:" + ex); } return(bRet); }
public void OnTimeTick(int count) { CardReader.CardStatus cs = CardReader.CardStatus.CARD_POS_GATE; CardReader.Status s = CardReader.GetStatus(ref cs); if (cs == CardReader.CardStatus.CARD_POS_OUT) { mUserTakeCard = true; } }
public void OnTimeTick(int count) { CardReader.CardStatus cs = CardReader.CardStatus.CARD_POS_GATE; CardReader.Status s = CardReader.GetStatus(ref cs); if (cs == CardReader.CardStatus.CARD_POS_OUT) { //mUserTakeCard = true; StartActivity("主界面"); } Log.Info("CardReader.Status s : " + s); Log.Info("CardReader.Status cs : " + cs); }
public void OnTimeTick(int count) { CardReader.CardStatus cs = CardReader.CardStatus.CARD_POS_GATE; CardReader.Status s = CardReader.GetStatus(ref cs); if (cs == CardReader.CardStatus.CARD_POS_OUT) { //mUserTakeCard = true; setComponnents("ComComponnents", true, true, false); } //Log.Info("CardReader.Status s : " + s); //Log.Info("CardReader.Status cs : " + cs); //Log.Info("mUserTakeCard : " + mUserTakeCard); }
//#region 购电认证 old //public bool CertAuth(string random,string certPsd) //{ // bool bRet = false; // try // { // byte[] bOut = new byte[2048]; // byte[] bOut1 = new byte[2048]; // int nOut = 0; // string info = ""; // byte[] bRandom = PubFunc.HexStringToByteArray(random); // byte[] bCommand = new byte[CERT_AUTH.Length + bRandom.Length]; // Array.Copy(CERT_AUTH, bCommand, CERT_AUTH.Length); // Array.Copy(bRandom, 0, bCommand, CERT_AUTH.Length, bRandom.Length); // //计算随机数 // CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); // if (sRet == CardReader.Status.CARD_SUCC) // { // info = PubFunc.ByteArrayToHexString(bOut, nOut); // if (info != RET_STRING && info == RET_STRING2) // return false; // nOut = 0; // //校验身份验证数据 // sRet = CardReader.CardChipIO(CERT_AUTH_GET, CERT_AUTH_GET.Length, bOut1, ref nOut); // if (sRet == CardReader.Status.CARD_SUCC) // { // info = PubFunc.ByteArrayToHexString(bOut1, nOut); // if (info.Substring(info.Length - 4) == RET_STRING) // { // info = info.Substring(0, info.Length - 4); // bRet = string.Compare(info, certPsd, true) == 0; // } // } // } // } // catch (Exception ex) // { // Log.Error("CertAuth:" + ex); // } // return bRet; //} //public bool LimitAuth(string limitPsd) //{ // bool bRet = false; // try // { // byte[] bOut = new byte[2048]; // int nOut = 0; // string info = ""; // byte[] bLimit = PubFunc.HexStringToByteArray(limitPsd); // byte[] bCommand = new byte[LIMIT_AUTH.Length + bLimit.Length]; // Array.Copy(LIMIT_AUTH, bCommand, LIMIT_AUTH.Length); // Array.Copy(bLimit, 0, bCommand, LIMIT_AUTH.Length, bLimit.Length); // CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); // if (sRet == CardReader.Status.CARD_SUCC) // { // info = PubFunc.ByteArrayToHexString(bOut, nOut); // if (info == RET_STRING) // { // bRet = true; // } // } // } // catch (Exception ex) // { // Log.Error("LimitAuth:" + ex); // } // return bRet; //} //public bool ExtAuth(string extPsd) //{ // bool bRet = false; // try // { // byte[] bOut = new byte[2048]; // int nOut = 0; // string info = ""; // byte[] bExt = PubFunc.HexStringToByteArray(extPsd); // byte[] bCommand = new byte[EXT_AUTH.Length + bExt.Length]; // Array.Copy(EXT_AUTH, bCommand, EXT_AUTH.Length); // Array.Copy(bExt, 0, bCommand, EXT_AUTH.Length, bExt.Length); // CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); // if (sRet == CardReader.Status.CARD_SUCC) // { // info = PubFunc.ByteArrayToHexString(bOut, nOut); // if (info == RET_STRING) // { // bRet = true; // } // } // } // catch (Exception ex) // { // Log.Error("ExtAuth:" + ex); // } // return bRet; //} //#endregion #region 购电认证 public bool CertAuth(string random, string certPsd) { bool bRet = false; try { Log.Debug("身份认证"); byte[] bOut = new byte[2048]; //byte[] bOut1 = new byte[2048]; int nOut = 0; string info = ""; byte[] bRandom = PubFunc.HexStringToByteArray(random); byte[] bCommand = new byte[CERT_AUTH.Length + bRandom.Length]; Array.Copy(CERT_AUTH, bCommand, CERT_AUTH.Length); Array.Copy(bRandom, 0, bCommand, CERT_AUTH.Length, bRandom.Length); Log.Debug("身份认证命令:" + PubFunc.ByteArrayToHexString(bCommand, bCommand.Length)); //计算随机数 CardReader.Status sRet = CardReader.CardChipIO(bCommand, bCommand.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); if (info != RET_STRING && info == RET_STRING2) { return(false); } //nOut = 0; ////校验身份验证数据 //sRet = CardReader.CardChipIO(CERT_AUTH_GET, CERT_AUTH_GET.Length, bOut1, ref nOut); //if (sRet == CardReader.Status.CARD_SUCC) //{ // info = PubFunc.ByteArrayToHexString(bOut1, nOut); // if (info.Substring(info.Length - 4) == RET_STRING) // { info = info.Substring(0, info.Length - 4); Log.Info("CertAuth:" + info + " CertPsd:" + certPsd); bRet = String.Compare(info, certPsd, StringComparison.OrdinalIgnoreCase) == 0; //} //} } } catch (Exception ex) { Log.Error("CertAuth:" + ex.ToString()); } return(bRet); }
/// <summary> /// 选择电卡文件 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool SelectDirectory(ref string info) { bool bRet = false; if (!CardReader.IsUse) { info = "6F0A8400A50688009F0801029000"; return(true); } try { byte[] bOut = new byte[2048]; int nOut = 0; CardReader.Status sRet = CardReader.CardChipIO(SELECT_FILE, SELECT_FILE.Length, bOut, ref nOut); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("SelectDirectory:" + info); string temp = info.Substring(info.Length - 4); if (temp == RET_STRING || temp == RET_STRING1) { bRet = true; info = info.Substring(0, info.Length - 4); } else { Log.Warn("SelectDirectory:" + info); } } } catch (Exception ex) { Log.Error("SelectDirectory:" + ex); } return(bRet); }
/// <summary> /// 随机数 /// </summary> /// <param name="info"></param> /// <returns></returns> public bool GetRandom(ref string info) { bool bRet = false; if (!CardReader.IsUse) { info = "C97FFA2376FD9E43"; return(true); } try { byte[] bOut = new byte[2048]; int nOut = 0; CardReader.Status sRet = CardReader.CardChipIO(GET_RANDOM, GET_RANDOM.Length, bOut, ref nOut); Log.Debug("GetRandom Status:" + Enum.GetName(typeof(CardReader.Status), sRet)); if (sRet == CardReader.Status.CARD_SUCC) { info = PubFunc.ByteArrayToHexString(bOut, nOut); Log.Debug("GetRandom:" + info); if (info.Substring(info.Length - 4) == RET_STRING) { info = info.Substring(0, info.Length - 4); bRet = true; } else { Log.Warn("GetRandom:" + info); } } } catch (Exception ex) { Log.Error("GetRandom:" + ex); } return(bRet); }
public void EMVTransProcess(double dInAmount, PbocTransType pbocType) { int state = 0; byte[] answer = new byte[128]; int pnLen = 0; int pnChipProtocol = 0; EMVInfo = new EMVData(); try { if (BReadBankCard) { goto Init; } #region 类未注册 if (Trans == null || CR == null) { Log.Warn("交易类或冲正类没有注册"); return; } #endregion Init: #region 卡片上电初始化 long hand = CardReader.GetHandle(); CardReader.Status cRet = CardReader.CardPowerUp(answer, ref pnLen, ref pnChipProtocol); if (cRet != CardReader.Status.CARD_SUCC) { CardReader.CardPowerDown(); Log.Warn("上电失败"); return; } state = pboc.App_EMVLInit(0, hand); if (state != 0) { Log.Warn("卡片初始化失败"); return; } #endregion #region 获取卡片应用 byte[] appList = new byte[256]; int nListNum = 0; pboc.App_EMVL2SelectApp(pnChipProtocol, appList, ref nListNum); string[] strEmvList = System.Text.Encoding.Default.GetString(appList).Trim().Replace("\0", "").Split('|'); if (nListNum < 1) { CardReader.CardPowerDown(); Log.Warn("卡片无可用的应用"); return; } byte[] inTrace = Encoding.Default.GetBytes("000000"); byte[] inDay = Encoding.Default.GetBytes(DateTime.Now.ToString("yyMMdd")); byte[] inTime = Encoding.Default.GetBytes(DateTime.Now.ToString("HHmmss")); byte[] inAmount = Encoding.Default.GetBytes(Utility.AmountToString(dInAmount.ToString()));; byte[] inOtherAmount = Encoding.Default.GetBytes("000000000000"); int iAppId = 0; bool bEmvOk = false; foreach (string tempEmv in strEmvList) { //A000000333010101|银联 //if (!String.IsNullOrEmpty(tempEmv) && tempEmv.StartsWith("A000000333")) //{ // state = pboc.App_EMVStartEmvApp(iAppId, pnChipProtocol, (int)PbocTransType.PURCHASE, inTrace, inDay, inTime, inAmount, inOtherAmount); // if (state == 0) // { // bEmvOk = true; // break; // } //} state = pboc.App_EMVStartEmvApp(iAppId, pnChipProtocol, (int)pbocType, inTrace, inDay, inTime, inAmount, inOtherAmount); if (state == 0) { bEmvOk = true; break; } iAppId++; } if (!bEmvOk) { CardReader.CardPowerDown(); Log.Warn("没有支持的应用"); return; } #endregion #region 获取卡片卡号信息 byte[] cardNo = new byte[21]; int cardNoLen = 0; byte[] track2 = new byte[38]; int track2Len = 0; byte[] expData = new byte[5]; int expLen = 0; byte[] cardSeqNum = new byte[2]; pboc.App_EMVGetCardNo(cardNo, ref cardNoLen, track2, ref track2Len, expData, ref expLen, cardSeqNum); EMVInfo.CardNum = Encoding.Default.GetString(cardNo); EMVInfo.Track2 = Encoding.Default.GetString(track2); EMVInfo.CardSeqNum = Convert.ToString(cardSeqNum[0]); EMVInfo.CardExpDate = Encoding.Default.GetString(expData); #endregion #region 银行卡判定 //3 App_EMVTermRiskManageProcessRestrict state = pboc.App_EMVTermRiskManageProcessRestrict(); if (state != 0) { CardReader.CardPowerDown(); Log.Warn("银行卡无效"); return; } //4 App_EMVCardHolderValidate int cTime = 0; state = pboc.App_EMVCardHolderValidate(ref cTime); if (state != 0) { state = pboc.App_EMVContinueCardHolderValidate(1, ref cTime);//无论state为何值,直接提示联机pin以成功输入。内核对联机PIN的处理,只需要告诉是否完成PIN即可 } //5 App_EMVActionAnalysis state = pboc.App_EMVActionAnalysis(); if (state == -1) { CardReader.CardPowerDown(); Log.Warn("系统故障"); return; } else if (state == 0) { CardReader.CardPowerDown(); Log.Warn("脱机交易成功"); return; } else if (state == 1) { CardReader.CardPowerDown(); Log.Warn("卡片拒绝交易"); return; } #endregion #region 联机交易 else if (state == 2) { if (BReadBankCard) { EmvRet = TransResult.E_SUCC; return; } byte[] field55 = new byte[512]; int field55Len = 0; //6 App_EMVGetField55 pboc.App_EMVGetField55(field55, ref field55Len); EMVInfo.SendField55 = new byte[field55Len]; Array.Copy(field55, EMVInfo.SendField55, field55Len); EMVInfo.AutoField55 = GetICAutoField55(field55, field55Len); EmvRet = Trans();//IS8583后台交易 if (EmvRet == TransResult.E_SUCC) { //交易完后与IC进行交互 if (!ICTransFunc(ref state)) { EmvRet = TransResult.E_SEND_FAIL; return; } //7 获取经过IC卡座处理的55域,用于脚本通知或者冲正使用 pboc.App_EMVGetField55(field55, ref field55Len); EMVInfo.AutoField55 = GetICAutoField55(field55, field55Len); CR.CreateReverseFile();//创建冲正文件 //if (state != 4) //{ // AppLog.Write("发起脚本通知state=" + state.ToString(), AppLog.LogMessageType.Info); // CTransScript tScript = new CTransScript(); // tScript.RevTransUp = CTrans.RevTransData; // tScript.SendData.Field11 = PubFunc.GetTerminalTraceNo(); // tScript.SendData.Field32 = CTrans.RecvData.Field32; // tScript.SendData.Field37 = CTrans.RecvData.Field37; // tScript.SendData.Field55 = GetField55Script(RecvField55);//scriptField55 // tScript.TransExecute(); //} if (state == 0) { //交易成功 if (EmvSuccess != null) { EmvSuccess(); } CR.ClearReverseFile();//清除冲正文件 } else if (state == 4) { Log.Warn("写卡失败,无脚本做冲正state=" + state.ToString()); CR.DoReverseFile(); } else { Log.Warn("写卡失败,脚本通知和冲正state=" + state.ToString()); CR.DoReverseFile(); } if (state != 0) { EmvRet = TransResult.E_SEND_FAIL; } } } #endregion } catch (System.Exception ex) { Log.Error("EMVTransProcess Error!", ex); CR.DoReverseFile(); } finally { CardReader.CardPowerDown(); CR.DoReverseFile(); CR.ClearReverseFile();//清除冲正文件 } }
/// <summary> /// IC卡优先,兼容磁条卡,不降级处理 /// </summary> /// <returns></returns> protected Result DefaultRead4() { bool isIcCard = true; int nCardType = 0; string trk1 = "", trk2 = "", trk3 = ""; CardReader.Status ret = CardReader.InsertCard(ref trk1, ref trk2, ref trk3); if (ret == CardReader.Status.CARD_SUCC) { if (CardReader.IsUse) { CommonData.BIsCardIn = true;//有卡进入 } //读卡模式隐藏按钮 ReportSync("none"); //Log.Debug("Track1:" + trk1); //Log.Debug("Track2 : " + trk2); //Log.Debug("Track3 : " + trk3); string CardNumber = Utility.GetCardNumber(trk2, trk3); if (CardNumber.Trim().Length > 0) { Log.Info("MS Card Deal"); Track1 = trk1; Track2 = trk2; Track3 = trk3; BankCardNum = CardNumber; ExpDate = Utility.GetExpDate(trk2, trk3); isIcCard = Utility.CheckIcCardFlag(trk2); Log.Info("isIcCard=" + isIcCard.ToString()); //isIcCard = true;//可能存在二磁道 ic卡判断错误的情况 所以IC卡都需要验证以防 45错误 nCardType = 1; } if (!CardReader.IsUse) { isIcCard = false; } if (isIcCard && mIsUseICCard) { //CardReader.CardType(0, 0);//防止读卡器问题类型问题 EMVTransProcess emv = new EMVTransProcess(); int state = emv.EMVTransInit(0, EMVTransProcess.PbocTransType.PURCHASE); CardReader.CardPowerDown(); if (state == 0) { Log.Info("IC Card Deal"); BankCardNum = emv.EMVInfo.CardNum; Track2 = emv.EMVInfo.Track2; ExpDate = emv.EMVInfo.CardExpDate; CardSeqNum = emv.EMVInfo.CardSeqNum; nCardType += 2; } //else // isIcCard = false;//防止纯磁条卡无法交易 } BankCardType = (UserBankCardType)nCardType; if (mIsUseICCard && isIcCard && nCardType < 2)//开启IC卡,不降级处理 { return(Result.Fail); } if (BankCardType == UserBankCardType.None) { return(Result.Fail); } } else if (ret == CardReader.Status.CARD_WAIT) { return(Result.Again); } else { Log.Error("ReaderOnce:" + ret.ToString()); return(Result.HardwareError); } return(Result.Success); }
/// <summary> /// EMV初始化 /// </summary> /// <param name="dInAmount"></param> /// <param name="pbocType"></param> /// <returns></returns> public int EMVTransInit(double dInAmount, PbocTransType pbocType) { int state = 0; byte[] answer = new byte[128]; int pnLen = 0; int pnChipProtocol = 0; EMVInfo = new EMVData(); long hand = 0; try { #region 卡片上电初始化 if (PayType == 1) { hand = R80.GetHandle(); R80.Status cRet = R80.PowerUp(10, ""); if (cRet != R80.Status.EM_MIFARE_SUCC) { Log.Warn("上电失败"); return(-1); } } else { hand = CardReader.GetHandle(); CardReader.Status cRet = CardReader.CardPowerUp(answer, ref pnLen, ref pnChipProtocol); if (cRet != CardReader.Status.CARD_SUCC) { CardReader.CardPowerDown(); Log.Warn("上电失败"); return(-1); } } state = pboc.App_EMVLInit(PayType, hand); if (state != 0) { Log.Warn("卡片初始化失败"); return(-1); } #endregion #region 获取卡片应用 byte[] appList = new byte[256]; int nListNum = 0; pboc.App_EMVL2SelectApp(pnChipProtocol, appList, ref nListNum); string[] strEmvList = System.Text.Encoding.Default.GetString(appList).Trim().Replace("\0", "").Split('|'); if (nListNum < 1) { CardReader.CardPowerDown(); Log.Warn("卡片无可用的应用"); return(-1); } byte[] inTrace = Encoding.Default.GetBytes("000000"); byte[] inDay = Encoding.Default.GetBytes(DateTime.Now.ToString("yyMMdd")); byte[] inTime = Encoding.Default.GetBytes(DateTime.Now.ToString("HHmmss")); byte[] inAmount = Encoding.Default.GetBytes(Utility.AmountToString(dInAmount.ToString()));; byte[] inOtherAmount = Encoding.Default.GetBytes("000000000000"); int iAppId = 0; bool bEmvOk = false; foreach (string tempEmv in strEmvList) { //A000000333010101|银联 //if (!String.IsNullOrEmpty(tempEmv) && tempEmv.StartsWith("A000000333")) //{ // state = pboc.App_EMVStartEmvApp(iAppId, pnChipProtocol, (int)PbocTransType.PURCHASE, inTrace, inDay, inTime, inAmount, inOtherAmount); // if (state == 0) // { // bEmvOk = true; // break; // } //} state = pboc.App_EMVStartEmvApp(iAppId, pnChipProtocol, (int)pbocType, inTrace, inDay, inTime, inAmount, inOtherAmount); if (state == 0) { bEmvOk = true; break; } iAppId++; } if (!bEmvOk) { CardReader.CardPowerDown(); Log.Warn("没有支持的应用"); return(-1); } #endregion #region 获取卡片卡号信息 byte[] cardNo = new byte[21]; int cardNoLen = 0; byte[] track2 = new byte[38]; int track2Len = 0; byte[] expData = new byte[5]; int expLen = 0; byte[] cardSeqNum = new byte[2]; pboc.App_EMVGetCardNo(cardNo, ref cardNoLen, track2, ref track2Len, expData, ref expLen, cardSeqNum); EMVInfo.CardNum = Encoding.Default.GetString(cardNo).Trim('\0'); EMVInfo.Track2 = Encoding.Default.GetString(track2).Trim('\0'); EMVInfo.CardSeqNum = Convert.ToString(cardSeqNum[0]).Trim('\0'); EMVInfo.CardExpDate = Encoding.Default.GetString(expData).Trim('\0'); if (String.IsNullOrEmpty(EMVInfo.CardNum)) { CardReader.CardPowerDown(); Log.Warn("IC:读卡号失败"); return(-1); } else { EMVInfo.CardNum = EMVInfo.CardNum.Replace('\0', ' ').Trim(); } #endregion } catch (Exception ex) { CardReader.CardPowerDown(); Log.Error("IC:初始化异常", ex); return(-1); } return(0); }