MessageUnitTest.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using Edge.Core.Parser.BinaryParser.Util;
  3. using ShellChina_EPS_Project_CarPlatePay_EpsClient_App.MessageEntity;
  4. using ShellChina_EPS_Project_CarPlatePay_EpsClient_App.MessageEntity.Base;
  5. using ShellChina_EPS_Project_CarPlatePay_EpsClient_App.MessageEntity.Incoming;
  6. using ShellChina_EPS_Project_CarPlatePay_EpsClient_App.MessageEntity.Outgoing;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. namespace ShellChina_EPS_Project_CarPlatePay_EpsClient_App_Test
  11. {
  12. [TestClass]
  13. public class MessageUnitTest
  14. {
  15. public static bool ValueEquals(IEnumerable<byte> array1, IEnumerable<byte> array2)
  16. {
  17. if (array1 == null && array2 == null)
  18. {
  19. return true;
  20. }
  21. if ((array1 == null) || (array2 == null))
  22. {
  23. return false;
  24. }
  25. if (array1.Count() != array2.Count())
  26. {
  27. return false;
  28. }
  29. if (array1.Equals(array2))
  30. {
  31. return true;
  32. }
  33. else
  34. {
  35. for (int Index = 0; Index < array1.Count(); Index++)
  36. {
  37. if (!Equals(array1.ElementAt(Index), array2.ElementAt(Index)))
  38. {
  39. return false;
  40. }
  41. }
  42. }
  43. return true;
  44. }
  45. [TestMethod]
  46. public void MembershipInquiryRequest_Serialize_TestMethod1()
  47. {
  48. string carPlateNumber = "78912345";
  49. string terminalId = "88";
  50. var tpdu = "3333";
  51. int messageTypeIdentifier = 200;
  52. var msg = new MembershipInquiryRequest(carPlateNumber, terminalId);
  53. msg.TPDU = tpdu;
  54. msg.MessageTypeIdentifier = messageTypeIdentifier;
  55. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  56. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  57. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  58. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  59. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  60. var parser
  61. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  62. var actual = parser.Serialize(msg);
  63. var expect = tpdu.PadLeft(10, '0').ToBCD()
  64. .Concat(messageTypeIdentifier.GetBCDBytes(2))
  65. .Concat(BitMapHelper.CreateMap(3, 34, 41))
  66. //.Concat(new List<byte>() { 0x08, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, }
  67. .Concat(020031.GetBCDBytes(3))
  68. .Concat(carPlateNumber.Length.GetBCDBytes(2)).Concat(Encoding.ASCII.GetBytes(carPlateNumber))
  69. .Concat(Encoding.ASCII.GetBytes(terminalId.PadLeft(12, '0')));
  70. expect = (actual.Length - 2).GetBinBytes(2).Concat(expect).ToList();
  71. Assert.AreEqual(true, ValueEquals(actual, expect),
  72. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  73. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  74. }
  75. [TestMethod]
  76. public void MembershipInquiryRequest_Serialize_TestMethod2()
  77. {
  78. string carPlateNumber = "浙78912345";
  79. string terminalId = "88";
  80. var tpdu = "3333";
  81. int messageTypeIdentifier = 200;
  82. var msg = new MembershipInquiryRequest(carPlateNumber, terminalId);
  83. msg.TPDU = tpdu;
  84. msg.MessageTypeIdentifier = messageTypeIdentifier;
  85. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  86. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  87. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  88. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  89. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  90. var parser
  91. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  92. var actual = parser.Serialize(msg);
  93. var expect = tpdu.PadLeft(10, '0').ToBCD()
  94. .Concat(messageTypeIdentifier.GetBCDBytes(2))
  95. .Concat(BitMapHelper.CreateMap(3, 34, 41))
  96. .Concat(020031.GetBCDBytes(3))
  97. .Concat(carPlateNumber.Length.GetBCDBytes(2)).Concat(Encoding.UTF8.GetBytes(carPlateNumber))
  98. .Concat(Encoding.ASCII.GetBytes(terminalId.PadLeft(12, '0')));
  99. expect = (actual.Length - 2).GetBinBytes(2).Concat(expect).ToList();
  100. Assert.AreEqual(true, ValueEquals(actual, expect),
  101. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  102. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  103. }
  104. [TestMethod]
  105. public void MembershipInquiryRequest_Serialize_TestMethod3()
  106. {
  107. string carPlateNumber = "浙BD912345";
  108. string terminalId = "33232388";
  109. var tpdu = "3333999";
  110. int messageTypeIdentifier = 200;
  111. var msg = new MembershipInquiryRequest(carPlateNumber, terminalId);
  112. msg.TPDU = tpdu;
  113. msg.MessageTypeIdentifier = messageTypeIdentifier;
  114. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  115. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  116. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  117. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  118. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  119. var parser
  120. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  121. var actual = parser.Serialize(msg);
  122. var expect = tpdu.PadLeft(10, '0').ToBCD()
  123. .Concat(messageTypeIdentifier.GetBCDBytes(2))
  124. .Concat(BitMapHelper.CreateMap(3, 34, 41))
  125. //.Concat(new List<byte>() { 0x08, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, }
  126. .Concat(020031.GetBCDBytes(3))
  127. .Concat(carPlateNumber.Length.GetBCDBytes(2)).Concat(Encoding.UTF8.GetBytes(carPlateNumber))
  128. .Concat(Encoding.ASCII.GetBytes(terminalId.PadLeft(12, '0')));
  129. expect = (actual.Length - 2).GetBinBytes(2).Concat(expect).ToList();
  130. Assert.AreEqual(true, ValueEquals(actual, expect),
  131. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  132. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  133. }
  134. [TestMethod]
  135. public void MembershipInquiryRequest_Serialize_TestMethod4()
  136. {
  137. string carPlateNumber = "12浙BD912345";
  138. string terminalId = "3433232388";
  139. var tpdu = "3333999";
  140. int messageTypeIdentifier = 200;
  141. var msg = new MembershipInquiryRequest(carPlateNumber, terminalId);
  142. msg.TPDU = tpdu;
  143. msg.MessageTypeIdentifier = messageTypeIdentifier;
  144. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  145. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  146. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  147. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  148. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  149. var parser
  150. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  151. var actual = parser.Serialize(msg);
  152. var expect = tpdu.PadLeft(10, '0').ToBCD()
  153. .Concat(messageTypeIdentifier.GetBCDBytes(2))
  154. .Concat(BitMapHelper.CreateMap(3, 34, 41))
  155. //.Concat(new List<byte>() { 0x08, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, }
  156. .Concat(020031.GetBCDBytes(3))
  157. .Concat(carPlateNumber.Length.GetBCDBytes(2)).Concat(Encoding.UTF8.GetBytes(carPlateNumber))
  158. .Concat(Encoding.ASCII.GetBytes(terminalId.PadLeft(12, '0')));
  159. expect = (actual.Length - 2).GetBinBytes(2).Concat(expect).ToList();
  160. Assert.AreEqual(true, ValueEquals(actual, expect),
  161. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  162. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  163. }
  164. [TestMethod]
  165. public void MembershipInquiryResponse_Deserialize_TestMethod1()
  166. {
  167. var parser = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  168. var raw = new byte[] {
  169. //报文长度 b2 长度位为2个字节binary格式数字
  170. 0x00, 0x48,
  171. //TPDU n10 TPDU为10位数字,报文中以5字节BCD码表示,本接口对TPDU内容没有特殊要求,终端中按应用的需求配置为固定的TPDU即可,如“6000300000”
  172. 0x00, 0x03, 0x33, 0x39, 0x99,
  173. //报文类型标识 n4 MTI为消息类型标识(Message type identifier的简写),4位数字,报文中以2字节BCD码表示
  174. 0x02, 0x10,
  175. //位图 b8 本接口规范仅使用8个字节基本位图,不使用扩展位图
  176. 0x20,0x10,0x01,0x00,0x42,0x80,0x00,0x00,
  177. //P-3, 3 bytes
  178. 0x02, 0x00, 0x31,
  179. //P-12,9 bytes
  180. 0x31, 0x30, 0x30, 0x30, 0x31, 0x39, 0x00, 0x00, 0x00,
  181. //P-24, 20 bytes
  182. 0x32, 0x33, 0x34, 0x32, 0x33, 0x32, 0x33, 0x34, 0x32, 0x33, 0x32, 0x33, 0x34,0x32, 0x33,0x32, 0x33, 0x34,0x32, 0x33,
  183. //P-34, 20 bytes
  184. 0x00,0x06, 0x41,0x42,0x43,0x31,0x32,0x33,
  185. //P-39, 5 bytes
  186. 0x32, 0x33, 0x34,0x32, 0x33,
  187. //P-41,
  188. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32
  189. };
  190. var response = parser.Deserialize(raw) as MembershipInquiryResponse;
  191. Assert.AreEqual(true, response.P_3_处理码 == 020031);
  192. Assert.AreEqual(true, response.P_12_交易流水号.StartsWith("100019"));
  193. Assert.AreEqual(true, response.P_24_会员ID == "23423234232342323423");
  194. Assert.AreEqual(true, response.P_34_车牌号码 == "ABC123");
  195. Assert.AreEqual(true, response.P_39_交易响应码 == "23423");
  196. Assert.AreEqual(true, response.P_41_终端编号 == "123456789012");
  197. //00 39 00 03 33 39 99 02 00 08 00 00 00 04 02 00 00 00 2A 02 00 08 00 00 00 04 02 00 00 11 99 88 00 11 31 32 E6 B5 99 42 44 39 31 32 33 34 35 30 30 33 34 33 33 32 33 32 33 38 38
  198. //parser.Deserialize()
  199. }
  200. [TestMethod]
  201. public void MembershipInquiryResponse_Deserialize_TestMethod2()
  202. {
  203. var parser = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  204. var raw = "0048600003000002102010010042800000020031313030303139000000373030343930303035393438303036313031300000064142433132333030303030313233343536373839303132".ToBytes();
  205. var response = parser.Deserialize(raw) as MembershipInquiryResponse;
  206. Assert.AreEqual(true, response.TPDU == "6000030000");
  207. Assert.AreEqual(true, response.MessageTypeIdentifier == 210);
  208. Assert.AreEqual(true, response.P_3_处理码 == 020031);
  209. Assert.AreEqual(true, response.P_12_交易流水号.StartsWith("100019"));
  210. Assert.AreEqual(true, response.P_24_会员ID.StartsWith("7004900059480061010"));
  211. Assert.AreEqual(true, response.P_34_车牌号码 == "ABC123");
  212. Assert.AreEqual(true, response.P_39_交易响应码 == "00000");
  213. Assert.AreEqual(true, response.P_41_终端编号 == "123456789012");
  214. Assert.AreEqual(true, string.IsNullOrEmpty(response.P_40_错误信息));
  215. //00 39 00 03 33 39 99 02 00 08 00 00 00 04 02 00 00 00 2A 02 00 08 00 00 00 04 02 00 00 11 99 88 00 11 31 32 E6 B5 99 42 44 39 31 32 33 34 35 30 30 33 34 33 33 32 33 32 33 38 38
  216. //parser.Deserialize()
  217. }
  218. [TestMethod]
  219. public void MembershipInquiryResponse_Deserialize_FailResponse_TestMethod3()
  220. {
  221. var parser = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  222. var raw = ("002a" +
  223. "6000030000" +
  224. "0210" +
  225. "2000000003000000" +
  226. "020031" +
  227. "3030303031" +
  228. "0017b2e9d1afbbe1d4b1d0c5cfa2caa7b0dc3a").ToBytes();
  229. var response = parser.Deserialize(raw) as MembershipInquiryResponse;
  230. Assert.AreEqual(true, response.TPDU == "6000030000");
  231. Assert.AreEqual(true, response.MessageTypeIdentifier == 210);
  232. Assert.AreEqual(true, response.P_3_处理码 == 020031);
  233. Assert.AreEqual(true, response.P_39_交易响应码 == "00001");
  234. Assert.AreEqual(true, response.P_40_错误信息 == Encoding.ASCII.GetString("b2e9d1afbbe1d4b1d0c5cfa2caa7b0dc3a".ToBytes()));
  235. //00 39 00 03 33 39 99 02 00 08 00 00 00 04 02 00 00 00 2A 02 00 08 00 00 00 04 02 00 00 11 99 88 00 11 31 32 E6 B5 99 42 44 39 31 32 33 34 35 30 30 33 34 33 33 32 33 32 33 38 38
  236. //parser.Deserialize()
  237. }
  238. [TestMethod]
  239. public void PaymentRequest_Serialize_TestMethod1()
  240. {
  241. decimal amount = 11119.99M;
  242. string epsSeqNo = "12345abc";
  243. int siteLevelNozzleId = 5;
  244. string membershipId = "19831111";
  245. string carPlateNumber = "12浙BD912345";
  246. string terminalId = "3433232388";
  247. var tpdu = "3333999";
  248. int messageTypeIdentifier = 200;
  249. var msg = new PaymentRequest(amount, epsSeqNo, siteLevelNozzleId, membershipId, carPlateNumber, terminalId);
  250. msg.TPDU = tpdu;
  251. msg.MessageTypeIdentifier = messageTypeIdentifier;
  252. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  253. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  254. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  255. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  256. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  257. var parser
  258. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  259. var actual = parser.Serialize(msg);
  260. var expect = tpdu.PadLeft(10, '0').ToBCD()
  261. .Concat(messageTypeIdentifier.GetBCDBytes(2))
  262. .Concat(BitMapHelper.CreateMap(3, 4, 12, 23, 24, 34, 41))
  263. //.Concat(new List<byte>() { 0x08, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, }
  264. .Concat(020032.GetBCDBytes(3))
  265. .Concat(((int)(amount * 100)).GetBCDBytes(6))
  266. .Concat(Encoding.ASCII.GetBytes(epsSeqNo.PadRight(9, '\0')))
  267. .Concat(Encoding.ASCII.GetBytes(siteLevelNozzleId.ToString().PadLeft(2, '0')))
  268. .Concat(Encoding.ASCII.GetBytes(membershipId.PadRight(20, '\0')))
  269. .Concat(carPlateNumber.Length.GetBCDBytes(2)).Concat(Encoding.UTF8.GetBytes(carPlateNumber))
  270. .Concat(Encoding.ASCII.GetBytes(terminalId.PadLeft(12, '0')));
  271. expect = (actual.Length - 2).GetBinBytes(2).Concat(expect).ToList();
  272. Assert.AreEqual(true, ValueEquals(actual, expect),
  273. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  274. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  275. }
  276. [TestMethod]
  277. public void PaymentRequest_Serialize_TestMethod2()
  278. {
  279. decimal amount = 1.02M;
  280. string epsSeqNo = "100071 ";
  281. int siteLevelNozzleId = 3;
  282. string membershipId = "7004900059480061010 ";
  283. string carPlateNumber = "ABC123";
  284. string terminalId = "123456789012";
  285. var tpdu = "6000030000";
  286. int messageTypeIdentifier = 200;
  287. var msg = new PaymentRequest(amount, epsSeqNo, siteLevelNozzleId, membershipId, carPlateNumber, terminalId);
  288. msg.TPDU = tpdu;
  289. msg.MessageTypeIdentifier = messageTypeIdentifier;
  290. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  291. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  292. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  293. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  294. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  295. var parser
  296. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  297. var actual = parser.Serialize(msg);
  298. var expect = tpdu.PadLeft(10, '0').ToBCD()
  299. .Concat(messageTypeIdentifier.GetBCDBytes(2))
  300. .Concat(BitMapHelper.CreateMap(3, 4, 12, 23, 24, 34, 41))
  301. //.Concat(new List<byte>() { 0x08, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, }
  302. .Concat(020032.GetBCDBytes(3))
  303. .Concat(((int)(amount * 100)).GetBCDBytes(6))
  304. .Concat(Encoding.ASCII.GetBytes(epsSeqNo.PadRight(9, '\0')))
  305. .Concat(Encoding.ASCII.GetBytes(siteLevelNozzleId.ToString().PadLeft(2, '0')))
  306. .Concat(Encoding.ASCII.GetBytes(membershipId.PadRight(20, '\0')))
  307. .Concat(carPlateNumber.Length.GetBCDBytes(2)).Concat(Encoding.UTF8.GetBytes(carPlateNumber))
  308. .Concat(Encoding.ASCII.GetBytes(terminalId.PadLeft(12, '0')));
  309. expect = (actual.Length - 2).GetBinBytes(2).Concat(expect).ToList();
  310. Assert.AreEqual(true, ValueEquals(actual, expect),
  311. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  312. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  313. }
  314. [TestMethod]
  315. public void PaymentRequest_Serialize_TestMethod3()
  316. {
  317. decimal amount = 1.02M;
  318. string epsSeqNo = "100071";
  319. int siteLevelNozzleId = 3;
  320. string membershipId = "7004900059480061010";
  321. string carPlateNumber = "ABC123";
  322. string terminalId = "123456789012";
  323. var tpdu = "6000030000";
  324. int messageTypeIdentifier = 200;
  325. var msg = new PaymentRequest(amount, epsSeqNo, siteLevelNozzleId, membershipId, carPlateNumber, terminalId);
  326. msg.TPDU = tpdu;
  327. msg.MessageTypeIdentifier = messageTypeIdentifier;
  328. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  329. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  330. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  331. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  332. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  333. var parser
  334. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  335. var actual = parser.Serialize(msg);
  336. var expect = tpdu.PadLeft(10, '0').ToBCD()
  337. .Concat(messageTypeIdentifier.GetBCDBytes(2))
  338. .Concat(BitMapHelper.CreateMap(3, 4, 12, 23, 24, 34, 41))
  339. //.Concat(new List<byte>() { 0x08, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, }
  340. .Concat(020032.GetBCDBytes(3))
  341. .Concat(((int)(amount * 100)).GetBCDBytes(6))
  342. .Concat(Encoding.ASCII.GetBytes(epsSeqNo.PadRight(9, '\0')))
  343. .Concat(Encoding.ASCII.GetBytes(siteLevelNozzleId.ToString().PadLeft(2, '0')))
  344. .Concat(Encoding.ASCII.GetBytes(membershipId.PadRight(20, '\0')))
  345. .Concat(carPlateNumber.Length.GetBCDBytes(2)).Concat(Encoding.UTF8.GetBytes(carPlateNumber))
  346. .Concat(Encoding.ASCII.GetBytes(terminalId.PadLeft(12, '0')));
  347. expect = (actual.Length - 2).GetBinBytes(2).Concat(expect).ToList();
  348. Assert.AreEqual(true, ValueEquals(actual, expect),
  349. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  350. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  351. }
  352. [TestMethod]
  353. public void PaymentRequest_Serialize_TestMethod4()
  354. {
  355. decimal amount = 1.02M;
  356. string epsSeqNo = "100071";
  357. int siteLevelNozzleId = 3;
  358. string membershipId = "7004900059480061010";
  359. string carPlateNumber = "ABC123";
  360. string terminalId = "123456789012";
  361. var tpdu = "6000030000";
  362. int messageTypeIdentifier = 200;
  363. var msg = new PaymentRequest(amount, epsSeqNo, siteLevelNozzleId, membershipId, carPlateNumber, terminalId);
  364. msg.TPDU = tpdu;
  365. msg.MessageTypeIdentifier = messageTypeIdentifier;
  366. //msg.BitMap = new List<byte>() { 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
  367. //msg.Content = new List<byte>() { 0x00, 0x00, 0x99,
  368. // 0x00, 0x08, 0x37, 0x38, 0x39, 0x31, 0x32, 0x33, 0x34, 0x35,
  369. // 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x88 };
  370. //msg.Content = msg.Content.Count.GetBinBytes(2).Concat(msg.MessageTypeIdentifier.GetBCDBytes(4)).Concat(msg.BitMap).ToList();
  371. var parser
  372. = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  373. var actual = parser.Serialize(msg);
  374. // from real system log
  375. var expect = "600003000002003010030040800000020032000000000102313030303731000000303337303034393030303539343830303631303130000006414243313233313233343536373839303132".ToBytes();
  376. expect = (expect.Length).GetBinBytes(2).Concat(expect).ToArray();
  377. Assert.AreEqual(true, ValueEquals(actual, expect),
  378. "expect: \r\n" + expect.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n)
  379. + "\r\n actual: \r\n" + actual.Select(e => e.ToString("X2")).Aggregate((acc, n) => acc + " " + n));
  380. }
  381. [TestMethod]
  382. public void PaymentResponse_Deserialize_TestMethod1()
  383. {
  384. var parser = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  385. var raw = new byte[] {
  386. //报文长度 b2 长度位为2个字节binary格式数字
  387. 0x00, 0x48,
  388. //TPDU n10 TPDU为10位数字,报文中以5字节BCD码表示,本接口对TPDU内容没有特殊要求,终端中按应用的需求配置为固定的TPDU即可,如“6000300000”
  389. 0x00, 0x03, 0x33, 0x39, 0x99,
  390. //报文类型标识 n4 MTI为消息类型标识(Message type identifier的简写),4位数字,报文中以2字节BCD码表示
  391. 0x02, 0x10,
  392. //位图 b8 本接口规范仅使用8个字节基本位图,不使用扩展位图, field 3,4,5,7,12,39
  393. 0x3a,0x10,0x00,0x00,0x02,0x00,0x00,0x00,
  394. //P-3, 3 bytes
  395. 0x02, 0x00, 0x32,
  396. //P-4, 6 bytes, should pay amount
  397. 0x00, 0x00, 0x00,0x00,0x00,0x78,
  398. //P-5, 6 bytes, actual pay amount
  399. 0x00, 0x00, 0x00,0x00,0x00,0x78,
  400. //P-7, 7 bytes, datetime
  401. 0x20,0x18,0x11,0x23,0x21,0x11,0x10,
  402. //P-12,9 bytes
  403. 0x31, 0x30, 0x30, 0x30, 0x31, 0x39, 0x00, 0x00, 0x00,
  404. //P-39, 5 bytes
  405. 0x32, 0x33, 0x34,0x32, 0x33,
  406. };
  407. var response = parser.Deserialize(raw) as PaymentResponse;
  408. Assert.AreEqual(true, response.P_3_处理码 == 020032);
  409. Assert.AreEqual(true, response.P_4_交易金额 == 0.78M);
  410. Assert.AreEqual(true, response.P_5_实付金额 == 0.78M);
  411. Assert.AreEqual(true, response.P_7_交易时间.Equals(new System.DateTime(2018, 11, 23, 21, 11, 10)));
  412. Assert.AreEqual(true, response.P_12_交易流水号.StartsWith("100019"));
  413. Assert.AreEqual(true, response.P_39_交易响应码 == "23423");
  414. //00 39 00 03 33 39 99 02 00 08 00 00 00 04 02 00 00 00 2A 02 00 08 00 00 00 04 02 00 00 11 99 88 00 11 31 32 E6 B5 99 42 44 39 31 32 33 34 35 30 30 33 34 33 33 32 33 32 33 38 38
  415. //parser.Deserialize()
  416. }
  417. [TestMethod]
  418. public void PaymentResponse_Deserialize_TestMethod2()
  419. {
  420. var parser = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  421. // from real system log.
  422. var raw = "0033600003000002103a10000002000000020032000000000078000000000078201811232111103130303037310000003030303030".ToBytes();
  423. var response = parser.Deserialize(raw) as PaymentResponse;
  424. Assert.AreEqual(true, response.TPDU == "6000030000");
  425. Assert.AreEqual(true, response.MessageTypeIdentifier == 210);
  426. Assert.AreEqual(true, response.P_3_处理码 == 020032);
  427. Assert.AreEqual(true, response.P_4_交易金额 == 0.78M);
  428. Assert.AreEqual(true, response.P_5_实付金额 == 0.78M);
  429. Assert.AreEqual(true, response.P_7_交易时间.Equals(new System.DateTime(2018, 11, 23, 21, 11, 10)));
  430. Assert.AreEqual(true, response.P_12_交易流水号.StartsWith("100071"));
  431. Assert.AreEqual(true, response.P_39_交易响应码 == "00000");
  432. Assert.AreEqual(true, string.IsNullOrEmpty(response.P_40_错误信息));
  433. //00 39 00 03 33 39 99 02 00 08 00 00 00 04 02 00 00 00 2A 02 00 08 00 00 00 04 02 00 00 11 99 88 00 11 31 32 E6 B5 99 42 44 39 31 32 33 34 35 30 30 33 34 33 33 32 33 32 33 38 38
  434. //parser.Deserialize()
  435. }
  436. [TestMethod]
  437. public void PaymentResponse_Deserialize_FailResponse_TestMethod3()
  438. {
  439. var parser = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  440. var raw = ("0029" +
  441. "6000030000" +
  442. "0210" +
  443. "20 00 00 00 03 000000" +
  444. "020032" +
  445. "3030303031" +
  446. "0016c3bbd3d0bdbbd2d7d0e8d2aacadcc0ed").ToBytes();
  447. var response = parser.Deserialize(raw) as PaymentResponse;
  448. Assert.AreEqual(true, response.TPDU == "6000030000");
  449. Assert.AreEqual(true, response.MessageTypeIdentifier == 210);
  450. Assert.AreEqual(true, response.P_3_处理码 == 020032);
  451. Assert.AreEqual(true, response.P_39_交易响应码 == "00001");
  452. Assert.AreEqual(true, response.P_40_错误信息 == Encoding.GetEncoding("GB2312").GetString("c3bbd3d0bdbbd2d7d0e8d2aacadcc0ed".ToBytes()));
  453. //00 39 00 03 33 39 99 02 00 08 00 00 00 04 02 00 00 00 2A 02 00 08 00 00 00 04 02 00 00 11 99 88 00 11 31 32 E6 B5 99 42 44 39 31 32 33 34 35 30 30 33 34 33 33 32 33 32 33 38 38
  454. //parser.Deserialize()
  455. }
  456. [TestMethod]
  457. public void PaymentResponse_Deserialize_TestMethod9()
  458. {
  459. var parser = new ShellChina_EPS_Project_CarPlatePay_EpsClient_App.Parser();
  460. // from real system log.
  461. var raw = ("003360000300000210" + "3a10400002000000" + "02003200000000007800000000007820181123211110313030303731000000" + "00033130393030303030").ToBytes();
  462. var response = parser.Deserialize(raw) as PaymentResponse;
  463. Assert.AreEqual(true, response.TPDU == "6000030000");
  464. Assert.AreEqual(true, response.MessageTypeIdentifier == 210);
  465. Assert.AreEqual(true, response.P_3_处理码 == 020032);
  466. Assert.AreEqual(true, response.P_4_交易金额 == 0.78M);
  467. Assert.AreEqual(true, response.P_5_实付金额 == 0.78M);
  468. Assert.AreEqual(true, response.P_7_交易时间.Equals(new System.DateTime(2018, 11, 23, 21, 11, 10)));
  469. Assert.AreEqual(true, response.P_12_交易流水号.StartsWith("100071"));
  470. Assert.AreEqual(true, response.P_18_商户订单号 == "109");
  471. Assert.AreEqual(true, response.P_39_交易响应码 == "00000");
  472. Assert.AreEqual(true, string.IsNullOrEmpty(response.P_40_错误信息));
  473. //00 39 00 03 33 39 99 02 00 08 00 00 00 04 02 00 00 00 2A 02 00 08 00 00 00 04 02 00 00 11 99 88 00 11 31 32 E6 B5 99 42 44 39 31 32 33 34 35 30 30 33 34 33 33 32 33 32 33 38 38
  474. //parser.Deserialize()
  475. }
  476. }
  477. }