Example #1
0
        /// <summary>
        /// 未完整交易记录处理,返回TAC(M1钱包时为4个字节0x00),如果返回空通过 GetlastError获取错误代码
        /// </summary>
        /// <param name="lcn">逻辑卡号(BCD类型)</param>
        /// <param name="fcn">物理卡号(HEX类型)</param>
        /// <param name="xrn">票卡交易计数器</param>
        /// <param name="fee">交易金额</param>
        /// <param name="bal">本次余额</param>
        /// <returns></returns>
        public string RestorePaid(string lcn, string fcn, int xrn, int fee, int bal)
        {
            try
            {
                List <byte> data = new List <byte>();
                data.AddRange(HexStringConverter.StringToHex(lcn));
                string fcnTemp = fcn.PadRight(16, '0');//M1卡时,物理卡号只有4字节,向右填充0到8字节字符串
                data.AddRange(HexStringConverter.StringToHex(fcnTemp));
                data.AddRange(BEBinaryConverter.ShortToBytes((short)xrn));
                data.AddRange(BEBinaryConverter.IntToBytes(fee));
                data.AddRange(BEBinaryConverter.IntToBytes(bal));
                var response = Request(YCTCommandType.RestorePay, data.ToArray());
                if (response != null && response.IsCommandExcuteOk)
                {
                    return(HexStringConverter.HexToString(response.Data, string.Empty));
                }
                return(null);
            }
            catch (Exception ex)
            {
                Ralid.GeneralLibrary.ExceptionHandling.ExceptionPolicy.HandleException(ex);
            }

            return(null);
        }
Example #2
0
        /// <summary>
        /// 预消费
        /// </summary>
        /// <param name="paid">消费金额(分为单位)</param>
        /// <param name="walletType">钱包类型 1表示M1 2表示CPU</param>
        /// <param name="maxOfflineMonth">离线过期月数</param>
        /// <returns></returns>
        public YCTPaymentInfo Prepaid(int paid, int walletType, int maxOfflineMonth = 0)
        {
            DateTime    dt   = DateTime.Now;
            List <byte> data = new List <byte>();

            data.AddRange(BEBinaryConverter.IntToBytes(paid));
            data.AddRange(BEBinaryConverter.IntToBytes(paid));
            data.Add(BCDConverter.IntToBCD(dt.Year / 100));
            data.Add(BCDConverter.IntToBCD(dt.Year % 100));
            data.Add(BCDConverter.IntToBCD(dt.Month));
            data.Add(BCDConverter.IntToBCD(dt.Day));
            data.Add(BCDConverter.IntToBCD(dt.Hour));
            data.Add(BCDConverter.IntToBCD(dt.Minute));
            data.Add(BCDConverter.IntToBCD(dt.Second));
            data.Add((byte)(maxOfflineMonth > 0 ? 0x01 : 0x00));
            data.Add(BCDConverter.IntToBCD(maxOfflineMonth));
            var response = Request(YCTCommandType.Prepaid, data.ToArray());

            if (response != null && response.IsCommandExcuteOk)
            {
                if (walletType == 1)
                {
                    return(GetPaymentInfoFromM1(response));
                }
                if (walletType == 2)
                {
                    return(GetPaymentInfoFromCPU(response));
                }
            }
            return(null);
        }
Example #3
0
        /// <summary>
        /// 询卡
        /// </summary>
        /// <returns></returns>
        public YCTWallet Poll()
        {
            var response = Request(YCTCommandType.Poll, null);

            if (response != null && response.IsCommandExcuteOk && response.Data != null && response.Data.Length == 52)
            {
                byte[]    data = response.Data;
                YCTWallet w    = new YCTWallet();
                w.WalletType = data[0];
                if (w.WalletType == 1)
                {
                    w.PhysicalCardID = HexStringConverter.HexToString(Slice(data, 1, 4), string.Empty); //M1钱包物理卡只取前四字节
                }
                else
                {
                    w.PhysicalCardID = HexStringConverter.HexToString(Slice(data, 1, 8), string.Empty);
                }
                w.LogicCardID = HexStringConverter.HexToString(Slice(data, 9, 8), string.Empty);
                w.Balance     = BEBinaryConverter.BytesToInt(Slice(data, 17, 4));
                w.Count       = BEBinaryConverter.BytesToInt(Slice(data, 21, 2));
                w.CardType    = HexStringConverter.HexToString(Slice(data, 23, 2), string.Empty);
                w.MinBalance  = data[25] * 100;
                w.MaxBalance  = BEBinaryConverter.BytesToInt(Slice(data, 26, 3));
                w.Deposit     = BEBinaryConverter.BytesToInt(Slice(data, 29, 4));
                if (w.WalletType == 2)
                {
                    w.Balance -= w.MinBalance;                    //CPU钱包可用余额为余额减去最小余额
                }
                return(w);
            }
            return(null);
        }
