1
0

ResponseBuilder.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. import id.co.hanoman.mbplugin.codex.Codex;
  2. import id.co.hanoman.mbplugin.codex.CodexContext;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.io.IOException;
  6. import java.net.URISyntaxException;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.Paths;
  10. public class ResponseBuilder {
  11. public static Map<String, Object> createIsoResponse(Map<String, Object> receivedMessage, String code) {
  12. Map<String, Object> responseMessage = new HashMap<>(receivedMessage);
  13. String messageType = (String) receivedMessage.get("messageType");
  14. // Handle network management messages dulu (0800/0810)
  15. if ("0800".equals(messageType) || "0810".equals(messageType)) {
  16. responseMessage.put("responseCode", "00"); // selalu accept
  17. responseMessage.put("messageType", messageType.equals("0800") ? "0810" : messageType);
  18. return responseMessage;
  19. }
  20. String kodePemda = (String) receivedMessage.get("kodePemda");
  21. String processingCode = (String) receivedMessage.get("processingCode");
  22. String reservedPrivate3 = (String) receivedMessage.get("reservedPrivate3");
  23. String fromAccount = (String) receivedMessage.get("fromAccount");
  24. String toAccount = (String) receivedMessage.get("toAccount");
  25. if (messageType != null && messageType.matches("\\d{4}")) {
  26. try {
  27. int messageTypeNumber = Integer.parseInt(messageType);
  28. messageTypeNumber += 10;
  29. responseMessage.put("messageType", String.format("%04d", messageTypeNumber));
  30. } catch (NumberFormatException e) {
  31. responseMessage.put("messageType", messageType);
  32. }
  33. }
  34. responseMessage.put("responseCode", "00");
  35. String additionalDataPrivate = (String) receivedMessage.get("additionalDataPrivate");
  36. switch (code) {
  37. // pln nontaglist payment
  38. case "0200.18.305111":
  39. responseMessage.put("additionalDataPrivate", "30511100000000212001703515404122025085706RAMBAT SUGIYONO 00000122310000000000450022001733982271055179 0000000001");
  40. responseMessage.put("reservedPrivate2", "MIGRASI PRABAYAR 212001703515404DES25RAMBAT SUGIYONO 2120003540341.218.600 22001733982271055179 4.500 1.223.100 21200 ");
  41. responseMessage.put("reservedForPrivateUse2", "Informasi Hubungi Call Center 123 Atau Hub PLN Terdekat :");
  42. break;
  43. // pln postpaid payment
  44. case "0200.18.301211":
  45. responseMessage.put("additionalDataPrivate", "3012110535851014157 04122025091631DENY FIRMANSYAH 00000018932100000000300022001745735141055392 1 1457351492");
  46. responseMessage.put("reservedForPrivateUse1", "20251204091613000010550003392514");
  47. responseMessage.put("reservedPrivate2", "535851014157DES25 DENY FIRMANSYAH 00025077-00025211R1M /000000900 0 18932122001745735141055392 3000 192321 0 53585 ");
  48. responseMessage.put("reservedForPrivateUse2", "Informasi Hubungi Call Center 123 Atau hubungi PLN Terdekat");
  49. break;
  50. // pln prepaid payment
  51. case "0200.18.301422":
  52. responseMessage.put("reservedForPrivateUse2", "BANK BTN\nInformasi Hubungi Call Center 123 Atau hubungi PLN Terdekat\nDownload PLN Mobile");
  53. responseMessage.put("reservedPrivate2", "32115720610 3.500JUNAIDI 0,00R1 /000002200 0,002BBT1742510913077976 18.182,00 0,00 203.500 181.818,00 125,920905033469869694456 1.444,14613112 ");
  54. responseMessage.put("additionalDataPrivate", "3014220000000001310111420930 10082025234420JUNAIDI 0000002000000000000035002BBT1742510913077976 131011142093 ");
  55. break;
  56. // pln manual advice case 1
  57. case "0220.18.301422":
  58. responseMessage.put("reservedForPrivateUse2", "BANK BTN\nInformasi Hubungi Call Center 123 Atau hubungi PLN Terdekat\nDownload PLN Mobile");
  59. responseMessage.put("reservedPrivate2", "32115720610 3.500JUNAIDI 0,00R1 /000002200 0,002BBT1742510913077976 18.182,00 0,00 203.500 181.818,00 125,920905033469869694456 1.444,14613112 ");
  60. responseMessage.put("additionalDataPrivate", "3014220"+additionalDataPrivate.substring(7,27)+"0 10082025234420JUNAIDI 0000002000000000000035002BBT1742510913077976 131011142093 ");
  61. responseMessage.put("messageType", "0230");
  62. String s1 = additionalDataPrivate.substring(7, 27);
  63. String s2 = "00000000056223261220";
  64. boolean stringsMatch = s1.equals(s2);
  65. if (!stringsMatch) {
  66. responseMessage.put("responseCode", "68");
  67. }
  68. break;
  69. // pln manual advice case 2
  70. case "0221.18.301422":
  71. responseMessage.put("reservedForPrivateUse2", "BANK BTN\nInformasi Hubungi Call Center 123 Atau hubungi PLN Terdekat\nDownload PLN Mobile");
  72. responseMessage.put("reservedPrivate2", "32115720610 3.500JUNAIDI 0,00R1 /000002200 0,002BBT1742510913077976 18.182,00 0,00 203.500 181.818,00 125,920905033469869694456 1.444,14613112 ");
  73. if(additionalDataPrivate.substring(7,27).equals("00000000056223261222")) {
  74. try {
  75. // 1. Get the exact path of the running JAR file
  76. Path jarLocation = Paths.get(ResponseBuilder.class.getProtectionDomain().getCodeSource().getLocation().toURI());
  77. // 2. Get the folder that contains the JAR
  78. Path jarDirectory = jarLocation.getParent();
  79. // 3. Resolve (attach) "done.txt" to that specific folder
  80. Path filePath = jarDirectory.resolve("done.txt");
  81. // --- The rest of your logic remains exactly the same ---
  82. if (Files.notExists(filePath)) {
  83. Files.createFile(filePath);
  84. responseMessage.put("responseCode", "68");
  85. } else {
  86. Files.delete(filePath);
  87. }
  88. } catch (IOException | URISyntaxException e) {
  89. System.err.println("An error occurred: " + e.getMessage());
  90. e.printStackTrace();
  91. responseMessage.put("responseCode", "68");
  92. }
  93. } else if(!additionalDataPrivate.substring(7,27).equals("00000000056223261221")) {
  94. responseMessage.put("responseCode", "68");
  95. }
  96. responseMessage.put("additionalDataPrivate", "3014220"+additionalDataPrivate.substring(7,27)+"0 10082025234420JUNAIDI 0000002000000000000035002BBT1742510913077976 131011142093 ");
  97. responseMessage.put("messageType", "0230");
  98. break;
  99. // pln nontaglist inquiry
  100. case "0200.38.305111":
  101. responseMessage.put("additionalDataPrivate", "30511100000000212001703515404122025085638RAMBAT SUGIYONO 000001223100000000004500 1339822779");
  102. responseMessage.put("reservedPrivate2", "000000005622331DEC16PENYAMBUNGAN BARU NAMA PELANGGAN DUMMY 999999999999 138.000 5.000 143.000");
  103. responseMessage.put("reservedForPrivateUse1", "52021014609012345678901234567890");
  104. break;
  105. // pln postpaid inquiry
  106. case "0200.38.301211":
  107. responseMessage.put("reservedForPrivateUse1", "20230511205447204973203818072193");
  108. responseMessage.put("additionalDataPrivate", "3012110535851014157 04122025091613DENY FIRMANSYAH 000000189321000000003000 1 1457351492");
  109. responseMessage.put("reservedPrivate2", "562232628760 NAMA PELANGGAN DUMMY 1 DEC16 137000 2000 139000");
  110. break;
  111. // pln prepaid inquiry
  112. case "0200.38.301422":
  113. responseMessage.put("additionalDataPrivate", "3014220000000000562232628760 10082025234421PT.GRAHA DUTA PUTRA JAYA 00000000000000000000350020250810234421000030770008977481545301379058 ");
  114. responseMessage.put("reservedPrivate2", "12233368101 PLGN LPB 12233368101 R3 /000002200 0000000000000000000000000000000000");
  115. responseMessage.put("reservedForPrivateUse1", "20230118144146186738850085697412");
  116. break;
  117. // pgn payment
  118. case "0200.18.212":
  119. responseMessage.put("receivingInstitutionIdentificationCode", "20000000001");
  120. responseMessage.put("reservedPrivate1", "BTN4PRO100000000000");
  121. // responseMessage.put("amountTransaction", "181000");
  122. // responseMessage.put("processingCode", "1880113");
  123. // responseMessage.put("transmissionDateTime", "0414092338");
  124. // responseMessage.put("systemsTraceAuditNumber", "015713");
  125. // responseMessage.put("timeLocalTransaction", "162338");
  126. // responseMessage.put("dateLocalTransaction", "0414");
  127. // responseMessage.put("dateSettlement", "0415");
  128. // responseMessage.put("dateCapture", "0414");
  129. // responseMessage.put("merchantType", "6014");
  130. // responseMessage.put("acquiringInstitutionIdentificationCode", "000200");
  131. // responseMessage.put("retrievalReferenceNumber", "ESB607509073");
  132. // responseMessage.put("responseCode", "00");
  133. // responseMessage.put("cardAcceptorIdentificationCode", "000000013000008");
  134. // responseMessage.put("additionalDataPrivate", "210200040793 73053 000001880113");
  135. // responseMessage.put("currencyCodeTransaction", "360");
  136. // responseMessage.put("reservedPrivate3", "212");
  137. // responseMessage.put("receivingInstitutionIdentificationCode", "20000000001");
  138. break;
  139. case "0200.38.212":
  140. responseMessage.put("additionalDataPrivate", "210200040793 73053 0000018801130000000363MARTHENMINGGU RT20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010326 1");
  141. break;
  142. case "0200.312000":
  143. if (fromAccount != null) {
  144. if (fromAccount.equals("19901510004062")) {
  145. responseMessage.put("responseCode", "53");
  146. responseMessage.put("reasonCode", "");
  147. } else {
  148. responseMessage.put("additionalDataPrivate", "20230608BTANIDJA5100000028020230608BTANIDJA510O020000028020230608BTANIDJA51000000280NASABAH R286263 01010103 SVGS20230613");
  149. responseMessage.put("processingCode", "312010");
  150. responseMessage.put("reasonCode", "U000");
  151. }
  152. }
  153. if (toAccount != null) {
  154. if (toAccount.equals("19901510004062")) {
  155. responseMessage.put("responseCode", "53");
  156. responseMessage.put("reasonCode", "");
  157. } else {
  158. responseMessage.put("additionalDataPrivate", "20230608BTANIDJA5100000028020230608BTANIDJA510O020000028020230608BTANIDJA51000000280NASABAH R286263 01010103 SVGS20230613");
  159. responseMessage.put("processingCode", "312010");
  160. responseMessage.put("reasonCode", "U000");
  161. }
  162. }
  163. break;
  164. case "0200.031000":
  165. break;
  166. case "0400.031000":
  167. responseMessage.put("additionalDataPrivate", " MASJID JAMI AL MUNAWWAROH GRAHN");
  168. break;
  169. case "0200.010010":
  170. break;
  171. case "0400.010010":
  172. break;
  173. case "0200.041000":
  174. break;
  175. case "0400.041000":
  176. responseMessage.put("responseCode", "97");
  177. responseMessage.put("additionalResponseData", "000195953600000271093600");
  178. responseMessage.put("additionalDataPrivate", "HARIS NUGROHO SETIAWAN ");
  179. break;
  180. case "0200.38.090001":
  181. responseMessage.put("responseCode", "00");
  182. responseMessage.put("reservedPrivate1", "0401000899880DEETJE MARENTEK 23042026-22052026000000276400");
  183. break;
  184. case "0200.311000.001001BIF":
  185. break;
  186. case "0200.312000.001001BIF":
  187. // responseMessage.put("responseCode", "88");
  188. responseMessage.put("additionalDataPrivate", "20240223FASTIDJA5104908809820240223BTANIDJA510O020003363720240223BTANIDJA51000033637ASIA KARYA MANDIRI CV 9120007592095 02 0291 CACC20240223");
  189. break;
  190. case "0200.321000": // inq proxy bifast
  191. break;
  192. case "0200.322000": // inq proxy bifast
  193. responseMessage.put("additionalDataPrivate", "20211229FASTIDJA6100024111220211229BTANIDJA6108000817620211229BTANIDJAO80008176016285696212272 BTANIDJABMRIIDJA0000181345 THERESIA ");
  194. break;
  195. case "0200.471000": // Posting BiFast Credit Transfer
  196. break;
  197. case "0200.472000": // Posting BiFast Credit Transfer
  198. // responseMessage.put("responseCode", "99");
  199. responseMessage.put("additionalDataPrivate", "20260409FASTIDJA0105640492220260409BTANIDJA0100007400420260409BTANIDJA010O020007400420260409FASTIDJA01056404711MIRA ERIANCE 20260409");
  200. responseMessage.put("reasonCode", "U000");
  201. break;
  202. case "0200.480000": // linking inq bin
  203. responseMessage.put("additionalDataPrivate", "BIN00001BIN00002BIN00003BIN00004BIN00005BIN00006BIN00007BIN00008BIN00009BIN00010BIN00011BIN00012BIN00013BIN00014BIN00015BIN00016BIN00017BIN00018BIN00019BIN00020BIN00021BIN00022BIN00023BIN00024BIN00025BIN00026BIN00027BIN00028BIN00029BIN00030BIN00031BIN00032BIN00033BIN00034BIN00035BIN00036BIN00037BIN00038BIN00039BIN00040BIN00041BIN00042BIN00043BIN00044BIN00045BIN00046BIN00047BIN00048BIN00049BIN00050BIN00051BIN00052BIN00053BIN00054BIN00055BIN00056BIN00057BIN00058BIN00059BIN00060BIN00061BIN00062BIN00063BIN00064BIN00065BIN00066BIN00067BIN00068BIN00069BIN00070BIN00071BIN00072BIN00073BIN00074BIN00075BIN00076BIN00077BIN00078BIN00079BIN00080BIN00081BIN00082BIN00083BIN00084BIN00085BIN00086BIN00087BIN00088BIN00089BIN00090BIN00091BIN00092BIN00093BIN00094BIN00095BIN00096BIN00097BIN00098BIN00099BIN00100");
  204. break;
  205. case "0200.490000":
  206. responseMessage.put("additionalDataPrivate", "BIN00001BIN00002BIN00003BIN00004BIN00005BIN00006BIN00007BIN00008BIN00009BIN00010BIN00011BIN00012BIN00013BIN00014BIN00015BIN00016BIN00017BIN00018BIN00019BIN00020BIN00021BIN00022BIN00023BIN00024BIN00025BIN00026BIN00027BIN00028BIN00029BIN00030BIN00031BIN00032BIN00033BIN00034BIN00035BIN00036BIN00037BIN00038BIN00039BIN00040BIN00041BIN00042BIN00043BIN00044BIN00045BIN00046BIN00047BIN00048BIN00049BIN00050BIN00051BIN00052BIN00053BIN00054BIN00055BIN00056BIN00057BIN00058BIN00059BIN00060BIN00061BIN00062BIN00063BIN00064BIN00065BIN00066BIN00067BIN00068BIN00069BIN00070BIN00071BIN00072BIN00073BIN00074BIN00075BIN00076BIN00077BIN00078BIN00079BIN00080BIN00081BIN00082BIN00083BIN00084BIN00085BIN00086BIN00087BIN00088BIN00089BIN00090BIN00091BIN00092BIN00093BIN00094BIN00095BIN00096BIN00097BIN00098BIN00099BIN00100");
  207. responseMessage.put("responseCode", "90");
  208. break;
  209. case "0200.701000":
  210. break;
  211. case "0200.702000":
  212. responseMessage.put("additionalResponseData", "4000000990280000000309780");
  213. responseMessage.put("issuerTraceId", "& 0000200372! Q500350 150119184140ATMDATM EDC ALTO SA Ex 000000023000000000000000150119183729ATMDATM Link Acq SA Ex 000000200000000000000000150119183758ATMDATM SA Withdrawal 000000350000000000000000160119161444ATMDATM SA Link Wdr 000000007500000000000000160119161444ATMDATM SA Link Wdr 000000100000000000000000");
  214. break;
  215. // case "0800.000101": // key exchange
  216. // responseMessage.put("additionalDataPrivate", "11BA2E4B71D512AD62265BFA86D2243E");
  217. // break;
  218. case "0200.38.1041": // inq fortuna pdam
  219. responseMessage.put("responseCode", "13");
  220. responseMessage.put("amountTransaction", "11084800");
  221. responseMessage.put("additionalDataPrivate", "0101005015 MISLAHUDDIN A JL. M. YAMIN - NN 02120230500000000000000000398560002500000000136-00000024220230600000000000000000209920002500000000160-00000013");
  222. break;
  223. case "0200.10.1371": // inq PDAM PADANG
  224. responseMessage.put("amountTransaction", "11084800");
  225. responseMessage.put("reservedPrivate3", "01122025000000226137");
  226. responseMessage.put("additionalDataPrivate", "137115502025");
  227. responseMessage.put("reservedPrivate2", "SUWANDI (MBR5-U) Komp. Griya Anak Air Permai Blok F No. 11 082017000000000000000000000000000000036500");
  228. break;
  229. case "0200.20.1371": // pay PDAM PADANG
  230. responseMessage.put("amountTransaction", "11084800");
  231. responseMessage.put("reservedPrivate2", "20035648YEASY DARMAYANTI. SE. MSI KOMP. CEMARA II BLOK EE.2/1 2CTNA12242317 1220250000000055350000000055610000000000102026-01-0514:45:45K300000000000000000000000000000011700000000000000000000000750000000002443700000013193713000008 K3-2555188");
  232. responseMessage.put("additionalDataPrivate", "137120035648122025000000000000000000000000000000131937");
  233. break;
  234. case "0200.471010"://bif
  235. responseMessage.put("responseCode", "30");
  236. responseMessage.put("reasonCode", "0041");
  237. break;
  238. case "0200.38.612": //inq spp 0019
  239. responseMessage.put("additionalDataPrivate", "6101240635289125126A1B8F4SITI MAULIDINAH APRI;C3+TG+D 100001299975001012020");
  240. break;
  241. case "0200.18.612": //payment spp 0019
  242. responseMessage.put("additionalDataPrivate", "6101 25126A1B8F4000000000000");
  243. break;
  244. case "0200.3":
  245. if (kodePemda != null) {
  246. if(kodePemda.equals("4005")) {
  247. // inq pemko 4005
  248. responseMessage.put("reservedPrivate1", "3278007007021208302017");
  249. responseMessage.put("reservedPrivate2", "3278007007021208302017ADI AHMAD SAEPULLOH KP BOJONG SALAM SUKAMAJU BARU TAPOS JAWA BARAT 00000000006000000000003620170831000000137050000000002741000000139791");
  250. responseMessage.put("reservedPrivate3", "214");
  251. } else if(kodePemda.equals("PAD")) {
  252. // inq pemko 4003
  253. responseMessage.put("reservedPrivate1", "398092017");
  254. responseMessage.put("reservedPrivate2", "2.000299.01.004 MISO SARI RASO MISO SARI RASO JL. DAMAR NO. 1 525000 ");
  255. responseMessage.put("reservedForIsoUse3", "C09+925");
  256. } else if(kodePemda.equals("0196")) {
  257. // inq pemko 4008
  258. responseMessage.put("amountTransaction", "203500");
  259. responseMessage.put("reservedPrivate2", "3280710004016061602017AYI RIYADHI, M.SI, DRS MELONG ASRI REGENCY MELONG CIMAHI SELATAN JAWA BARAT 00000000011500000000008020170929000000203500000000000000000000203500");
  260. }
  261. } else if(processingCode.equals("341019")) {
  262. // inq pemko 4014
  263. responseMessage.put("reservedPrivate2", "3271040002004049402017AMIR BALFAS, IR JL CEMPAKA PUTIH TENGAH SINDANG BARANG BOGOR BARAT JAWA BARAT 00000000011800000000007220170929000000386688000000000000000000386688");
  264. }
  265. break;
  266. case "0200.5":
  267. if (kodePemda != null) {
  268. if(kodePemda.equals("4005")) {
  269. // pay pemko 4005
  270. responseMessage.put("additionalDataNational", "2211030250120002");
  271. responseMessage.put("additionalDataPrivate", "81170919080023");
  272. responseMessage.put("currencyCodeTransaction", "360");
  273. responseMessage.put("transactionType", "PAY");
  274. responseMessage.put("kodePemda", "4005");
  275. responseMessage.put("reservedPrivate1", "3278007007021208302017");
  276. responseMessage.put("reservedPrivate2", "3278007007021208302017ADI AHMAD SAEPULLOH 000000139791");
  277. responseMessage.put("reservedPrivate3", "214");
  278. } else if(kodePemda.equals("PAD")) {
  279. // pay pemko 4003
  280. responseMessage.put("additionalDataPrivate", "0009257328");
  281. } else if(kodePemda.equals("0196")) {
  282. // pay pemko 4008
  283. responseMessage.put("additionalDataNational", "010197712992");
  284. }
  285. } else if(reservedPrivate3 != null) {
  286. if(reservedPrivate3.equals("4000")) {
  287. // pay pemko 4013
  288. responseMessage.put("additionalDataNational", "010143704282");
  289. }
  290. } else if(processingCode.equals("541019")) {
  291. // pay pemko 4014
  292. responseMessage.put("processingCode", processingCode);
  293. }
  294. break;
  295. case "0200.50.4000":
  296. // pemko pay 4013
  297. responseMessage.put("additionalDataPrivate", "3175031003018407902017PT. TMJ/ DAFICKA PRAC 0000002991469117392102410198");
  298. break;
  299. case "0200.402000":
  300. //bi-fast
  301. responseMessage.put("additionalDataPrivate", "20260224FASTIDJA5100131725420250920FASTIDJA5108047598520250920BTANIDJA510O020005093120250920BTANIDJA01050001076BXXXXXXXXXXXXXXXXXXX 01010300 20260224");
  302. responseMessage.put("reasonCode", "U000");
  303. break;
  304. case "0200.311000":
  305. responseMessage.put("additionalDataPrivate", "20251112FASTIDJA5108746434520251112BTANIDJA510O995000000820251112BTANIDJA51050000008BXXXXXXXXXXXXXXXXXXX 01010300 SVGS20251112");
  306. responseMessage.put("processingCode", "311010");
  307. responseMessage.put("reasonCode", "U000");
  308. }
  309. return responseMessage;
  310. }
  311. public static byte[] encodeMessage(Map<String, Object> message, Codex codex) throws Exception {
  312. CodexContext cc = new CodexContext();
  313. codex.encode(cc, message);
  314. return cc.toByteArray();
  315. }
  316. }