美文网首页
ISO8583.lua

ISO8583.lua

作者: peterSZW | 来源:发表于2018-04-24 11:36 被阅读0次
    -- ISO8583 parser  
    -- Author: Dale Steele
    require 'amd'
    
    -- script name --
    function script_name()
      print('ISO8583Parser')
      return "ISO8583Parser"
    end
    
    function string.tohex(str)
        return (str:gsub('.', function (c)
            return string.format('%02X', string.byte(c))
        end))
    end
    
    function MTI_Name(wrkstr)
      operName = ''
      if wrkstr == "0100" then operName = "Authorization Request - "..wrkstr    
      elseif wrkstr == "0110" then operName = "Request Response - "..wrkstr   
      elseif wrkstr == "0120" then operName = "Authorization Advice - "..wrkstr
      elseif wrkstr == "0121" then operName = "Authorization Advice Repeat - "..wrkstr
      elseif wrkstr == "0130" then operName = "Issuer Response to Authorization Advice - "..wrkstr
      elseif wrkstr == "0200" then operName = "Acquirer Financial Request - "..wrkstr
      elseif wrkstr == "0210" then operName = "Issuer Response to Financial Request - "..wrkstr
      elseif wrkstr == "0220" then operName = "Acquirer Financial Advice - "..wrkstr
      elseif wrkstr == "0221" then operName = "Acquirer Financial Advice repeat - "..wrkstr
      elseif wrkstr == "0230" then operName = "Issuer Response to Financial Advice - "..wrkstr
      elseif wrkstr == "0320" then operName = "Batch Upload - "..wrkstr
      elseif wrkstr == "0330" then operName = "Batch Upload Response - "..wrkstr
      elseif wrkstr == "0400" then operName = "Acquirer Reversal Request - "..wrkstr
      elseif wrkstr == "0420" then operName = "Acquirer Reversal Advice - "..wrkstr
      elseif wrkstr == "0421" then operName = "Acquirer Reversal Advice Repeat Message - "..wrkstr
      elseif wrkstr == "0500" then operName = "Batch Settlement request - "..wrkstr
      elseif wrkstr == "0510" then operName = "Batch Settlement response - "..wrkstr
      elseif wrkstr == "0800" then operName = "Network Management Request - "..wrkstr
      elseif wrkstr == "0810" then operName = "Network Management Response - "..wrkstr
      elseif wrkstr == "0820" then operName = "Keychange - "..wrkstr
      else operName = "??????? - " ..wrkstr
      end
    end
    
    function Log_It(logstr)
      if LogFlag > 0 then 
        print('Logging: '..logstr)
      end
    end
    
    local function unpack_number(pstr, offset, size)
      local number = 0
      local max = size - 1
      
      for i = 0, max do
        number = number * 256
        number = (number + pstr:byte(offset + i))
      end
      return number
    end
    
    local function unpack_length(pstr, offset, size)
      local number = 0
      local offset2 = offset + size -1
      local max = size - 1
      for i = 0, max do
        number = number * 256
        number = (number + pstr:byte(offset2 - i))
      end
      return number
    end
    
    function case_2(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_3(pstr, offset)
      Log_It('03 -- Procesing Code: ' .. string.sub(pstr, offset, offset+5))
      offSet = offSet + 6
      return 0
    end
    
    function case_4(pstr, offset)
      Log_It('04 -- Amount - Transaction: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12
      return 0
    end
    
    function case_5(pstr, offset)
      Log_It('05 -- Amount - Settlement: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12
      return 0
    end
    
    function case_6(pstr, offset)
      Log_It('06 -- Amount - Cardholder Billing: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12
      return 0
    end
    
    function case_7(pstr, offset)
      Log_It('07 -- Transmission date& time: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10
      return 0
    end
    function case_8(pstr, offset)
      Log_It('08 -- Amount - Cardholder Billing Fee: ' .. string.sub(pstr, offset, offset+7))
      offSet = offSet + 8
      return 0
    end
    
    function case_9(pstr, offset)
      Log_It('09 -- Conversion rate, Settlement: ' .. string.sub(pstr, offset, offset+7))
      offSet = offSet + 8
      return 0
    end
    
    function case_10(pstr, offset)
      Log_It('10 -- Conversion rate, cardholder billing: ' .. string.sub(pstr, offset, offset+7))
      offSet = offSet + 8
      return 0
    end
    
    function case_11(pstr, offset)
      Log_It('11 -- System rtrace audit number: ' .. string.sub(pstr, offset, offset+5))
      offSet = offSet + 6
      return 0
    end
    
    function case_12(pstr, offset)
      Log_It('12 -- Time, local transcaton (hhmmss) ' .. string.sub(pstr, offset, offset+5))
      offSet = offSet + 6
      return 0
    end
    
    function case_13(pstr, offset)
      Log_It('13 -- Date, local transaction (MMDD): ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_14(pstr, offset)
      Log_It('14 -- Date, expiration: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_15(pstr, offset)
      Log_It('15 -- Date, settlement: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_16(pstr, offset)
      Log_It('16 -- Date, conversion: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_17(pstr, offset)
      Log_It('17 -- Date, capute: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_18(pstr, offset)
      Log_It('18 -- Merchant type: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_19(pstr, offset)
      Log_It('19 -- Aquiring Country code: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_20(pstr, offset)
      Log_It('20 -- PAN extended country code: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_21(pstr, offset)
      Log_It('21 -- Forwarding institution country code: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_22(pstr, offset)
      Log_It('22 -- Point of service entry mode: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_23(pstr, offset)
      Log_It('23 -- Application PAN sequence number: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_24(pstr, offset)
      Log_It('24 -- Function Code : ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_25(pstr, offset)
      Log_It('25 -- Point of service condition code: ' .. string.sub(pstr, offset, offset+1))
      offSet = offSet + 2
      return 0
    end
    
    function case_26(pstr, offset)
      Log_It('26 -- Point of service capture code: ' .. string.sub(pstr, offset, offset+1))
      offSet = offSet + 2
      return 0
    end
    
    function case_27(pstr, offset)
      Log_It('27 -- Authorizing ID responce length: ' .. string.sub(pstr, offset, offset))
      offSet = offSet + 1
      return 0
    end
    
    function case_28(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('28 -- Len: '.. x ..' Amount Transaction fee: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_29(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('29 -- Len: '.. x ..' Amount Settlement fee: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_30(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('30 -- Len: '.. x ..' Amount Transaction Processing fee: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_31(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('31 -- Len: '.. x ..' Amount settlement Processing fee: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_32(pstr, offset) 
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('32 -- Len: '.. x ..' Acquiring Institution ID code: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    function case_33(pstr, offset) 
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('33 -- Len: '.. x ..' Forwarding Institution ID code: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_34(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('34 -- Len: '.. x ..' Primary account number extended: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_35(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('35 -- Len: '.. x ..' Track 2 Data: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_36(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('36 -- Len: '.. x ..' Track 3 Data: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_37(pstr, offset)
      Log_It('37 -- Retrieval reference number: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12
      return 0
    end
    
    function case_38(pstr, offset)
      Log_It('38 -- Authorization identification responce: ' .. string.sub(pstr, offset, offset+5))
      offSet = offSet + 6 
      return 0
    end
    
    function case_39(pstr, offset)
      Log_It('39 -- Response Code: ' .. string.sub(pstr, offset, offset+1))
      retCode = pstr:sub(offset, offset+1)
      offSet = offSet + 2
      return 0
    end
    
    function case_40(pstr, offset)
      Log_It('40 -- Service Restriction code: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_41(pstr, offset)
      Log_It('41 -- Card acceptor terminal ID: ' .. string.sub(pstr, offset, offset+7))
      offSet = offSet + 8
      return 0
    end
    
    function case_42(pstr, offset) 
      Log_It('42 -- Card acceptor ID code: ' .. string.sub(pstr, offset, offset+14))
      uname = pstr:sub(offset, offset+14)
      uname = uname:gsub("%s+", "")
      Log_It('---uname:'.. uname);
      offSet = offSet + 15
      return 0
    end
    function case_43(pstr, offset)
      Log_It('43 -- Card acceptor name/location: ' .. string.sub(pstr, offset, offset+39))
      offSet = offSet + 40
      return 0
    end
    
    function case_44(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('44 -- Len: '.. x ..' Additional responce data: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_45(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('45 -- Len: '.. x ..' Track 1 Data: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_46(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('46 -- Len: '.. x ..' Additional Data ISO: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_47(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('47 -- Len: '.. x ..' Additional Data national: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_48(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('48 -- Len: '.. x ..' Additional Data private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_49(pstr, offset)
      Log_It('49 -- Currency code transcation: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3 
      return 0
    end
    
    function case_50(pstr, offset)
      Log_It('50 -- Currency code settlement: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_51(pstr, offset)  
      Log_It('51 -- Currency code cardholder: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3 
      return 0
    end
    
    function case_52(pstr, offset)
      Log_It('52 hex-:'.. string.tohex(string.sub(pstr, offset, offset+15))) 
      Log_It('52 -- Personal ID number data: ' .. string.sub(pstr, offset, offset+15))
      offSet = offSet + 16
      return 0
    end
    
    function case_53(pstr, offset)
      Log_It('53 -- Security related control infomation: ' .. string.sub(pstr, offset, offset+15))
      offSet = offSet + 14; 
      return 0
    end
    
    function case_54(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('54 -- Len: '.. x ..' Additional amounts: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_55(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('55 -- Len: '.. x ..' Reserved ISO: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_56(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('56 -- Len: '.. x ..' Reserved ISO: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_57(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('57 -- Len: '.. x ..' Reserved national: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_58(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('58 -- Len: '.. x ..' Reserved national: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_59(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('59 -- Len: '.. x ..' Reserved national: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_60(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('60 -- Len: '.. x ..' Reserved national: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_61(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('61 -- Len: '.. x ..' Reserved private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_62(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('62 -- Len: '.. x ..' Reserved private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_63(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('63 -- Len: '.. x ..' Reserved private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_64(psrt, offset)
       Log_It('64 -- MAC: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
      end
    
    function case_65(pstr, offset)
      Log_It('65 -- Bitmap: ' .. string.sub(pstr, offset, offset))
      offSet = offSet + 1
      return 0
    end
    
    function case_66(pstr, offset)
      Log_It('66 -- Settlement Code: ' .. string.sub(pstr, offset, offset))
      offSet = offSet + 1
      return 0
    end
    
    function case_67(pstr, offset)
      Log_It('67 -- Extend payment Code: ' .. string.sub(pstr, offset, offset+1))
      offSet = offSet + 2
      return 0
    end
    
    function case_68(pstr, offset)
      Log_It('68 -- receiving country Code: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_69(pstr, offset)
      Log_It('69 -- settlement country Code: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_70(pstr, offset)
      Log_It('70 -- network management information code: ' .. string.sub(pstr, offset, offset+2))
      offSet = offSet + 3
      return 0
    end
    
    function case_71(pstr, offset)
      Log_It('71 -- Message number: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_72(pstr, offset)
      Log_It('72 -- message number last: ' .. string.sub(pstr, offset, offset+3))
      offSet = offSet + 4
      return 0
    end
    
    function case_73(pstr, offset)
      Log_It('73 -- Date: ' .. string.sub(pstr, offset, offset+5))
      offSet = offSet + 6
      return 0
    end
    
    function case_74(pstr, offset)
      Log_It('74 -- Credits number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10
      return 0
    end
    
    function case_75(pstr, offset)
      Log_It('75 -- Credits recersal number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10
      return 0
    end
    
    function case_76(pstr, offset)
      Log_It('76 -- Debits number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10 
      return 0
    end
    
    function case_77(pstr, offset)
      Log_It('77 -- Debits reveral number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10 
      return 0
    end
    
    function case_78(pstr, offset)
      Log_It('78 -- Transfer Number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10 
      return 0
    end
    
    function case_79(pstr, offset)
      Log_It('78 -- Transfer Reversal Number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10 
      return 0
    end
    
    function case_80(pstr, offset)
      Log_It('80 -- Inquiries Number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10 
      return 0
    end
    
    function case_81(pstr, offset)
      Log_It('81 -- Authorizations Number: ' .. string.sub(pstr, offset, offset+9))
      offSet = offSet + 10 
      return 0
    end
    
    function case_82(pstr, offset)
      Log_It('82 -- Credit Proessing fee amount: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12 
      return 0
    end
    
    function case_83(pstr, offset)
      Log_It('83 -- Credit transaction fee amount: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12
      return 0
    end
    
    function case_84(pstr, offset)
      Log_It('84 -- Debits Proessing fee amount: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12
      return 0
    end
    
    function case_85(pstr, offset)
      Log_It('85 -- Debits Transaction fee amount: ' .. string.sub(pstr, offset, offset+11))
      offSet = offSet + 12
      return 0
    end
    
    function case_86(pstr, offset)
      Log_It('86 -- Credits  amount: ' .. string.sub(pstr, offset, offset+15))
      offSet = offSet + 16
      return 0
    end
    
    function case_87(pstr, offset)
      Log_It('87 -- Credits reversal amount: ' .. string.sub(pstr, offset, offset+15))
      offSet = offSet + 16
      return 0
    end
    
    function case_88(pstr, offset)
      Log_It('88 -- Debits  amount: ' .. string.sub(pstr, offset, offset+15))
      offSet = offSet + 16
      return 0
    end
    
    function case_89(pstr, offset)
      Log_It('89 -- Debits reversal amount: ' .. string.sub(pstr, offset, offset+15))
      offSet = offSet + 16
      return 0
    end
    
    function case_90(pstr, offset)
      Log_It('90 -- Original data elements ' .. string.sub(pstr, offset, offset+41))
      offSet = offSet + 42
      return 0
    end
    
    function case_91(pstr, offset)
      Log_It('91 -- File update code: ' .. string.sub(pstr, offset, offset))
      offSet = offSet + 1
      return 0
    end
    
    function case_92(pstr, offset)
      Log_It('92 -- File security code: ' .. string.sub(pstr, offset, offset+1))
      offSet = offSet + 2
      return 0
    end
    function case_93(pstr, offset)
      Log_It('93 -- Responce indicator: ' .. string.sub(pstr, offset, offset+4))
      offSet = offSet + 5
      return 0
    end
    
    function case_94(pstr, offset)
      Log_It('94 -- Service indicator: ' .. string.sub(pstr, offset, offset+6))
      offSet = offSet + 7
      return 0
    end
    
    function case_95(pstr, offset)
      Log_It('95 -- replacement amounts: ' .. string.sub(pstr, offset, offset+41))
      offSet = offSet + 42
      return 0
    end
    
    function case_96(pstr, offset)
      Log_It('------ special check data --------')
      Log_It('96 -- Message security code: ' .. string.sub(pstr, offset, offset+7))
      offSet = offSet + 8
      return 0
    end
    
    function case_97(pstr, offset)
      Log_It('97 -- Amount net settlement: ' .. string.sub(pstr, offset, offset+15))
      offSet = offSet + 16
      return 0
    end
    
    function case_98(pstr, offset)
      Log_It('98 -- Payee: ' .. string.sub(pstr, offset, offset+24))
      offSet = offSet + 25
      return 0
    end
    
    function case_99(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('99 -- Len: '.. x ..' Settlement ID code: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_100(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('100 -- Len: '.. x ..' Receiving ID code: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_101(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('101 -- Len: '.. x ..' File name: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_102(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('102 -- Len: '.. x ..' Account ID 1 '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_103(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('103 -- Len: '.. x ..' Account ID 2 '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_104(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('104 -- Len: '.. x ..' Transaction Description '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_105(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('105 -- Len: '.. x ..'Reserved for ISO '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_106(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('106 -- Len: '.. x ..'Reserved for ISO '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
    end
    
    function case_107(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('107 -- Len: '.. x ..'Reserved for ISO '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_108(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('108 -- Len: '.. x ..'Reserved for ISO '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_109(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('109 -- Len: '.. x ..'Reserved for ISO '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_110(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('110-- Len: '.. x ..'Reserved for ISO '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_111(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('111 -- Len: '.. x ..'Reserved for ISO '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_112(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('112 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_113(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('113 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_114(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('114 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_115(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('115 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_116(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('116 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_117(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('117 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_118(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('118 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_119(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('119 -- Len: '.. x ..'Reserved for national '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_120(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('120 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_121(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('121 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_122(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('122 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_123(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('123 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_124(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('124 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_125(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('125 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_126(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('126 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_127(pstr, offset)
      local x = tonumber(string.sub(pstr, offset, offset+1))
      Log_It('127 -- Len: '.. x ..'Reserved for private: '..string.sub(pstr, offset+2, offset+1+x))
      offSet = offSet + 2 + x
      return 0
    end
    
    function case_128(pstr, offset)
      Log_It('------ special check data --------')
      Log_It('128 -- Message auth code: ' .. string.sub(pstr, offset, offset+7))
      offSet = offSet + 8
      return 0
    end
    
    function findfunction(x)
      assert(type(x) == "string")
      local f=_G
      for v in x:gmatch("[^%.]+") do
        if type(f) ~= "table" then
           Log_It('---nil one')
           return nil, "looking for '"..v.."' expected table, not "..type(f)
        end
        f=f[v]
      end
      if type(f) == "function" then
        return f
      else
        Log_It('---nil TWO')
        return nil, "expected function, not "..type(f)
      end
    end
    
      LogFlag = 1
      hexChar = 0
      hexLen = 0
      hexStr = ''
      bitStr = ''
      bitLen = 0
      offSet = 0
      uname = ''
      IDcode = ''
      operName = ''
      MTIstr  = ''
      ClientType = ''
      ClientTypeStr= ''
      MsgClass = ''
      retCode = ''
      
     function parse_request(payload, stats)
    
      Log_It('Parse Request')
      if payload:len() == 0 then
        return 1
      end
      
      uname = ''
      ClientType = ''
      ClientTypeStr = ''
      MsgClass = ''
      MsgClassStr = ''
      bitStr = ''
      pgmStr =''
      xstr = ''
      
      Log_It('------------------------------------------------------------------------------------------------------') 
      Log_It('FF------:'.. string.tohex(string.sub(payload, 1, 1)))
      Log_It('Len hex-:'.. string.tohex(string.sub(payload, 2, 3))) 
      Log_It('Len-----:'.. unpack_length(payload, 2, 2) )
      MTIstr = string.sub(payload, 4, 7)
      MTI_Name(MTIstr)
    
      Log_It('MTI-----:'..operName) 
      stats:setOperationName(operName, operName:len())
      
      ClientType =  string.sub(payload, 7, 7)
      
      if ClientType == "0" then ClientTypeStr = "Acquirer"   
        elseif ClientType == "1" then ClientTypeStr = "Acquirer Repeat"   
        elseif ClientType == "2" then ClientTypeStr = "Issuer" 
        elseif ClientType == "3" then ClientTypeStr = "Issuer Repeat"  
        elseif ClientType == "4" then ClientTypeStr = "Other"    
        elseif ClientType == "5" then ClientTypeStr = "Other Repeat"  
        else ClientTypeStr = "Unknown"  
      end
      stats:setBrowserOsHardware(ClientTypeStr, "", "", "")
      
      
      MsgClass   =  string.sub(payload, 5, 5)
      if MsgClass == "1" then MsgClassStr = "Authorization Message"  
        elseif MsgClass == "2" then MsgClassStr = "Financial Message"  
        elseif MsgClass == "3" then MsgClassStr = "File Actions Message"   
        elseif MsgClass == "4" then MsgClassStr = "Reversal and Chargeback Message"   
        elseif MsgClass == "5" then MsgClassStr = "Reconciliation Message"   
        elseif MsgClass == "6" then MsgClassStr = "Administrative Message"
        elseif MsgClass == "7" then MsgClassStr = "Fee Collection Message"
        elseif MsgClass == "8" then MsgClassStr = "Network Management Message" 
        elseif MsgClass == "9" then MsgClassStr = "Reserved By ISO" 
        else MsgClassStr = "Unknown"
      end
     stats:setParameter(4, MsgClassStr) 
      
      Log_It('PL len--:'.. payload:len()) 
      Log_It('payload-:'.. string.tohex(payload:sub(0, payload:len())))
    
      if payload:byte(8) < 128 then
        hexStr = string.tohex(string.sub(payload, 8, 15))
        hexLen = 16  
        bitLen = 64 
        offSet = 16
        Log_It ('8 byte mask: '.. hexStr) 
      else 
        hexStr = string.tohex(string.sub(payload, 8, 23))
        hexLen = 32
        bitLen = 128
        offSet = 24
        Log_It ('16 byte mask: '.. hexStr)
      end
     
       for j = 1, hexLen do
        hexChar = hexStr:byte(j) 
             
        if hexChar == 48 then  bitStr = bitStr .. "0000"
        elseif hexChar == 49 then bitStr = bitStr .. "0001"
        elseif hexChar == 50 then bitStr = bitStr .. "0010"
        elseif hexChar == 51 then bitStr = bitStr .. "0011"
        elseif hexChar == 52 then bitStr = bitStr .. "0100"
        elseif hexChar == 53 then bitStr = bitStr .. "0101"
        elseif hexChar == 54 then bitStr = bitStr .. "0110"
        elseif hexChar == 55 then bitStr = bitStr .. "0111"
        elseif hexChar == 56 then bitStr = bitStr .. "1000"
        elseif hexChar == 57 then bitStr = bitStr .. "1001"
        elseif hexChar == 65 then bitStr = bitStr .. "1010"
        elseif hexChar == 66 then bitStr = bitStr .. "1011"
        elseif hexChar == 67 then bitStr = bitStr .. "1100"
        elseif hexChar == 68 then bitStr = bitStr .. "1101"
        elseif hexChar == 69 then bitStr = bitStr .. "1110"
        else                    bitStr = bitStr .. "1111"
        end
      end
      
      Log_It('BitStr: '.. bitStr)
        
      for j=1, bitLen do
        hexChar = bitStr:byte(j) 
        if hexChar == 49 then
          if j > 1 then 
            xstr = xstr .. ", "
          end
          xstr = xstr .. j     
        end     
      end  
     
      Log_It('codes to process: '.. xstr) 
     
      if MTIstr == "0800" or MTIstr == "0810" then
        bitLen = 75
      else 
        bitLen = 49
      end
      
      for j=2, bitLen do
        hexChar = bitStr:byte(j) 
        if hexChar == 49 then
          pgmStr = 'case_' .. j
          fun = findfunction(pgmStr)
          if (fun == nil) then
            Log_It('error no function for:'..j)
          else
            fun(payload, offSet)
          end
        end     
      end  
      Log_It('---uname:'.. uname);
      stats:setUserName(uname)
      Log_It('------------------------------------------------------------------------------------------------------') 
      return 0
    end
    
     
    function parse_response(payload, stats)
      Log_It('Parse_Response')
      if payload:len() == 0 then
        return 1
      end
    
      uname = ''
      bitStr = ''
      pgmStr =''
      xstr = '' 
      retCode = ''
      
      Log_It('######################################################################################################') 
      Log_It('FF------:'.. string.tohex(string.sub(payload, 1, 1)))
      Log_It('Len hex-:'.. string.tohex(string.sub(payload, 2, 3))) 
      Log_It('Len-----:'.. unpack_length(payload, 2, 2) )
      MTIstr = string.sub(payload, 4, 7)
      Log_It('MTI-----:'.. MTIstr)
      MTI_Name(MTIstr)
      Log_It('MTI-----:'..operName)
      
      Log_It('PL len--:'.. payload:len()) 
      Log_It('payload-:'.. string.tohex(payload:sub(0, payload:len())))
    
      if payload:byte(8) < 128 then
        hexStr = string.tohex(string.sub(payload, 8, 15))
        hexLen = 16  
        bitLen = 64 
        offSet = 16
        Log_It ('8 byte mask: '.. hexStr) 
      else 
        hexStr = string.tohex(string.sub(payload, 8, 23))
        hexLen = 32
        bitLen = 128
        offSet = 24
        Log_It ('16 byte mask: '.. hexStr)
      end
     
      for j = 1, hexLen do
        hexChar = hexStr:byte(j) 
             
        if hexChar == 48 then  bitStr = bitStr .. "0000"
        elseif hexChar == 49 then bitStr = bitStr .. "0001"
        elseif hexChar == 50 then bitStr = bitStr .. "0010"
        elseif hexChar == 51 then bitStr = bitStr .. "0011"
        elseif hexChar == 52 then bitStr = bitStr .. "0100"
        elseif hexChar == 53 then bitStr = bitStr .. "0101"
        elseif hexChar == 54 then bitStr = bitStr .. "0110"
        elseif hexChar == 55 then bitStr = bitStr .. "0111"
        elseif hexChar == 56 then bitStr = bitStr .. "1000"
        elseif hexChar == 57 then bitStr = bitStr .. "1001"
        elseif hexChar == 65 then bitStr = bitStr .. "1010"
        elseif hexChar == 66 then bitStr = bitStr .. "1011"
        elseif hexChar == 67 then bitStr = bitStr .. "1100"
        elseif hexChar == 68 then bitStr = bitStr .. "1101"
        elseif hexChar == 69 then bitStr = bitStr .. "1110"
        else                    bitStr = bitStr .. "1111"
        end
      end
      
      Log_It('BitStr: '.. bitStr)
      xstr = ''
      
      for j=1, bitLen do
        hexChar = bitStr:byte(j) 
        if hexChar == 49 then
          if j > 1 then 
            xstr = xstr .. ", "
          end
          xstr = xstr .. j     
        end     
      end  
     
      Log_It('codes to process: '.. xstr) 
    
      pgmStr ="" 
      
      if MTIstr == "0800" or MTIstr == "0810" then
        bitLen = 75
      else 
        bitLen = 49
      end
      
      for j=2, bitLen do
        hexChar = bitStr:byte(j) 
        if hexChar == 49 then
          pgmStr = 'case_' .. j
          fun = findfunction(pgmStr)
          if (fun == nil) then
            Log_It('error no function for:'..j)
          else
            fun(payload, offSet)
          end
        end     
      end  
        
      Log_It('---uname:'.. uname);
      stats:setUserName(uname)
      if retCode ~= "00" then
        err = 'Error Return Code (' ..retCode.. ')'
        stats:setAttribute(0, err)
      end
      
      Log_It('######################################################################################################') 
      return 0
    end
    
    local the_module = {}
    the_module.parse_request = parse_request
    the_module.parse_response = parse_response
    return the_module
    

    相关文章

      网友评论

          本文标题:ISO8583.lua

          本文链接:https://www.haomeiwen.com/subject/qtodlftx.html