Example #4
0
        public YiTingPacket CreateResponse(byte[] data)
        {
            List <byte> temp = new List <byte>();

            if (data != null)
            {
                temp.AddRange(data);
            }
            temp.InsertRange(0, BEBinaryConverter.ShortToBytes((short)(data == null ? 0 : data.Length)));
            temp.Insert(0, CalCRC(temp));
            temp.Insert(0, _Data[5]);
            temp.Insert(0, 0x02); //方向
            temp.InsertRange(0, new byte[] { _Data[2], _Data[3] });
            temp.InsertRange(0, new byte[] { _Data[0], _Data[1] });
            temp.AddRange(new byte[] { _Data[_Data.Length - 2], _Data[_Data.Length - 1] });
            return(new YiTingPacket(temp.ToArray()));
        }
Example #5
0
 private YCTPaymentInfo GetPaymentInfoFromCPU(YCTPacket packet)
 {
     byte[] data = packet.Data; //86字节
     if (data == null || data.Length == 0)
     {
         return(null);
     }
     try
     {
         YCTPaymentInfo payment = new YCTPaymentInfo();
         payment.本次交易设备编号   = HexStringConverter.HexToString(Slice(data, 0, 6), string.Empty);
         payment.终端交易流水号    = BEBinaryConverter.BytesToInt(Slice(data, 6, 4));
         payment.本次交易日期时间   = DateTime.ParseExact(HexStringConverter.HexToString(Slice(data, 10, 7), string.Empty), "yyyyMMddHHmmss", null);
         payment.逻辑卡号       = HexStringConverter.HexToString(Slice(data, 17, 8), string.Empty);
         payment.物理卡号       = HexStringConverter.HexToString(Slice(data, 25, 8), string.Empty);
         payment.交易金额       = BEBinaryConverter.BytesToInt(Slice(data, 33, 4));
         payment.票价         = BEBinaryConverter.BytesToInt(Slice(data, 37, 4));
         payment.本次余额       = BEBinaryConverter.BytesToInt(Slice(data, 41, 4));
         payment.交易类型       = Slice(data, 45, 1)[0];
         payment.附加交易类型     = Slice(data, 46, 1)[0];
         payment.票卡充值交易计数   = BEBinaryConverter.BytesToInt(Slice(data, 47, 2));
         payment.票卡消费交易计数   = BEBinaryConverter.BytesToInt(Slice(data, 49, 2));
         payment.累计门槛月份     = HexStringConverter.HexToString(Slice(data, 51, 2), string.Empty);
         payment.公交门槛计数     = Slice(data, 53, 1)[0];
         payment.地铁门槛计数     = Slice(data, 54, 1)[0];
         payment.联乘门槛计数     = Slice(data, 55, 1)[0];
         payment.本次交易入口设备编号 = HexStringConverter.HexToString(Slice(data, 56, 6), string.Empty);
         payment.本次交易入口日期时间 = HexStringConverter.HexToString(Slice(data, 62, 7), string.Empty);
         payment.次交易设备编号    = HexStringConverter.HexToString(Slice(data, 69, 6), string.Empty);
         payment.次交易日期时间    = HexStringConverter.HexToString(Slice(data, 75, 4), string.Empty);
         payment.区域代码       = HexStringConverter.HexToString(Slice(data, 79, 1), string.Empty);
         payment.区域卡类型      = HexStringConverter.HexToString(Slice(data, 80, 2), string.Empty);
         payment.区域子码       = HexStringConverter.HexToString(Slice(data, 82, 1), string.Empty);
         payment.交易认证码      = HexStringConverter.HexToString(Slice(data, 83, 4), string.Empty);
         return(payment);
     }
     catch (Exception ex)
     {
         Ralid.GeneralLibrary.ExceptionHandling.ExceptionPolicy.HandleException(ex);
     }
     return(null);
 }
