Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
            }
        }
Пример #9
0
        /// <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);
            }
        }
Пример #10
0
        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);
        }
Пример #11
0
        /// <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);
        }
Пример #12
0
 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;
     }
 }
Пример #13
0
 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);
 }
Пример #14
0
 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);
 }
Пример #15
0
        //#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);
        }
Пример #16
0
        /// <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);
        }
Пример #17
0
        /// <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);
        }
Пример #18
0
        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();//清除冲正文件
            }
        }
Пример #19
0
        /// <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);
        }
Пример #20
0
        /// <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);
        }