/// <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); }
/// <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); }
/// <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); }
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())); }
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); }
/// <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); }
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); }
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); }