Example #6
0
        /// <summary>
        /// 询卡
        /// </summary>
        /// <returns></returns>
        public YCTWallet ReadCard(WegenType wg = WegenType.Wengen34)
        {
            var response = Request(YCTCommandType.Poll, null);

            if (response != null && response.IsCommandExcuteOk && response.Data != null && response.Data.Length == 52)
            {
                byte[]    data = response.Data;
                YCTWallet w    = new YCTWallet();
                w.WalletType = data[0];
                if (w.WalletType == 1)
                {
                    w.PhysicalCardID = HexStringConverter.HexToString(Slice(data, 1, 4), string.Empty); //M1钱包物理卡只取前四字节
                }
                else
                {
                    w.PhysicalCardID = HexStringConverter.HexToString(Slice(data, 1, 8), string.Empty);
                }
                w.LogicCardID = HexStringConverter.HexToString(Slice(data, 9, 8), string.Empty);
                w.Balance     = BEBinaryConverter.BytesToInt(Slice(data, 17, 4));
                w.Count       = BEBinaryConverter.BytesToInt(Slice(data, 21, 2));
                w.CardType    = HexStringConverter.HexToString(Slice(data, 23, 2), string.Empty);
                w.MinBalance  = data[25] * 100;
                w.MaxBalance  = BEBinaryConverter.BytesToInt(Slice(data, 26, 3));
                w.Deposit     = BEBinaryConverter.BytesToInt(Slice(data, 29, 4));
                _LastWallet   = w;
                return(w);
            }
            else if (LastError == 0x83) //验证出错,说明卡片是其它IC卡,继续读其序列号
            {
                string sn = ReadSN(wg == WegenType.Wengen26 ? 1 : 0);
                if (sn != null)
                {
                    _LastWallet = new YCTWallet()
                    {
                        LogicCardID = sn, PhysicalCardID = sn, CardType = string.Empty
                    };
                    return(_LastWallet);
                }
            }
            return(null);
        }
Example #7
0
        public static string GetCardID(byte[] data)
        {
            string ret = null;

            try
            {
                ret = ConvertToAsc(data);
                if (ret.Length <= 8)
                {
                    byte[] temp = HexStringConverter.StringToHex(ret);
                    if (temp != null && temp.Length > 0)
                    {
                        ret = BEBinaryConverter.BytesToUint(temp).ToString();
                    }
                }
            }
            catch
            {
            }
            return(ret);
        }
Example #8
0
 private YCTPaymentInfo GetPaymentInfoFromM1(YCTPacket packet)
 {
     byte[] data = packet.Data; //73个字节
     if (data == null || data.Length == 0)
     {
         return(null);
     }
     try
     {
         YCTPaymentInfo payment = new YCTPaymentInfo();
         payment.终端交易流水号    = BEBinaryConverter.BytesToInt(Slice(data, 0, 4));
         payment.逻辑卡号       = HexStringConverter.HexToString(Slice(data, 4, 8), string.Empty);
         payment.物理卡号       = HexStringConverter.HexToString(Slice(data, 12, 4), string.Empty);
         payment.次交易设备编号    = HexStringConverter.HexToString(Slice(data, 16, 4), string.Empty);
         payment.次交易日期时间    = HexStringConverter.HexToString(Slice(data, 20, 7), string.Empty);
         payment.本次交易设备编号   = HexStringConverter.HexToString(Slice(data, 27, 4), string.Empty);
         payment.本次交易日期时间   = DateTime.ParseExact(HexStringConverter.HexToString(Slice(data, 31, 7), string.Empty), "yyyyMMddHHmmss", null);
         payment.交易金额       = BEBinaryConverter.BytesToInt(Slice(data, 38, 4));
         payment.本次余额       = BEBinaryConverter.BytesToInt(Slice(data, 42, 4));
         payment.票价         = BEBinaryConverter.BytesToInt(Slice(data, 46, 4));
         payment.交易类型       = Slice(data, 50, 1)[0];
         payment.票卡消费交易计数   = BEBinaryConverter.BytesToInt(Slice(data, 51, 2));
         payment.累计门槛月份     = HexStringConverter.HexToString(Slice(data, 53, 2), string.Empty);
         payment.公交门槛计数     = Slice(data, 55, 1)[0];
         payment.地铁门槛计数     = Slice(data, 56, 1)[0];
         payment.联乘门槛计数     = Slice(data, 57, 1)[0];
         payment.本次交易入口设备编号 = HexStringConverter.HexToString(Slice(data, 58, 4), string.Empty);
         payment.本次交易入口日期时间 = HexStringConverter.HexToString(Slice(data, 62, 7), string.Empty);
         payment.交易认证码      = HexStringConverter.HexToString(Slice(data, 69, 4), string.Empty);
         return(payment);
     }
     catch (Exception ex)
     {
         Ralid.GeneralLibrary.ExceptionHandling.ExceptionPolicy.HandleException(ex);
     }
     return(null);
 }