summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan>2004-09-03 23:37:13 +0000
committerivan <ivan>2004-09-03 23:37:13 +0000
commit915bd5ff8cf528b62d79d045c436d17d92be4d89 (patch)
tree5e95dc9d5d86557cb7727e917949b3219bf080d6
inital checking of OpenECHO module
-rw-r--r--Changes3
-rw-r--r--MANIFEST17
-rw-r--r--Makefile710
-rw-r--r--Makefile.PL24
-rw-r--r--OpenECHO.pm673
-rw-r--r--README20
-rw-r--r--TODO15
-rw-r--r--blib/arch/auto/Business/OnlinePayment/OpenECHO/.exists0
-rw-r--r--blib/lib/Business/OnlinePayment/.exists0
-rw-r--r--blib/lib/Business/OnlinePayment/OpenECHO.pm673
-rw-r--r--blib/lib/auto/Business/OnlinePayment/OpenECHO/.exists0
-rw-r--r--blib/man3/.exists0
-rw-r--r--generror/ISPGuide-Codes.asp1249
-rw-r--r--generror/errortable.html961
-rwxr-xr-xgenerror/errortable2hash.pl88
-rw-r--r--pm_to_blib0
-rw-r--r--t/bad_card.t40
-rw-r--r--t/bop.t5
-rw-r--r--t/capture.t63
-rw-r--r--t/check.t32
-rw-r--r--t/credit_card.t41
-rw-r--r--t/crypt_bad_card.t45
-rw-r--r--t/crypt_credit_card.t45
-rw-r--r--t/crypt_load.t13
-rw-r--r--t/load.t12
25 files changed, 4729 insertions, 0 deletions
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..f6c339e
--- /dev/null
+++ b/Changes
@@ -0,0 +1,3 @@
+0.01 Wed Aug 25 23:27:55 2004
+ - original version; created by ivan 1.0
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..8202973
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,17 @@
+OpenECHO.pm
+Changes
+MANIFEST
+Makefile.PL
+README
+t/load.t
+t/crypt_load.t
+t/credit_card.t
+t/crypt_credit_card.t
+t/check.t
+t/bop.t
+t/capture.t
+t/bad_card.t
+t/crypt_bad_card.t
+generror/ISPGuide-Codes.asp
+generror/errortable.html
+generror/errortable2hash.pl
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2af9e8d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,710 @@
+# This Makefile is for the Business::OnlinePayment::OpenECHO extension to perl.
+#
+# It was generated automatically by MakeMaker version
+# 6.17 (Revision: 1.133) from the contents of
+# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
+#
+# ANY CHANGES MADE HERE WILL BE LOST!
+#
+# MakeMaker ARGV: ()
+#
+# MakeMaker Parameters:
+
+# AUTHOR => q[Ivan Kohler <ivan-openecho@420.am>]
+# NAME => q[Business::OnlinePayment::OpenECHO]
+# PREREQ_PM => { Tie::IxHash=>q[0], URI::Escape=>q[0], Business::OnlinePayment=>q[0] }
+# VERSION_FROM => q[OpenECHO.pm]
+
+# --- MakeMaker post_initialize section:
+
+
+# --- MakeMaker const_config section:
+
+# These definitions are from config.sh (via /usr/lib/perl/5.8/Config.pm)
+
+# They may have been overridden via Makefile.PL or on the command line
+AR = ar
+CC = cc
+CCCDLFLAGS = -fPIC
+CCDLFLAGS = -Wl,-E
+DLEXT = so
+DLSRC = dl_dlopen.xs
+LD = cc
+LDDLFLAGS = -shared -L/usr/local/lib
+LDFLAGS = -L/usr/local/lib
+LIBC = /lib/libc-2.3.2.so
+LIB_EXT = .a
+OBJ_EXT = .o
+OSNAME = linux
+OSVERS = 2.4.26-ti1211
+RANLIB = :
+SITELIBEXP = /usr/local/share/perl/5.8.4
+SITEARCHEXP = /usr/local/lib/perl/5.8.4
+SO = so
+EXE_EXT =
+FULL_AR = /usr/bin/ar
+VENDORARCHEXP = /usr/lib/perl5
+VENDORLIBEXP = /usr/share/perl5
+
+
+# --- MakeMaker constants section:
+AR_STATIC_ARGS = cr
+DIRFILESEP = /
+NAME = Business::OnlinePayment::OpenECHO
+NAME_SYM = Business_OnlinePayment_OpenECHO
+VERSION = 0.01
+VERSION_MACRO = VERSION
+VERSION_SYM = 0_01
+DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\"
+XS_VERSION = 0.01
+XS_VERSION_MACRO = XS_VERSION
+XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"
+INST_ARCHLIB = blib/arch
+INST_SCRIPT = blib/script
+INST_BIN = blib/bin
+INST_LIB = blib/lib
+INST_MAN1DIR = blib/man1
+INST_MAN3DIR = blib/man3
+MAN1EXT = 1p
+MAN3EXT = 3pm
+INSTALLDIRS = site
+DESTDIR =
+PREFIX = /usr
+PERLPREFIX = $(PREFIX)
+SITEPREFIX = $(PREFIX)/local
+VENDORPREFIX = $(PREFIX)
+INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.8
+DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
+INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.8.4
+DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
+INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5
+DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
+INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.8
+DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
+INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.8.4
+DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
+INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5
+DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
+INSTALLBIN = $(PERLPREFIX)/bin
+DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
+INSTALLSITEBIN = $(SITEPREFIX)/bin
+DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
+INSTALLVENDORBIN = $(VENDORPREFIX)/bin
+DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
+INSTALLSCRIPT = $(PERLPREFIX)/bin
+DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
+INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1
+DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
+INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1
+DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
+INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1
+DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
+INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3
+DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
+INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3
+DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
+INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3
+DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
+PERL_LIB = /usr/share/perl/5.8
+PERL_ARCHLIB = /usr/lib/perl/5.8
+LIBPERL_A = libperl.a
+FIRST_MAKEFILE = Makefile
+MAKEFILE_OLD = $(FIRST_MAKEFILE).old
+MAKE_APERL_FILE = $(FIRST_MAKEFILE).aperl
+PERLMAINCC = $(CC)
+PERL_INC = /usr/lib/perl/5.8/CORE
+PERL = /usr/bin/perl
+FULLPERL = /usr/bin/perl
+ABSPERL = $(PERL)
+PERLRUN = $(PERL)
+FULLPERLRUN = $(FULLPERL)
+ABSPERLRUN = $(ABSPERL)
+PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
+FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
+ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
+PERL_CORE = 0
+PERM_RW = 644
+PERM_RWX = 755
+
+MAKEMAKER = /usr/share/perl/5.8/ExtUtils/MakeMaker.pm
+MM_VERSION = 6.17
+MM_REVISION = 1.133
+
+# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
+# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
+# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
+# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
+FULLEXT = Business/OnlinePayment/OpenECHO
+BASEEXT = OpenECHO
+PARENT_NAME = Business::OnlinePayment
+DLBASE = $(BASEEXT)
+VERSION_FROM = OpenECHO.pm
+OBJECT =
+LDFROM = $(OBJECT)
+LINKTYPE = dynamic
+
+# Handy lists of source code files:
+XS_FILES =
+C_FILES =
+O_FILES =
+H_FILES =
+MAN1PODS =
+MAN3PODS = OpenECHO.pm
+
+# Where is the Config information that we are using/depend on
+CONFIGDEP = $(PERL_ARCHLIB)$(DIRFILESEP)Config.pm $(PERL_INC)$(DIRFILESEP)config.h
+
+# Where to build things
+INST_LIBDIR = $(INST_LIB)/Business/OnlinePayment
+INST_ARCHLIBDIR = $(INST_ARCHLIB)/Business/OnlinePayment
+
+INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
+INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
+
+INST_STATIC =
+INST_DYNAMIC =
+INST_BOOT =
+
+# Extra linker info
+EXPORT_LIST =
+PERL_ARCHIVE =
+PERL_ARCHIVE_AFTER =
+
+
+TO_INST_PM = OpenECHO.pm
+
+PM_TO_BLIB = OpenECHO.pm \
+ $(INST_LIB)/Business/OnlinePayment/OpenECHO.pm
+
+
+# --- MakeMaker platform_constants section:
+MM_Unix_VERSION = 1.42
+PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
+
+
+# --- MakeMaker tool_autosplit section:
+# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
+AUTOSPLITFILE = $(PERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)'
+
+
+
+# --- MakeMaker tool_xsubpp section:
+
+
+# --- MakeMaker tools_other section:
+SHELL = /bin/sh
+CHMOD = chmod
+CP = cp
+MV = mv
+NOOP = $(SHELL) -c true
+NOECHO = @
+RM_F = rm -f
+RM_RF = rm -rf
+TEST_F = test -f
+TOUCH = touch
+UMASK_NULL = umask 0
+DEV_NULL = > /dev/null 2>&1
+MKPATH = $(PERLRUN) "-MExtUtils::Command" -e mkpath
+EQUALIZE_TIMESTAMP = $(PERLRUN) "-MExtUtils::Command" -e eqtime
+ECHO = echo
+ECHO_N = echo -n
+UNINST = 0
+VERBINST = 0
+MOD_INSTALL = $(PERLRUN) -MExtUtils::Install -e 'install({@ARGV}, '\''$(VERBINST)'\'', 0, '\''$(UNINST)'\'');'
+DOC_INSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e perllocal_install
+UNINSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e uninstall
+WARN_IF_OLD_PACKLIST = $(PERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist
+
+
+# --- MakeMaker makemakerdflt section:
+makemakerdflt: all
+ $(NOECHO) $(NOOP)
+
+
+# --- MakeMaker dist section:
+TAR = tar
+TARFLAGS = cvf
+ZIP = zip
+ZIPFLAGS = -r
+COMPRESS = gzip --best
+SUFFIX = .gz
+SHAR = shar
+PREOP = $(NOECHO) $(NOOP)
+POSTOP = $(NOECHO) $(NOOP)
+TO_UNIX = $(NOECHO) $(NOOP)
+CI = ci -u
+RCS_LABEL = rcs -Nv$(VERSION_SYM): -q
+DIST_CP = best
+DIST_DEFAULT = tardist
+DISTNAME = Business-OnlinePayment-OpenECHO
+DISTVNAME = Business-OnlinePayment-OpenECHO-0.01
+
+
+# --- MakeMaker macro section:
+
+
+# --- MakeMaker depend section:
+
+
+# --- MakeMaker cflags section:
+
+
+# --- MakeMaker const_loadlibs section:
+
+
+# --- MakeMaker const_cccmd section:
+
+
+# --- MakeMaker post_constants section:
+
+
+# --- MakeMaker pasthru section:
+
+PASTHRU = LIB="$(LIB)"\
+ LIBPERL_A="$(LIBPERL_A)"\
+ LINKTYPE="$(LINKTYPE)"\
+ PREFIX="$(PREFIX)"\
+ OPTIMIZE="$(OPTIMIZE)"\
+ PASTHRU_DEFINE="$(PASTHRU_DEFINE)"\
+ PASTHRU_INC="$(PASTHRU_INC)"
+
+
+# --- MakeMaker special_targets section:
+.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+
+.PHONY: all config static dynamic test linkext manifest
+
+
+
+# --- MakeMaker c_o section:
+
+
+# --- MakeMaker xs_c section:
+
+
+# --- MakeMaker xs_o section:
+
+
+# --- MakeMaker top_targets section:
+all :: pure_all manifypods
+ $(NOECHO) $(NOOP)
+
+
+pure_all :: config pm_to_blib subdirs linkext
+ $(NOECHO) $(NOOP)
+
+subdirs :: $(MYEXTLIB)
+ $(NOECHO) $(NOOP)
+
+config :: $(FIRST_MAKEFILE) $(INST_LIBDIR)$(DIRFILESEP).exists
+ $(NOECHO) $(NOOP)
+
+config :: $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
+ $(NOECHO) $(NOOP)
+
+config :: $(INST_AUTODIR)$(DIRFILESEP).exists
+ $(NOECHO) $(NOOP)
+
+$(INST_AUTODIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
+ $(NOECHO) $(MKPATH) $(INST_AUTODIR)
+ $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_AUTODIR)/.exists
+
+ -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_AUTODIR)
+
+$(INST_LIBDIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
+ $(NOECHO) $(MKPATH) $(INST_LIBDIR)
+ $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_LIBDIR)/.exists
+
+ -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_LIBDIR)
+
+$(INST_ARCHAUTODIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
+ $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
+ $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_ARCHAUTODIR)/.exists
+
+ -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_ARCHAUTODIR)
+
+config :: $(INST_MAN3DIR)$(DIRFILESEP).exists
+ $(NOECHO) $(NOOP)
+
+
+$(INST_MAN3DIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
+ $(NOECHO) $(MKPATH) $(INST_MAN3DIR)
+ $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_MAN3DIR)/.exists
+
+ -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_MAN3DIR)
+
+help:
+ perldoc ExtUtils::MakeMaker
+
+
+# --- MakeMaker linkext section:
+
+linkext :: $(LINKTYPE)
+ $(NOECHO) $(NOOP)
+
+
+# --- MakeMaker dlsyms section:
+
+
+# --- MakeMaker dynamic section:
+
+dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
+ $(NOECHO) $(NOOP)
+
+
+# --- MakeMaker dynamic_bs section:
+
+BOOTSTRAP =
+
+
+# --- MakeMaker dynamic_lib section:
+
+
+# --- MakeMaker static section:
+
+## $(INST_PM) has been moved to the all: target.
+## It remains here for awhile to allow for old usage: "make static"
+static :: $(FIRST_MAKEFILE) $(INST_STATIC)
+ $(NOECHO) $(NOOP)
+
+
+# --- MakeMaker static_lib section:
+
+
+# --- MakeMaker manifypods section:
+
+POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
+POD2MAN = $(POD2MAN_EXE)
+
+
+manifypods : pure_all \
+ OpenECHO.pm \
+ OpenECHO.pm
+ $(NOECHO) $(POD2MAN) --section=3pm --perm_rw=$(PERM_RW)\
+ OpenECHO.pm $(INST_MAN3DIR)/Business::OnlinePayment::OpenECHO.$(MAN3EXT)
+
+
+
+
+# --- MakeMaker processPL section:
+
+
+# --- MakeMaker installbin section:
+
+
+# --- MakeMaker subdirs section:
+
+# none
+
+# --- MakeMaker clean_subdirs section:
+clean_subdirs :
+ $(NOECHO) $(NOOP)
+
+
+# --- MakeMaker clean section:
+
+# Delete temporary files but do not touch installed files. We don't delete
+# the Makefile here so a later make realclean still has a makefile to use.
+
+clean :: clean_subdirs
+ -$(RM_RF) ./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all $(INST_ARCHAUTODIR)/extralibs.ld perlmain.c tmon.out mon.out so_locations pm_to_blib *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def lib$(BASEEXT).def $(BASEEXT).exp $(BASEEXT).x core core.*perl.*.? *perl.core core.[0-9] core.[0-9][0-9] core.[0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9][0-9]
+ -$(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
+
+
+# --- MakeMaker realclean_subdirs section:
+realclean_subdirs :
+ $(NOECHO) $(NOOP)
+
+
+# --- MakeMaker realclean section:
+
+# Delete temporary files (via clean) and also delete installed files
+realclean purge :: clean realclean_subdirs
+ $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
+ $(RM_RF) $(DISTVNAME)
+ $(RM_F) $(INST_LIB)/Business/OnlinePayment/OpenECHO.pm $(MAKEFILE_OLD) $(FIRST_MAKEFILE)
+
+
+# --- MakeMaker metafile section:
+metafile :
+ $(NOECHO) $(ECHO) '# http://module-build.sourceforge.net/META-spec.html' > META.yml
+ $(NOECHO) $(ECHO) '#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#' >> META.yml
+ $(NOECHO) $(ECHO) 'name: Business-OnlinePayment-OpenECHO' >> META.yml
+ $(NOECHO) $(ECHO) 'version: 0.01' >> META.yml
+ $(NOECHO) $(ECHO) 'version_from: OpenECHO.pm' >> META.yml
+ $(NOECHO) $(ECHO) 'installdirs: site' >> META.yml
+ $(NOECHO) $(ECHO) 'requires:' >> META.yml
+ $(NOECHO) $(ECHO) ' Business::OnlinePayment: 0' >> META.yml
+ $(NOECHO) $(ECHO) ' Tie::IxHash: 0' >> META.yml
+ $(NOECHO) $(ECHO) ' URI::Escape: 0' >> META.yml
+ $(NOECHO) $(ECHO) '' >> META.yml
+ $(NOECHO) $(ECHO) 'distribution_type: module' >> META.yml
+ $(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.17' >> META.yml
+
+
+# --- MakeMaker metafile_addtomanifest section:
+metafile_addtomanifest:
+ $(NOECHO) $(PERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
+ -e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"'
+
+
+# --- MakeMaker dist_basics section:
+distclean :: realclean distcheck
+ $(NOECHO) $(NOOP)
+
+distcheck :
+ $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
+
+skipcheck :
+ $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
+
+manifest :
+ $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
+
+veryclean : realclean
+ $(RM_F) *~ *.orig */*~ */*.orig
+
+
+
+# --- MakeMaker dist_core section:
+
+dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
+ $(NOECHO) $(PERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \
+ -e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';'
+
+tardist : $(DISTVNAME).tar$(SUFFIX)
+ $(NOECHO) $(NOOP)
+
+uutardist : $(DISTVNAME).tar$(SUFFIX)
+ uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
+
+$(DISTVNAME).tar$(SUFFIX) : distdir
+ $(PREOP)
+ $(TO_UNIX)
+ $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
+ $(RM_RF) $(DISTVNAME)
+ $(COMPRESS) $(DISTVNAME).tar
+ $(POSTOP)
+
+zipdist : $(DISTVNAME).zip
+ $(NOECHO) $(NOOP)
+
+$(DISTVNAME).zip : distdir
+ $(PREOP)
+ $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+
+shdist : distdir
+ $(PREOP)
+ $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
+ $(RM_RF) $(DISTVNAME)
+ $(POSTOP)
+
+
+# --- MakeMaker distdir section:
+distdir : metafile metafile_addtomanifest
+ $(RM_RF) $(DISTVNAME)
+ $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
+ -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
+
+
+
+# --- MakeMaker dist_test section:
+
+disttest : distdir
+ cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL
+ cd $(DISTVNAME) && $(MAKE) $(PASTHRU)
+ cd $(DISTVNAME) && $(MAKE) test $(PASTHRU)
+
+
+# --- MakeMaker dist_ci section:
+
+ci :
+ $(PERLRUN) "-MExtUtils::Manifest=maniread" \
+ -e "@all = keys %{ maniread() };" \
+ -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \
+ -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
+
+
+# --- MakeMaker install section:
+
+install :: all pure_install doc_install
+
+install_perl :: all pure_perl_install doc_perl_install
+
+install_site :: all pure_site_install doc_site_install
+
+install_vendor :: all pure_vendor_install doc_vendor_install
+
+pure_install :: pure_$(INSTALLDIRS)_install
+
+doc_install :: doc_$(INSTALLDIRS)_install
+
+pure__install : pure_site_install
+ $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+doc__install : doc_site_install
+ $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+pure_perl_install ::
+ $(NOECHO) umask 022; $(MOD_INSTALL) \
+ $(INST_LIB) $(DESTINSTALLPRIVLIB) \
+ $(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
+ $(INST_BIN) $(DESTINSTALLBIN) \
+ $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+ $(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \
+ $(INST_MAN3DIR) $(DESTINSTALLMAN3DIR)
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+ $(SITEARCHEXP)/auto/$(FULLEXT)
+
+
+pure_site_install ::
+ $(NOECHO) umask 02; $(MOD_INSTALL) \
+ read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \
+ write $(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \
+ $(INST_LIB) $(DESTINSTALLSITELIB) \
+ $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
+ $(INST_BIN) $(DESTINSTALLSITEBIN) \
+ $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+ $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
+ $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
+ $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+ $(PERL_ARCHLIB)/auto/$(FULLEXT)
+
+pure_vendor_install ::
+ $(NOECHO) umask 022; $(MOD_INSTALL) \
+ $(INST_LIB) $(DESTINSTALLVENDORLIB) \
+ $(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
+ $(INST_BIN) $(DESTINSTALLVENDORBIN) \
+ $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+ $(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
+ $(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
+
+doc_perl_install ::
+
+doc_site_install ::
+ $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLSITEARCH)/perllocal.pod
+ -$(NOECHO) umask 02; $(MKPATH) $(DESTINSTALLSITEARCH)
+ -$(NOECHO) umask 02; $(DOC_INSTALL) \
+ "Module" "$(NAME)" \
+ "installed into" "$(INSTALLSITELIB)" \
+ LINKTYPE "$(LINKTYPE)" \
+ VERSION "$(VERSION)" \
+ EXE_FILES "$(EXE_FILES)" \
+ >> $(DESTINSTALLSITEARCH)/perllocal.pod
+
+doc_vendor_install ::
+
+
+uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+
+uninstall_from_perldirs ::
+ $(NOECHO) $(UNINSTALL) $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist
+
+uninstall_from_sitedirs ::
+ $(NOECHO) $(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist
+
+uninstall_from_vendordirs ::
+ $(NOECHO) $(UNINSTALL) $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist
+
+
+# --- MakeMaker force section:
+# Phony target to force checking subdirectories.
+FORCE:
+ $(NOECHO) $(NOOP)
+
+
+# --- MakeMaker perldepend section:
+
+
+# --- MakeMaker makefile section:
+
+# We take a very conservative approach here, but it's worth it.
+# We move Makefile to Makefile.old here to avoid gnu make looping.
+$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
+ $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
+ $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
+ $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+ $(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
+ -$(MAKE) -f $(MAKEFILE_OLD) clean $(DEV_NULL) || $(NOOP)
+ $(PERLRUN) Makefile.PL
+ $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
+ $(NOECHO) $(ECHO) "==> Please rerun the make command. <=="
+ false
+
+
+
+# --- MakeMaker staticmake section:
+
+# --- MakeMaker makeaperl section ---
+MAP_TARGET = perl
+FULLPERL = /usr/bin/perl
+
+$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
+ $(MAKE) -f $(MAKE_APERL_FILE) $@
+
+$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
+ $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
+ $(NOECHO) $(PERLRUNINST) \
+ Makefile.PL DIR= \
+ MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+ MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=
+
+
+# --- MakeMaker test section:
+
+TEST_VERBOSE=0
+TEST_TYPE=test_$(LINKTYPE)
+TEST_FILE = test.pl
+TEST_FILES = t/*.t
+TESTDB_SW = -d
+
+testdb :: testdb_$(LINKTYPE)
+
+test :: $(TEST_TYPE)
+
+test_dynamic :: pure_all
+ PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)
+
+testdb_dynamic :: pure_all
+ PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE)
+
+test_ : test_dynamic
+
+test_static :: test_dynamic
+testdb_static :: testdb_dynamic
+
+
+# --- MakeMaker ppd section:
+# Creates a PPD (Perl Package Description) for a binary distribution.
+ppd:
+ $(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="0,01,0,0">' > $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <TITLE>$(DISTNAME)</TITLE>' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <ABSTRACT></ABSTRACT>' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <AUTHOR>Ivan Kohler &lt;ivan-openecho@420.am&gt;</AUTHOR>' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <IMPLEMENTATION>' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="Business-OnlinePayment" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="Tie-IxHash" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="URI-Escape" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <OS NAME="$(OSNAME)" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <ARCHITECTURE NAME="i386-linux-thread-multi" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <CODEBASE HREF="" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' </IMPLEMENTATION>' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) '</SOFTPKG>' >> $(DISTNAME).ppd
+
+
+# --- MakeMaker pm_to_blib section:
+
+pm_to_blib: $(TO_INST_PM)
+ $(NOECHO) $(PERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', '\''$(PM_FILTER)'\'')'\
+ OpenECHO.pm $(INST_LIB)/Business/OnlinePayment/OpenECHO.pm
+ $(NOECHO) $(TOUCH) $@
+
+# --- MakeMaker selfdocument section:
+
+
+# --- MakeMaker postamble section:
+
+
+# End.
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..a9667c6
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,24 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+ 'NAME' => 'Business::OnlinePayment::OpenECHO',
+ 'VERSION_FROM' => 'OpenECHO.pm', # finds $VERSION
+ 'AUTHOR' => 'Ivan Kohler <ivan-openecho@420.am>', #really just
+ #the maintainer
+ #'NORECURS' => 1, # dont descend into subdirectories
+ 'PREREQ_PM' => {
+ 'Business::OnlinePayment' => 0,
+
+ # for HTTPS (maybe it should be a separate dist?)
+ 'URI::Escape' => 0,
+ 'Tie::IxHash' => 0,
+
+ # 'Net::SSLeay' => 0,
+ # or 'Crypt::SSLeay' => 0,
+ # 'URI
+
+ },
+ #'dist' => {CI => 'ci -l'},
+);
+
diff --git a/OpenECHO.pm b/OpenECHO.pm
new file mode 100644
index 0000000..595c38d
--- /dev/null
+++ b/OpenECHO.pm
@@ -0,0 +1,673 @@
+##############################################################################
+# Business::OnlinePayment::OpenECHO
+#
+# Credit card transactions via SSL to
+# Electronic Clearing House (ECHO) Systems
+#
+# Refer to ECHO's documentation for more info
+# http://www.openecho.com/echo_gateway_guide.html
+#
+# AUTHOR
+# Michael Lehmkuhl <michael@electricpulp.com>
+#
+# SPECIAL THANKS
+# Jim Darden <jdarden@echo-inc.com>
+# Dan Browning <db@kavod.com>
+#
+# BUSINESS::ONLINEPAYMENT IMPLEMENTATION
+# Ivan Kohler <ivan-openecho@420.am>
+#
+# VERSION HISTORY
+# + v1.2 08/17/2002 Corrected problem with certain string comparisons.
+# + v1.3 08/23/2002 Converted Interchange GlobalSub to Vend::Payment module.
+# + v1.3.1 11/12/2002 Updated the OpenECHO_example.perl test script.
+# + v1.4 11/18/2002 Corrected a problem with Submit method when using LWP.
+# + v1.5 03/29/2003 Updated for additional status and avs_result codes.
+# + v1.6 08/26/2003 Cleaned up code (salim qadeer sqadeer@echo-inc.com)
+# + v1.6.2 09/23/2003 Added DH transaction type (salim qadeer sqadeer@echo-inc.com)
+# --------
+# + v0.1 08/26/2004 Business::OnlinePayment implementation
+#
+# Copyright (C) 2002 Electric Pulp. <info@electricpulp.com>
+# Copyright (C) 2004 Ivan Kohler
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA.
+#
+################################################################################
+
+package Business::OnlinePayment::OpenECHO;
+
+use strict;
+use Carp;
+use Business::OnlinePayment 3;
+use Business::OnlinePayment::HTTPS;
+use vars qw($VERSION @ISA);
+
+@ISA = qw(Business::OnlinePayment::HTTPS);
+$VERSION = '0.01';
+
+sub set_defaults {
+ my $self = shift;
+
+ $self->server('wwws.echo-inc.com');
+ $self->port('443');
+ $self->path('/scripts/INR200.EXE');
+
+ $self->build_subs(qw(
+ order_number avs_code
+ ));
+ # order_type
+ # md5 cvv2_response cavv_response
+
+}
+
+#map_fileds originally from AuthorizeNet.pm
+
+sub map_fields {
+ my($self) = @_;
+
+ ##AD (Address Verification) - 0.18 cents
+ #AS (Authorization) - 0.18 cents
+ #AV (Authorization with Address Verification) - 0.18 cents
+ #CR (Credit) - 0.18 cents + 0.12 cents (discount fee returned to merchant)
+ #DS (Deposit) - 0.18 cents + 0.12 cents
+ #ES (Authorization and Deposit) - 0.18 cents + 0.12 cents + an extra 0.17%
+ #EV (Authorization and Deposit with Address Verification) - 0.18 cents + 0.12 cents
+ ##CK (System check) - 0.18 cents
+ #DV (Electronic Check Verification) - check your contract
+ #DD (Electronic Check Debit with Verification) - check your contract
+ #DH (Electronic Check Debit ACH Only) - check your contract
+ #DC (Electronic Check Credit) - check your contract
+
+ my %content = $self->content();
+
+ my $avs = $self->require_avs;
+ $avs = 1 unless defined($avs) && length($avs); #default AVS on unless explicitly turned off
+
+ my %map;
+ if (
+ $content{'type'} =~ /^(cc|visa|mastercard|american express|discover)$/i
+ ) {
+ if ( $avs ) {
+ %map = ( 'normal authorization' => 'EV',
+ 'authorization only' => 'AV',
+ 'credit' => 'CR',
+ 'post authorization' => 'DS',
+ #'void' => 'VOID',
+ );
+ } else {
+ %map = ( 'normal authorization' => 'ES',
+ 'authorization only' => 'AS',
+ 'credit' => 'CR',
+ 'post authorization' => 'DS',
+ #'void' => 'VOID',
+ );
+ }
+ } elsif ( $content{'type'} =~ /^check$/i ) {
+ %map = ( 'normal authorization' => 'DD',
+ 'authorization only' => 'DV',
+ 'credit' => 'DC',
+ 'post authorization' => 'DH',
+ #'void' => 'VOID',
+ );
+ } else {
+ croak 'Unknown type: '. $content{'type'};
+ }
+
+ $content{'type'} = $map{lc($content{'action'})}
+ or croak 'Unknown action: '. $content{'action'};
+
+ $self->transaction_type($content{'type'});
+
+ # stuff it back into %content
+ $self->content(%content);
+
+}
+
+sub submit {
+ my($self) = @_;
+
+ $self->map_fields();
+ $self->remap_fields(
+ # => 'order_type',
+ type => 'transaction_type',
+ #action =>
+ login => 'merchant_echo_id',
+ password => 'merchant_pin',
+ # => 'isp_echo_id',
+ # => 'isp_pin',
+ #transaction_key =>
+ authorization => 'authorization', # auth_code => 'authorization',
+ customer_ip => 'billing_ip_address',
+ # 'billing_prefix',
+ name => 'billing_name',
+ first_name => 'billing_first_name',
+ last_name => 'billing_last_name',
+ company => 'billing_company_name',
+ address => 'billing_address_1',
+ # => 'billing_address_2',
+ city => 'billing_city',
+ state => 'billing_state',
+ zip => 'billing_zip',
+ country => 'billing_country',
+ phone => 'billing_phone',
+ fax => 'billing_fax',
+ email => 'billing_email',
+ card_number => 'cc_number',
+ # => 'ccexp_month',
+ # => 'ccexp_year',
+ # => 'counter',
+ # => 'debug',
+
+ #XXX# => 'ec_*',
+
+ 'amount' => 'grand_total',
+ # => 'merchant_email',
+ #invoice_number =>
+ #customer_id =>
+ # => 'merchant_trace_nbr',
+ # => 'original_amount',
+ # => 'original_trandate_mm',
+ # => 'original_trandate_dd',
+ # => 'original_trandate_yyyy',
+ # => 'original_reference',
+ order_number => 'order_number',
+ # => 'shipping_flag',
+
+ #description =>
+ #currency =>
+
+ #ship_last_name =>
+ #ship_first_name =>
+ #ship_company =>
+ #ship_address =>
+ #ship_city =>
+ #ship_state =>
+ #ship_zip =>
+ #ship_country =>
+
+ #expiration =>
+ cvv2 => 'cnp_security',
+
+ #check_type =>
+ #account_name => 'ec_last_name' & 'ec_first_name',
+ account_number => 'ec_account',
+ #account_type =>
+ bank_name => 'ec_bank_name',
+ routing_code => 'ec_rt',
+ #customer_org =>
+ #customer_ssn =>
+ license_num => 'ec_id_number',
+ license_state => 'ec_id_state',
+ #license_dob =>
+
+ #recurring_billing => 'cnp_recurring',
+ );
+
+ #XXX hosted order_type?
+ $self->{_content}{order_type} = 'S';
+
+ #XXX counter field shouldn't be just a random integer (but it does need a
+ #default this way i guess...
+ $self->{_content}{counter} = int(rand(2**31));
+
+ #ccexp_month & ccexp_year
+ $self->{_content}{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/
+ or croak "unparsable expiration ". $self->{_content}{expiration};
+ my( $month, $year ) = ( $1, $2 );
+ $month = '0'. $month if $month =~ /^\d$/;
+ $self->{_content}{ccexp_month} = $month;
+ $self->{_content}{ccexp_year} = $year;
+
+ $self->{_content}{cnp_recurring} = 'Y'
+ if exists($self->{_content}{recurring_billing})
+ && $self->{_content}{recurring_billing} =~ /^y/i;
+
+ #XXX echeck use customer_org and account_type to generate ec_account_type
+
+ #XXX set required fields
+ # https://wwws.echo-inc.com/ISPGuide-Fields2.asp
+ $self->required_fields();
+
+ my( $page, $response, %reply_headers) =
+ $self->https_get( $self->get_fields( $self->fields ) );
+
+ #XXX check $response and die if not 200?
+
+ my $echotype1 = $self->GetEchoReturn($page, 1);
+ my $echotype2 = $self->GetEchoReturn($page, 2);
+ my $echotype3 = $self->GetEchoReturn($page, 3);
+ my $openecho = $self->GetEchoReturn($page, 'OPEN');
+
+ # server_response
+ # avs_code
+ # order_number
+ # is_success
+ # result_code
+ # authorization
+ #md5 cvv2_response cavv_response ...?
+
+ # Get all the metadata.
+ $self->server_response($page);
+ $self->authorization( $self->GetEchoProp($echotype3, 'auth_code') );
+ $self->order_number( $self->GetEchoProp($echotype3, 'order_number') );
+
+ #XXX ???
+ #$self->reference( $this->GetEchoProp($echotype3, "echo_reference");
+
+ $self->result_code( $self->GetEchoProp($echotype3, 'status') );
+ $self->avs_code( $self->GetEchoProp($echotype3, 'avs_result') );
+
+ #XXX ???
+ #$self->security_result( $self->GetEchoProp($echotype3, 'security_result');
+ #$self->mac( $self->GetEchoProp($echotype3, 'mac') );
+ #$self->decline_code( $self->GetEchoProp($echotype3, 'decline_code') );
+
+ if ($self->result_code =~ /^[GR]$/ ) { #success
+
+ #XXX special case for AVS-only transactions we don't handle yet
+ #if ($self->transaction_type eq "AD") {
+ # if ($self->avs_code =~ /^[XYDM]$/ ) {
+ # $self->is_success(1);
+ # } else {
+ # $self->is_success(0);
+ # }
+ #} else {
+ $self->is_success(1);
+ #}
+
+ } else {
+ $self->is_success(0);
+
+ my $decline_code = $self->GetEchoProp($echotype3, 'decline_code');
+ my $error_message = $self->error($decline_code);
+ if ( $decline_code =~ /^(00)?30$/ ) {
+ $echotype2 =~ s/<br>/\n/ig;
+ $echotype2 =~ s'</?(b|pre)>''ig;
+ $error_message .= ": $echotype2";
+ }
+ $self->error_message( $error_message );
+
+ }
+
+ $self->is_success(0) if $page eq '';
+
+}
+
+
+sub fields {
+ my $self = shift;
+
+ my @fields = qw(
+ order_type
+ transaction_type
+ merchant_echo_id
+ merchant_pin
+ isp_echo_id
+ isp_pin
+ authorization
+ billing_ip_address
+ billing_prefix
+ billing_name
+ billing_first_name
+ billing_last_name
+ billing_company_name
+ billing_address1
+ billing_address2
+ billing_city
+ billing_state
+ billing_zip
+ billing_country
+ billing_phone
+ billing_fax
+ billing_email
+ cc_number
+ ccexp_month
+ ccexp_year
+ counter
+ debug
+ );
+
+ if ($self->transaction_type =~ /^D[DCVH]$/) {
+ push @fields, qw(
+ ec_account
+ ec_account_type
+ ec_payment_type
+ ec_address1
+ ec_address2
+ ec_bank_name
+ ec_business_acct
+ ec_city
+ ec_email
+ ec_first_name
+ ec_id_country
+ ec_id_exp_mm
+ ec_id_exp_dd
+ ec_id_exp_yy
+ ec_id_number
+ ec_id_state
+ ec_id_type
+ ec_last_name
+ ec_merchant_ref
+ ec_nbds_code
+ ec_other_name
+ ec_payee
+ ec_rt
+ ec_serial_number
+ ec_state
+ ec_transaction_dt
+ ec_zip
+ );
+ }
+
+ push @fields, qw(
+ grand_total
+ merchant_email
+ merchant_trace_nbr
+ original_amount
+ original_trandate_mm
+ original_trandate_dd
+ original_trandate_yyyy
+ original_reference
+ order_number
+ shipping_flag
+ shipping_prefix
+ shipping_name
+ shipping_address1
+ shipping_address2
+ shipping_city
+ shipping_state
+ shipping_zip
+ shipping_comments
+ shipping_country
+ shipping_phone
+ shipping_fax
+ shipper
+ shipper_tracking_nbr
+ track1
+ track2
+ cnp_security
+ cnp_recurring
+ );
+
+ return @fields;
+}
+
+sub GetEchoProp {
+ my( $self, $raw, $prop ) = @_;
+ local $^W=0;
+
+ my $data;
+ ($data) = $raw =~ m"<$prop>(.*?)</$prop>"gsi;
+ $data =~ s/<.*?>/ /gs;
+ chomp $data;
+ return $data;
+}
+
+# Get's a given Echo return type and strips all HTML style tags from it.
+# It also strips any new line characters from the returned string.
+#
+# This function based on Ben Reser's <breser@vecdev.com> Echo::Process
+# module.
+sub GetEchoReturn {
+ my( $self, $page, $type ) = @_;
+ local $^W=0;
+
+ my $data;
+ if ($type eq 'OPEN') {
+ ($data) = $page =~ m"<OPENECHO>(.*?)</OPENECHO>"gsi;
+ }
+ else {
+ ($data) = $page =~ m"<ECHOTYPE$type>(.*?)</ECHOTYPE$type>"gsi;
+ }
+# $data =~ s"<.*?>" "g;
+
+ #unless (length($data)) {
+ # warn "$self $page $type";
+ #}
+
+ chomp $data;
+ return $data;
+}
+
+use vars qw(%error);
+%error = (
+ "01" => [ "Refer to card issuer", "The merchant must call the issuer before the transaction can be approved." ],
+ "02" => [ "Refer to card issuer, special condition", "The merchant must call the issuer before the transaction can be approved." ],
+ "03" => [ "Invalid merchant number", "The merchant ID is not valid." ],
+ "04" => [ "Pick-up card. Capture for reward", "The card is listed on the Warning Bulletin. Merchant may receive reward money by capturing the card." ],
+ "05" => [ "Do not honor. The transaction was declined by the issuer without definition or reason", "The transaction was declined without explanation by the card issuer." ],
+ "06" => [ "Error", "The card issuer returned an error without further explanation." ],
+ "07" => [ "Pick-up card, special condition", "The card is listed on the Warning Bulletin. Merchant may receive reward money by capturing the card." ],
+ "08" => [ "Honor with identification", "Honor with identification." ],
+ "09" => [ "Request in progress", "Request in progress." ],
+ "10" => [ "Approved for partial amount", "Approved for partial amount." ],
+ "11" => [ "Approved, VIP", "Approved, VIP program." ],
+ "12" => [ "Invalid transaction", "The requested transaction is not supported or is not valid for the card number presented." ],
+ "13" => [ "Invalid amount", "The amount exceeds the limits established by the issuer for this type of transaction." ],
+ "14" => [ "Invalid card #", "The issuer indicates that this card is not valid." ],
+ "15" => [ "No such issuer", "The card issuer number is not valid." ],
+ "16" => [ "Approved, update track 3", "Approved, update track 3." ],
+ "17" => [ "Customer cancellation", "Customer cancellation." ],
+ "18" => [ "Customer dispute", "Customer dispute." ],
+ "19" => [ "Re enter transaction", "Customer should resubmit transaction." ],
+ "20" => [ "Invalid response", "Invalid response." ],
+ "21" => [ "No action taken", "No action taken. The issuer declined with no other explanation." ],
+ "22" => [ "Suspected malfunction", "Suspected malfunction." ],
+ "23" => [ "Unacceptable transaction fee", "Unacceptable transaction fee." ],
+ "24" => [ "File update not supported", "File update not supported." ],
+ "25" => [ "Unable to locate record", "Unable to locate record." ],
+ "26" => [ "Duplicate record", "Duplicate record." ],
+ "27" => [ "File update edit error", "File update edit error." ],
+ "28" => [ "File update file locked", "File update file locked." ],
+ "30" => [ "Format error, call ECHO", "The host reported that the transaction was not formatted properly." ],
+ "31" => [ "Bank not supported", "Bank not supported by switch." ],
+ "32" => [ "Completed partially", "Completed partially." ],
+ "33" => [ "Expired card, pick-up", "The card is expired. Merchant may receive reward money by capturing the card." ],
+ "34" => [ "Issuer suspects fraud, pick-up card", "The card issuer suspects fraud. Merchant may receive reward money by capturing the card." ],
+ "35" => [ "Contact acquirer, pick-up", "Contact card issuer. Merchant may receive reward money by capturing the card." ],
+ "36" => [ "Restricted card, pick-up", "The card is restricted by the issuer. Merchant may receive reward money by capturing the card." ],
+ "37" => [ "Call ECHO security, pick-up", "Contact ECHO security. Merchant may receive reward money by capturing the card." ],
+ "38" => [ "PIN tries exceeded, pick-up", "PIN attempts exceed issuer limits. Merchant may receive reward money by capturing the card." ],
+ "39" => [ "No credit account", "No credit account." ],
+ "40" => [ "Function not supported", "Requested function not supported." ],
+ "41" => [ "Lost Card, capture for reward", "The card has been reported lost." ],
+ "42" => [ "No universal account", "No universal account." ],
+ "43" => [ "Stolen Card, capture for reward", "The card has been reported stolen." ],
+ "44" => [ "No investment account", "No investment account." ],
+ "51" => [ "Not sufficient funds", "The credit limit for this account has been exceeded." ],
+ "54" => [ "Expired card", "The card is expired." ],
+ "55" => [ "Incorrect PIN", "The cardholder PIN is incorrect." ],
+ "56" => [ "No card record", "No card record." ],
+ "57" => [ "Transaction not permitted to cardholder", "The card is not allowed the type of transaction requested." ],
+ "58" => [ "Transaction not permitted on terminal", "The Merchant is not allowed this type of transaction." ],
+ "59" => [ "Suspected fraud", "Suspected fraud." ],
+ "60" => [ "Contact ECHO", "Contact ECHO." ],
+ "61" => [ "Exceeds withdrawal limit", "The amount exceeds the allowed daily maximum." ],
+ "62" => [ "Restricted card", "The card has been restricted." ],
+ "63" => [ "Security violation.", "The card has been restricted." ],
+ "64" => [ "Original amount incorrect", "Original amount incorrect." ],
+ "65" => [ "Exceeds withdrawal frequency", "The allowable number of daily transactions has been exceeded." ],
+ "66" => [ "Call acquirer security, call ECHO", "Call acquirer security, call ECHO." ],
+ "68" => [ "Response received too late", "Response received too late." ],
+ "75" => [ "PIN tries exceeded", "The allowed number of PIN retries has been exceeded." ],
+ "76" => [ "Invalid \"to\" account", "The debit account does not exist." ],
+ "77" => [ "Invalid \"from\" account", "The credit account does not exist." ],
+ "78" => [ "Invalid account specified (general)", "The associated card number account is invalid or does not exist." ],
+ "79" => [ "Already reversed", "Already reversed." ],
+ "84" => [ "Invalid authorization life cycle", "The authorization life cycle is invalid." ],
+ "86" => [ "Cannot verify PIN", "Cannot verify PIN." ],
+ "87" => [ "Network Unavailable", "Network Unavailable." ],
+ "89" => [ "Ineligible to receive financial position information", "Ineligible to receive financial position information." ],
+ "90" => [ "Cut-off in progress", "Cut-off in progress." ],
+ "91" => [ "Issuer or switch inoperative", "The bank is not available to authorize this transaction." ],
+ "92" => [ "Routing error", "The transaction cannot be routed to the authorizing agency." ],
+ "93" => [ "Violation of law", "Violation of law." ],
+ "94" => [ "Duplicate transaction", "Duplicate transaction." ],
+ "95" => [ "Reconcile error", "Reconcile error." ],
+ "96" => [ "System malfunction", "A system error has occurred." ],
+ "98" => [ "Exceeds cash limit", "Exceeds cash limit." ],
+ "1000" => [ "Unrecoverable error.", "An unrecoverable error has occurred in the ECHONLINE processing." ],
+ "1001" => [ "Account closed", "The merchant account has been closed." ],
+ "1002" => [ "System closed", "Services for this system are not available. (Not used by ECHONLINE)" ],
+ "1003" => [ "E-Mail Down", "The e-mail function is not available. (Not used by ECHONLINE)" ],
+ "1012" => [ "Invalid trans code", "The host computer received an invalid transaction code." ],
+ "1013" => [ "Invalid term id", "The ECHO-ID is invalid." ],
+ "1015" => [ "Invalid card number", "The credit card number that was sent to the host computer was invalid" ],
+ "1016" => [ "Invalid expiry date", "The card has expired or the expiration date was invalid." ],
+ "1017" => [ "Invalid amount", "The dollar amount was less than 1.00 or greater than the maximum allowed for this card." ],
+ "1019" => [ "Invalid state", "The state code was invalid. (Not used by ECHONLINE)" ],
+ "1021" => [ "Invalid service", "The merchant or card holder is not allowed to perform that kind of transaction" ],
+ "1024" => [ "Invalid auth code", "The authorization number presented with this transaction is incorrect. (deposit transactions only)" ],
+ "1025" => [ "Invalid reference number", "The reference number presented with this transaction is incorrect or is not numeric." ],
+ "1029" => [ "Invalid contract number", "The contract number presented with this transaction is incorrect or is not numeric. (Not used by ECHONLINE)" ],
+ "1030" => [ "Invalid inventory data", "The inventory data presented with this transaction is not ASCII \"printable\". (Not used by ECHONLINE)" ],
+ "1508" => [ " ", "Invalid or missing order_type." ],
+ "1509" => [ " ", "The merchant is not approved to submit this order_type." ],
+ "1510" => [ " ", "The merchant is not approved to submit this transaction_type." ],
+ #"1511" => [ " ", "Duplicate transaction attempt (see counterin Part I of this Specification</EM>)." ],
+ "1511" => [ " ", "Duplicate transaction attempt (set counter field?)." ],
+ "1599" => [ " ", "An system error occurred while validating the transaction input." ],
+ "1801" => [ "Return Code \"A\"", "Address matches; ZIP does not match." ],
+ "1802" => [ "Return Code \"W\"", "9-digit ZIP matches; Address does not match." ],
+ "1803" => [ "Return Code \"Z\"", "5-digit ZIP matches; Address does not match." ],
+ "1804" => [ "Return Codes \"U\"", "Issuer unavailable; cannot verify." ],
+ "1805" => [ "Return Code \"R\"", "Retry; system is currently unable to process." ],
+ "1806" => [ "Return Code \"S\" or \"G\"", "Issuer does not support AVS." ],
+ "1807" => [ "Return Code \"N\"", "Nothing matches." ],
+ "1808" => [ "Return Code \"E\"", "Invalid AVS only response." ],
+ "1809" => [ "Return Code \"B\"", "Street address match. Postal code not verified because of incompatible formats." ],
+ "1810" => [ "Return Code \"C\"", "Street address and Postal code not verified because of incompatible formats." ],
+ "1811" => [ "Return Code \"D\"", "Street address match and Postal code match." ],
+ "1812" => [ "Return Code \"I\"", "Address information not verified for international transaction." ],
+ "1813" => [ "Return Code \"M\"", "Street address match and Postal code match." ],
+ "1814" => [ "Return Code \"P\"", "Postal code match. Street address not verified because of incompatible formats." ],
+ "1897" => [ "invalid response", "The host returned an invalid response." ],
+ "1898" => [ "disconnect", "The host unexpectedly disconnected." ],
+ "1899" => [ "timeout", "Timeout waiting for host response." ],
+ "2071" => [ "Call VISA", "An authorization number from the VISA Voice Center is required to approve this transaction." ],
+ "2072" => [ "Call Master Card", "An authorization number from the Master Card Voice Center is required to approve this transaction." ],
+ "2073" => [ "Call Carte Blanche", "An authorization number from the Carte Blanche Voice Center is required to approve this transaction." ],
+ "2074" => [ "Call Diners Club", "An authorization number from the Diners' Club Voice Center is required to approve this transaction." ],
+ "2075" => [ "Call AMEX", "An authorization number from the American Express Voice Center is required to approve this transaction." ],
+ "2076" => [ "Call Discover", "An authorization number from the Discover Voice Center is required to approve this transaction." ],
+ "2078" => [ "Call ECHO", "The merchant must call ECHOCustomer Support for approval.or because there is a problem with the merchant's account." ],
+ "2079" => [ "Call XpresscheX", "The merchant must call ECHOCustomer Support for approval.or because there is a problem with the merchant's account." ],
+ "3001" => [ "No ACK on Resp", "The host did not receive an ACK from the terminal after sending the transaction response." ],
+ "3002" => [ "POS NAK'd 3 Times", "The host disconnected after the terminal replied 3 times to the host response with a NAK." ],
+ "3003" => [ "Drop on Wait", "The line dropped before the host could send a response to the terminal." ],
+ "3005" => [ "Drop on Resp", "The line dropped while the host was sending the response to the terminal." ],
+ "3007" => [ "Drop Before EOT", "The host received an ACK from the terminal but the line dropped before the host could send the EOT." ],
+ "3011" => [ "No Resp to ENQ", "The line was up and carrier detected, but the terminal did not respond to the ENQ." ],
+ "3012" => [ "Drop on Input", "The line disconnected while the host was receiving data from the terminal." ],
+ "3013" => [ "FEP NAK'd 3 Times", "The host disconnected after receiving 3 transmissions with incorrect LRC from the terminal." ],
+ "3014" => [ "No Resp to ENQ", "The line disconnected during input data wait in Multi-Trans Mode." ],
+ "3015" => [ "Drop on Input", "The host encountered a full queue and discarded the input data." ],
+);
+for ( 9000..9999 ) {
+ $error{$_} = [ "Host Error", "The host encountered an internal error and was not able to process the transaction." ];
+}
+sub error {
+ my( $self, $num ) = @_;
+ $num =~ s/^00(\d\d)$/$1/;
+ return $num. ': '. $error{$num}[0]. ': '. $error{$num}[1];
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Business::OnlinePayment::OpenECHO - ECHO backend module for Business::OnlinePayment
+
+=head1 SYNOPSIS
+
+ use Business::OnlinePayment;
+
+ ####
+ # One step transaction, the simple case.
+ ####
+
+ my $tx = new Business::OnlinePayment("OpenECHO");
+ $tx->content(
+ type => 'VISA',
+ login => '1234684752',
+ password => '43400210',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ card_number => '4005550000000019',
+ expiration => '08/06',
+ cvv2 => '1234', #optional
+ referer => 'http://valid.referer.url/',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ print "Card processed successfully: ".$tx->authorization."\n";
+ } else {
+ print "Card was rejected: ".$tx->error_message."\n";
+ }
+
+=head1 SUPPORTED TRANSACTION TYPES
+
+=head2 CC, Visa, MasterCard, American Express, Discover
+
+Content required: type, login, password, action, amount, first_name, last_name, card_number, expiration.
+
+=head2 Check
+
+Not yet implemented...
+#Content required: type, login, password, action, amount, first_name, last_name, account_number, routing_code, bank_name.
+
+=head1 PREREQUISITES
+
+ URI::Escape
+ Tie::IxHash
+
+ Net::SSLeay _or_ ( Crypt::SSLeay and LWP )
+
+=head1 DESCRIPTION
+
+For detailed information see L<Business::OnlinePayment>.
+
+=head1 AUTHOR
+
+Original Author
+Michael Lehmkuhl <michael@electricpulp.com>
+
+Special Thanks
+Jim Darden <jdarden@echo-inc.com>
+Dan Browning <db@kavod.com>
+
+Business::OnlinePayment Implementation
+Ivan Kohler <ivan-openecho@420.am>
+
+=head1 SEE ALSO
+
+perl(1). L<Business::OnlinePayment>.
+
+=cut
+
diff --git a/README b/README
new file mode 100644
index 0000000..47b0da8
--- /dev/null
+++ b/README
@@ -0,0 +1,20 @@
+Copyright (C) 2002 Electric Pulp. <info@electricpulp.com>
+Copyright (c) 2004 Ivan Kohler
+All rights reserved. This program is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This is Business::OnlinePayment::OpenECHO, an Business::OnlinePayment
+backend module for ECHO. It is only useful if you have a merchant account
+with ECHO: http://www.echo-inc.com/ (also see http://www.openecho.com/)
+
+This module is based on code written by Michael Lehmkuhl
+<michael@electricpulp.com>, with special thanks to Jim Darden
+<jdarden@echo-inc.com> and Dan Browning <db@kavod.com>. It was adapted to
+the Business::OnlinePayment API by Ivan Kohler <ivan-openecho@420.am>.
+
+Business::OnlinePayment is a generic interface for processing payments through
+online credit card processors, online check acceptance houses, etc. (If you
+like buzzwords, call it an "multiplatform ecommerce-enabling middleware
+solution").
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..157a740
--- /dev/null
+++ b/TODO
@@ -0,0 +1,15 @@
+- set required fields https://wwws.echo-inc.com/ISPGuide-Fields2.asp
+- counter field shouldn't be just a random integer (but it does need to
+ fallback to that as B:OP doesn't require it)
+
+- echecks / ACH
+ #echeck use customer_org and account_type to generate ec_account_type
+
+- check HTTPS response code and die if not 200?
+- order_type & ccexp_month,ccexp_year setting fiddling ->{_content} directly
+- 'echo_reference', 'security_result', 'mac', and 'decline_code' fields...?
+
+- handle returning correct is_success and error_message values in the
+ special case for AVS-only transactions we don't handle yet (B:OP needs a
+ name for that transaction!)
+- Hosted order type?
diff --git a/blib/arch/auto/Business/OnlinePayment/OpenECHO/.exists b/blib/arch/auto/Business/OnlinePayment/OpenECHO/.exists
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/blib/arch/auto/Business/OnlinePayment/OpenECHO/.exists
diff --git a/blib/lib/Business/OnlinePayment/.exists b/blib/lib/Business/OnlinePayment/.exists
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/blib/lib/Business/OnlinePayment/.exists
diff --git a/blib/lib/Business/OnlinePayment/OpenECHO.pm b/blib/lib/Business/OnlinePayment/OpenECHO.pm
new file mode 100644
index 0000000..595c38d
--- /dev/null
+++ b/blib/lib/Business/OnlinePayment/OpenECHO.pm
@@ -0,0 +1,673 @@
+##############################################################################
+# Business::OnlinePayment::OpenECHO
+#
+# Credit card transactions via SSL to
+# Electronic Clearing House (ECHO) Systems
+#
+# Refer to ECHO's documentation for more info
+# http://www.openecho.com/echo_gateway_guide.html
+#
+# AUTHOR
+# Michael Lehmkuhl <michael@electricpulp.com>
+#
+# SPECIAL THANKS
+# Jim Darden <jdarden@echo-inc.com>
+# Dan Browning <db@kavod.com>
+#
+# BUSINESS::ONLINEPAYMENT IMPLEMENTATION
+# Ivan Kohler <ivan-openecho@420.am>
+#
+# VERSION HISTORY
+# + v1.2 08/17/2002 Corrected problem with certain string comparisons.
+# + v1.3 08/23/2002 Converted Interchange GlobalSub to Vend::Payment module.
+# + v1.3.1 11/12/2002 Updated the OpenECHO_example.perl test script.
+# + v1.4 11/18/2002 Corrected a problem with Submit method when using LWP.
+# + v1.5 03/29/2003 Updated for additional status and avs_result codes.
+# + v1.6 08/26/2003 Cleaned up code (salim qadeer sqadeer@echo-inc.com)
+# + v1.6.2 09/23/2003 Added DH transaction type (salim qadeer sqadeer@echo-inc.com)
+# --------
+# + v0.1 08/26/2004 Business::OnlinePayment implementation
+#
+# Copyright (C) 2002 Electric Pulp. <info@electricpulp.com>
+# Copyright (C) 2004 Ivan Kohler
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA.
+#
+################################################################################
+
+package Business::OnlinePayment::OpenECHO;
+
+use strict;
+use Carp;
+use Business::OnlinePayment 3;
+use Business::OnlinePayment::HTTPS;
+use vars qw($VERSION @ISA);
+
+@ISA = qw(Business::OnlinePayment::HTTPS);
+$VERSION = '0.01';
+
+sub set_defaults {
+ my $self = shift;
+
+ $self->server('wwws.echo-inc.com');
+ $self->port('443');
+ $self->path('/scripts/INR200.EXE');
+
+ $self->build_subs(qw(
+ order_number avs_code
+ ));
+ # order_type
+ # md5 cvv2_response cavv_response
+
+}
+
+#map_fileds originally from AuthorizeNet.pm
+
+sub map_fields {
+ my($self) = @_;
+
+ ##AD (Address Verification) - 0.18 cents
+ #AS (Authorization) - 0.18 cents
+ #AV (Authorization with Address Verification) - 0.18 cents
+ #CR (Credit) - 0.18 cents + 0.12 cents (discount fee returned to merchant)
+ #DS (Deposit) - 0.18 cents + 0.12 cents
+ #ES (Authorization and Deposit) - 0.18 cents + 0.12 cents + an extra 0.17%
+ #EV (Authorization and Deposit with Address Verification) - 0.18 cents + 0.12 cents
+ ##CK (System check) - 0.18 cents
+ #DV (Electronic Check Verification) - check your contract
+ #DD (Electronic Check Debit with Verification) - check your contract
+ #DH (Electronic Check Debit ACH Only) - check your contract
+ #DC (Electronic Check Credit) - check your contract
+
+ my %content = $self->content();
+
+ my $avs = $self->require_avs;
+ $avs = 1 unless defined($avs) && length($avs); #default AVS on unless explicitly turned off
+
+ my %map;
+ if (
+ $content{'type'} =~ /^(cc|visa|mastercard|american express|discover)$/i
+ ) {
+ if ( $avs ) {
+ %map = ( 'normal authorization' => 'EV',
+ 'authorization only' => 'AV',
+ 'credit' => 'CR',
+ 'post authorization' => 'DS',
+ #'void' => 'VOID',
+ );
+ } else {
+ %map = ( 'normal authorization' => 'ES',
+ 'authorization only' => 'AS',
+ 'credit' => 'CR',
+ 'post authorization' => 'DS',
+ #'void' => 'VOID',
+ );
+ }
+ } elsif ( $content{'type'} =~ /^check$/i ) {
+ %map = ( 'normal authorization' => 'DD',
+ 'authorization only' => 'DV',
+ 'credit' => 'DC',
+ 'post authorization' => 'DH',
+ #'void' => 'VOID',
+ );
+ } else {
+ croak 'Unknown type: '. $content{'type'};
+ }
+
+ $content{'type'} = $map{lc($content{'action'})}
+ or croak 'Unknown action: '. $content{'action'};
+
+ $self->transaction_type($content{'type'});
+
+ # stuff it back into %content
+ $self->content(%content);
+
+}
+
+sub submit {
+ my($self) = @_;
+
+ $self->map_fields();
+ $self->remap_fields(
+ # => 'order_type',
+ type => 'transaction_type',
+ #action =>
+ login => 'merchant_echo_id',
+ password => 'merchant_pin',
+ # => 'isp_echo_id',
+ # => 'isp_pin',
+ #transaction_key =>
+ authorization => 'authorization', # auth_code => 'authorization',
+ customer_ip => 'billing_ip_address',
+ # 'billing_prefix',
+ name => 'billing_name',
+ first_name => 'billing_first_name',
+ last_name => 'billing_last_name',
+ company => 'billing_company_name',
+ address => 'billing_address_1',
+ # => 'billing_address_2',
+ city => 'billing_city',
+ state => 'billing_state',
+ zip => 'billing_zip',
+ country => 'billing_country',
+ phone => 'billing_phone',
+ fax => 'billing_fax',
+ email => 'billing_email',
+ card_number => 'cc_number',
+ # => 'ccexp_month',
+ # => 'ccexp_year',
+ # => 'counter',
+ # => 'debug',
+
+ #XXX# => 'ec_*',
+
+ 'amount' => 'grand_total',
+ # => 'merchant_email',
+ #invoice_number =>
+ #customer_id =>
+ # => 'merchant_trace_nbr',
+ # => 'original_amount',
+ # => 'original_trandate_mm',
+ # => 'original_trandate_dd',
+ # => 'original_trandate_yyyy',
+ # => 'original_reference',
+ order_number => 'order_number',
+ # => 'shipping_flag',
+
+ #description =>
+ #currency =>
+
+ #ship_last_name =>
+ #ship_first_name =>
+ #ship_company =>
+ #ship_address =>
+ #ship_city =>
+ #ship_state =>
+ #ship_zip =>
+ #ship_country =>
+
+ #expiration =>
+ cvv2 => 'cnp_security',
+
+ #check_type =>
+ #account_name => 'ec_last_name' & 'ec_first_name',
+ account_number => 'ec_account',
+ #account_type =>
+ bank_name => 'ec_bank_name',
+ routing_code => 'ec_rt',
+ #customer_org =>
+ #customer_ssn =>
+ license_num => 'ec_id_number',
+ license_state => 'ec_id_state',
+ #license_dob =>
+
+ #recurring_billing => 'cnp_recurring',
+ );
+
+ #XXX hosted order_type?
+ $self->{_content}{order_type} = 'S';
+
+ #XXX counter field shouldn't be just a random integer (but it does need a
+ #default this way i guess...
+ $self->{_content}{counter} = int(rand(2**31));
+
+ #ccexp_month & ccexp_year
+ $self->{_content}{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/
+ or croak "unparsable expiration ". $self->{_content}{expiration};
+ my( $month, $year ) = ( $1, $2 );
+ $month = '0'. $month if $month =~ /^\d$/;
+ $self->{_content}{ccexp_month} = $month;
+ $self->{_content}{ccexp_year} = $year;
+
+ $self->{_content}{cnp_recurring} = 'Y'
+ if exists($self->{_content}{recurring_billing})
+ && $self->{_content}{recurring_billing} =~ /^y/i;
+
+ #XXX echeck use customer_org and account_type to generate ec_account_type
+
+ #XXX set required fields
+ # https://wwws.echo-inc.com/ISPGuide-Fields2.asp
+ $self->required_fields();
+
+ my( $page, $response, %reply_headers) =
+ $self->https_get( $self->get_fields( $self->fields ) );
+
+ #XXX check $response and die if not 200?
+
+ my $echotype1 = $self->GetEchoReturn($page, 1);
+ my $echotype2 = $self->GetEchoReturn($page, 2);
+ my $echotype3 = $self->GetEchoReturn($page, 3);
+ my $openecho = $self->GetEchoReturn($page, 'OPEN');
+
+ # server_response
+ # avs_code
+ # order_number
+ # is_success
+ # result_code
+ # authorization
+ #md5 cvv2_response cavv_response ...?
+
+ # Get all the metadata.
+ $self->server_response($page);
+ $self->authorization( $self->GetEchoProp($echotype3, 'auth_code') );
+ $self->order_number( $self->GetEchoProp($echotype3, 'order_number') );
+
+ #XXX ???
+ #$self->reference( $this->GetEchoProp($echotype3, "echo_reference");
+
+ $self->result_code( $self->GetEchoProp($echotype3, 'status') );
+ $self->avs_code( $self->GetEchoProp($echotype3, 'avs_result') );
+
+ #XXX ???
+ #$self->security_result( $self->GetEchoProp($echotype3, 'security_result');
+ #$self->mac( $self->GetEchoProp($echotype3, 'mac') );
+ #$self->decline_code( $self->GetEchoProp($echotype3, 'decline_code') );
+
+ if ($self->result_code =~ /^[GR]$/ ) { #success
+
+ #XXX special case for AVS-only transactions we don't handle yet
+ #if ($self->transaction_type eq "AD") {
+ # if ($self->avs_code =~ /^[XYDM]$/ ) {
+ # $self->is_success(1);
+ # } else {
+ # $self->is_success(0);
+ # }
+ #} else {
+ $self->is_success(1);
+ #}
+
+ } else {
+ $self->is_success(0);
+
+ my $decline_code = $self->GetEchoProp($echotype3, 'decline_code');
+ my $error_message = $self->error($decline_code);
+ if ( $decline_code =~ /^(00)?30$/ ) {
+ $echotype2 =~ s/<br>/\n/ig;
+ $echotype2 =~ s'</?(b|pre)>''ig;
+ $error_message .= ": $echotype2";
+ }
+ $self->error_message( $error_message );
+
+ }
+
+ $self->is_success(0) if $page eq '';
+
+}
+
+
+sub fields {
+ my $self = shift;
+
+ my @fields = qw(
+ order_type
+ transaction_type
+ merchant_echo_id
+ merchant_pin
+ isp_echo_id
+ isp_pin
+ authorization
+ billing_ip_address
+ billing_prefix
+ billing_name
+ billing_first_name
+ billing_last_name
+ billing_company_name
+ billing_address1
+ billing_address2
+ billing_city
+ billing_state
+ billing_zip
+ billing_country
+ billing_phone
+ billing_fax
+ billing_email
+ cc_number
+ ccexp_month
+ ccexp_year
+ counter
+ debug
+ );
+
+ if ($self->transaction_type =~ /^D[DCVH]$/) {
+ push @fields, qw(
+ ec_account
+ ec_account_type
+ ec_payment_type
+ ec_address1
+ ec_address2
+ ec_bank_name
+ ec_business_acct
+ ec_city
+ ec_email
+ ec_first_name
+ ec_id_country
+ ec_id_exp_mm
+ ec_id_exp_dd
+ ec_id_exp_yy
+ ec_id_number
+ ec_id_state
+ ec_id_type
+ ec_last_name
+ ec_merchant_ref
+ ec_nbds_code
+ ec_other_name
+ ec_payee
+ ec_rt
+ ec_serial_number
+ ec_state
+ ec_transaction_dt
+ ec_zip
+ );
+ }
+
+ push @fields, qw(
+ grand_total
+ merchant_email
+ merchant_trace_nbr
+ original_amount
+ original_trandate_mm
+ original_trandate_dd
+ original_trandate_yyyy
+ original_reference
+ order_number
+ shipping_flag
+ shipping_prefix
+ shipping_name
+ shipping_address1
+ shipping_address2
+ shipping_city
+ shipping_state
+ shipping_zip
+ shipping_comments
+ shipping_country
+ shipping_phone
+ shipping_fax
+ shipper
+ shipper_tracking_nbr
+ track1
+ track2
+ cnp_security
+ cnp_recurring
+ );
+
+ return @fields;
+}
+
+sub GetEchoProp {
+ my( $self, $raw, $prop ) = @_;
+ local $^W=0;
+
+ my $data;
+ ($data) = $raw =~ m"<$prop>(.*?)</$prop>"gsi;
+ $data =~ s/<.*?>/ /gs;
+ chomp $data;
+ return $data;
+}
+
+# Get's a given Echo return type and strips all HTML style tags from it.
+# It also strips any new line characters from the returned string.
+#
+# This function based on Ben Reser's <breser@vecdev.com> Echo::Process
+# module.
+sub GetEchoReturn {
+ my( $self, $page, $type ) = @_;
+ local $^W=0;
+
+ my $data;
+ if ($type eq 'OPEN') {
+ ($data) = $page =~ m"<OPENECHO>(.*?)</OPENECHO>"gsi;
+ }
+ else {
+ ($data) = $page =~ m"<ECHOTYPE$type>(.*?)</ECHOTYPE$type>"gsi;
+ }
+# $data =~ s"<.*?>" "g;
+
+ #unless (length($data)) {
+ # warn "$self $page $type";
+ #}
+
+ chomp $data;
+ return $data;
+}
+
+use vars qw(%error);
+%error = (
+ "01" => [ "Refer to card issuer", "The merchant must call the issuer before the transaction can be approved." ],
+ "02" => [ "Refer to card issuer, special condition", "The merchant must call the issuer before the transaction can be approved." ],
+ "03" => [ "Invalid merchant number", "The merchant ID is not valid." ],
+ "04" => [ "Pick-up card. Capture for reward", "The card is listed on the Warning Bulletin. Merchant may receive reward money by capturing the card." ],
+ "05" => [ "Do not honor. The transaction was declined by the issuer without definition or reason", "The transaction was declined without explanation by the card issuer." ],
+ "06" => [ "Error", "The card issuer returned an error without further explanation." ],
+ "07" => [ "Pick-up card, special condition", "The card is listed on the Warning Bulletin. Merchant may receive reward money by capturing the card." ],
+ "08" => [ "Honor with identification", "Honor with identification." ],
+ "09" => [ "Request in progress", "Request in progress." ],
+ "10" => [ "Approved for partial amount", "Approved for partial amount." ],
+ "11" => [ "Approved, VIP", "Approved, VIP program." ],
+ "12" => [ "Invalid transaction", "The requested transaction is not supported or is not valid for the card number presented." ],
+ "13" => [ "Invalid amount", "The amount exceeds the limits established by the issuer for this type of transaction." ],
+ "14" => [ "Invalid card #", "The issuer indicates that this card is not valid." ],
+ "15" => [ "No such issuer", "The card issuer number is not valid." ],
+ "16" => [ "Approved, update track 3", "Approved, update track 3." ],
+ "17" => [ "Customer cancellation", "Customer cancellation." ],
+ "18" => [ "Customer dispute", "Customer dispute." ],
+ "19" => [ "Re enter transaction", "Customer should resubmit transaction." ],
+ "20" => [ "Invalid response", "Invalid response." ],
+ "21" => [ "No action taken", "No action taken. The issuer declined with no other explanation." ],
+ "22" => [ "Suspected malfunction", "Suspected malfunction." ],
+ "23" => [ "Unacceptable transaction fee", "Unacceptable transaction fee." ],
+ "24" => [ "File update not supported", "File update not supported." ],
+ "25" => [ "Unable to locate record", "Unable to locate record." ],
+ "26" => [ "Duplicate record", "Duplicate record." ],
+ "27" => [ "File update edit error", "File update edit error." ],
+ "28" => [ "File update file locked", "File update file locked." ],
+ "30" => [ "Format error, call ECHO", "The host reported that the transaction was not formatted properly." ],
+ "31" => [ "Bank not supported", "Bank not supported by switch." ],
+ "32" => [ "Completed partially", "Completed partially." ],
+ "33" => [ "Expired card, pick-up", "The card is expired. Merchant may receive reward money by capturing the card." ],
+ "34" => [ "Issuer suspects fraud, pick-up card", "The card issuer suspects fraud. Merchant may receive reward money by capturing the card." ],
+ "35" => [ "Contact acquirer, pick-up", "Contact card issuer. Merchant may receive reward money by capturing the card." ],
+ "36" => [ "Restricted card, pick-up", "The card is restricted by the issuer. Merchant may receive reward money by capturing the card." ],
+ "37" => [ "Call ECHO security, pick-up", "Contact ECHO security. Merchant may receive reward money by capturing the card." ],
+ "38" => [ "PIN tries exceeded, pick-up", "PIN attempts exceed issuer limits. Merchant may receive reward money by capturing the card." ],
+ "39" => [ "No credit account", "No credit account." ],
+ "40" => [ "Function not supported", "Requested function not supported." ],
+ "41" => [ "Lost Card, capture for reward", "The card has been reported lost." ],
+ "42" => [ "No universal account", "No universal account." ],
+ "43" => [ "Stolen Card, capture for reward", "The card has been reported stolen." ],
+ "44" => [ "No investment account", "No investment account." ],
+ "51" => [ "Not sufficient funds", "The credit limit for this account has been exceeded." ],
+ "54" => [ "Expired card", "The card is expired." ],
+ "55" => [ "Incorrect PIN", "The cardholder PIN is incorrect." ],
+ "56" => [ "No card record", "No card record." ],
+ "57" => [ "Transaction not permitted to cardholder", "The card is not allowed the type of transaction requested." ],
+ "58" => [ "Transaction not permitted on terminal", "The Merchant is not allowed this type of transaction." ],
+ "59" => [ "Suspected fraud", "Suspected fraud." ],
+ "60" => [ "Contact ECHO", "Contact ECHO." ],
+ "61" => [ "Exceeds withdrawal limit", "The amount exceeds the allowed daily maximum." ],
+ "62" => [ "Restricted card", "The card has been restricted." ],
+ "63" => [ "Security violation.", "The card has been restricted." ],
+ "64" => [ "Original amount incorrect", "Original amount incorrect." ],
+ "65" => [ "Exceeds withdrawal frequency", "The allowable number of daily transactions has been exceeded." ],
+ "66" => [ "Call acquirer security, call ECHO", "Call acquirer security, call ECHO." ],
+ "68" => [ "Response received too late", "Response received too late." ],
+ "75" => [ "PIN tries exceeded", "The allowed number of PIN retries has been exceeded." ],
+ "76" => [ "Invalid \"to\" account", "The debit account does not exist." ],
+ "77" => [ "Invalid \"from\" account", "The credit account does not exist." ],
+ "78" => [ "Invalid account specified (general)", "The associated card number account is invalid or does not exist." ],
+ "79" => [ "Already reversed", "Already reversed." ],
+ "84" => [ "Invalid authorization life cycle", "The authorization life cycle is invalid." ],
+ "86" => [ "Cannot verify PIN", "Cannot verify PIN." ],
+ "87" => [ "Network Unavailable", "Network Unavailable." ],
+ "89" => [ "Ineligible to receive financial position information", "Ineligible to receive financial position information." ],
+ "90" => [ "Cut-off in progress", "Cut-off in progress." ],
+ "91" => [ "Issuer or switch inoperative", "The bank is not available to authorize this transaction." ],
+ "92" => [ "Routing error", "The transaction cannot be routed to the authorizing agency." ],
+ "93" => [ "Violation of law", "Violation of law." ],
+ "94" => [ "Duplicate transaction", "Duplicate transaction." ],
+ "95" => [ "Reconcile error", "Reconcile error." ],
+ "96" => [ "System malfunction", "A system error has occurred." ],
+ "98" => [ "Exceeds cash limit", "Exceeds cash limit." ],
+ "1000" => [ "Unrecoverable error.", "An unrecoverable error has occurred in the ECHONLINE processing." ],
+ "1001" => [ "Account closed", "The merchant account has been closed." ],
+ "1002" => [ "System closed", "Services for this system are not available. (Not used by ECHONLINE)" ],
+ "1003" => [ "E-Mail Down", "The e-mail function is not available. (Not used by ECHONLINE)" ],
+ "1012" => [ "Invalid trans code", "The host computer received an invalid transaction code." ],
+ "1013" => [ "Invalid term id", "The ECHO-ID is invalid." ],
+ "1015" => [ "Invalid card number", "The credit card number that was sent to the host computer was invalid" ],
+ "1016" => [ "Invalid expiry date", "The card has expired or the expiration date was invalid." ],
+ "1017" => [ "Invalid amount", "The dollar amount was less than 1.00 or greater than the maximum allowed for this card." ],
+ "1019" => [ "Invalid state", "The state code was invalid. (Not used by ECHONLINE)" ],
+ "1021" => [ "Invalid service", "The merchant or card holder is not allowed to perform that kind of transaction" ],
+ "1024" => [ "Invalid auth code", "The authorization number presented with this transaction is incorrect. (deposit transactions only)" ],
+ "1025" => [ "Invalid reference number", "The reference number presented with this transaction is incorrect or is not numeric." ],
+ "1029" => [ "Invalid contract number", "The contract number presented with this transaction is incorrect or is not numeric. (Not used by ECHONLINE)" ],
+ "1030" => [ "Invalid inventory data", "The inventory data presented with this transaction is not ASCII \"printable\". (Not used by ECHONLINE)" ],
+ "1508" => [ " ", "Invalid or missing order_type." ],
+ "1509" => [ " ", "The merchant is not approved to submit this order_type." ],
+ "1510" => [ " ", "The merchant is not approved to submit this transaction_type." ],
+ #"1511" => [ " ", "Duplicate transaction attempt (see counterin Part I of this Specification</EM>)." ],
+ "1511" => [ " ", "Duplicate transaction attempt (set counter field?)." ],
+ "1599" => [ " ", "An system error occurred while validating the transaction input." ],
+ "1801" => [ "Return Code \"A\"", "Address matches; ZIP does not match." ],
+ "1802" => [ "Return Code \"W\"", "9-digit ZIP matches; Address does not match." ],
+ "1803" => [ "Return Code \"Z\"", "5-digit ZIP matches; Address does not match." ],
+ "1804" => [ "Return Codes \"U\"", "Issuer unavailable; cannot verify." ],
+ "1805" => [ "Return Code \"R\"", "Retry; system is currently unable to process." ],
+ "1806" => [ "Return Code \"S\" or \"G\"", "Issuer does not support AVS." ],
+ "1807" => [ "Return Code \"N\"", "Nothing matches." ],
+ "1808" => [ "Return Code \"E\"", "Invalid AVS only response." ],
+ "1809" => [ "Return Code \"B\"", "Street address match. Postal code not verified because of incompatible formats." ],
+ "1810" => [ "Return Code \"C\"", "Street address and Postal code not verified because of incompatible formats." ],
+ "1811" => [ "Return Code \"D\"", "Street address match and Postal code match." ],
+ "1812" => [ "Return Code \"I\"", "Address information not verified for international transaction." ],
+ "1813" => [ "Return Code \"M\"", "Street address match and Postal code match." ],
+ "1814" => [ "Return Code \"P\"", "Postal code match. Street address not verified because of incompatible formats." ],
+ "1897" => [ "invalid response", "The host returned an invalid response." ],
+ "1898" => [ "disconnect", "The host unexpectedly disconnected." ],
+ "1899" => [ "timeout", "Timeout waiting for host response." ],
+ "2071" => [ "Call VISA", "An authorization number from the VISA Voice Center is required to approve this transaction." ],
+ "2072" => [ "Call Master Card", "An authorization number from the Master Card Voice Center is required to approve this transaction." ],
+ "2073" => [ "Call Carte Blanche", "An authorization number from the Carte Blanche Voice Center is required to approve this transaction." ],
+ "2074" => [ "Call Diners Club", "An authorization number from the Diners' Club Voice Center is required to approve this transaction." ],
+ "2075" => [ "Call AMEX", "An authorization number from the American Express Voice Center is required to approve this transaction." ],
+ "2076" => [ "Call Discover", "An authorization number from the Discover Voice Center is required to approve this transaction." ],
+ "2078" => [ "Call ECHO", "The merchant must call ECHOCustomer Support for approval.or because there is a problem with the merchant's account." ],
+ "2079" => [ "Call XpresscheX", "The merchant must call ECHOCustomer Support for approval.or because there is a problem with the merchant's account." ],
+ "3001" => [ "No ACK on Resp", "The host did not receive an ACK from the terminal after sending the transaction response." ],
+ "3002" => [ "POS NAK'd 3 Times", "The host disconnected after the terminal replied 3 times to the host response with a NAK." ],
+ "3003" => [ "Drop on Wait", "The line dropped before the host could send a response to the terminal." ],
+ "3005" => [ "Drop on Resp", "The line dropped while the host was sending the response to the terminal." ],
+ "3007" => [ "Drop Before EOT", "The host received an ACK from the terminal but the line dropped before the host could send the EOT." ],
+ "3011" => [ "No Resp to ENQ", "The line was up and carrier detected, but the terminal did not respond to the ENQ." ],
+ "3012" => [ "Drop on Input", "The line disconnected while the host was receiving data from the terminal." ],
+ "3013" => [ "FEP NAK'd 3 Times", "The host disconnected after receiving 3 transmissions with incorrect LRC from the terminal." ],
+ "3014" => [ "No Resp to ENQ", "The line disconnected during input data wait in Multi-Trans Mode." ],
+ "3015" => [ "Drop on Input", "The host encountered a full queue and discarded the input data." ],
+);
+for ( 9000..9999 ) {
+ $error{$_} = [ "Host Error", "The host encountered an internal error and was not able to process the transaction." ];
+}
+sub error {
+ my( $self, $num ) = @_;
+ $num =~ s/^00(\d\d)$/$1/;
+ return $num. ': '. $error{$num}[0]. ': '. $error{$num}[1];
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Business::OnlinePayment::OpenECHO - ECHO backend module for Business::OnlinePayment
+
+=head1 SYNOPSIS
+
+ use Business::OnlinePayment;
+
+ ####
+ # One step transaction, the simple case.
+ ####
+
+ my $tx = new Business::OnlinePayment("OpenECHO");
+ $tx->content(
+ type => 'VISA',
+ login => '1234684752',
+ password => '43400210',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ card_number => '4005550000000019',
+ expiration => '08/06',
+ cvv2 => '1234', #optional
+ referer => 'http://valid.referer.url/',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ print "Card processed successfully: ".$tx->authorization."\n";
+ } else {
+ print "Card was rejected: ".$tx->error_message."\n";
+ }
+
+=head1 SUPPORTED TRANSACTION TYPES
+
+=head2 CC, Visa, MasterCard, American Express, Discover
+
+Content required: type, login, password, action, amount, first_name, last_name, card_number, expiration.
+
+=head2 Check
+
+Not yet implemented...
+#Content required: type, login, password, action, amount, first_name, last_name, account_number, routing_code, bank_name.
+
+=head1 PREREQUISITES
+
+ URI::Escape
+ Tie::IxHash
+
+ Net::SSLeay _or_ ( Crypt::SSLeay and LWP )
+
+=head1 DESCRIPTION
+
+For detailed information see L<Business::OnlinePayment>.
+
+=head1 AUTHOR
+
+Original Author
+Michael Lehmkuhl <michael@electricpulp.com>
+
+Special Thanks
+Jim Darden <jdarden@echo-inc.com>
+Dan Browning <db@kavod.com>
+
+Business::OnlinePayment Implementation
+Ivan Kohler <ivan-openecho@420.am>
+
+=head1 SEE ALSO
+
+perl(1). L<Business::OnlinePayment>.
+
+=cut
+
diff --git a/blib/lib/auto/Business/OnlinePayment/OpenECHO/.exists b/blib/lib/auto/Business/OnlinePayment/OpenECHO/.exists
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/blib/lib/auto/Business/OnlinePayment/OpenECHO/.exists
diff --git a/blib/man3/.exists b/blib/man3/.exists
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/blib/man3/.exists
diff --git a/generror/ISPGuide-Codes.asp b/generror/ISPGuide-Codes.asp
new file mode 100644
index 0000000..4f2ac4e
--- /dev/null
+++ b/generror/ISPGuide-Codes.asp
@@ -0,0 +1,1249 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<HTML>
+ <HEAD>
+ <title>V: ECHOnline Decline and Error Responses</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <style> <!-- a:hover{color:#0080FF}
+ --></style>
+ </HEAD>
+ <body bgcolor="#ffffff">
+
+<table border="0" width="100%">
+ <tr>
+ <td rowspan=2 valign=center align=middle height="48" width="50">
+
+
+ <a href="/"><img src="/images/ECHOBall3.jpg" border=0 alt="ECHO Merchant Center"></a>
+
+ </td>
+
+ <td align="left" valign="bottom">
+ <b><font size=+1>Interface Specification</b></font>
+ </td>
+
+ <td align="right" valign="bottom">
+ <font size="-1"><font face="Arial,Verdana,Helvetica"><b><i><font size=+2>ECHOnline </i></b></font></font>
+
+
+ <br><b>Document revision date 05/24/2004</b></font>
+ </td>
+ </tr>
+</table>
+
+<hr size="3" color="#000080">
+ <a href="/ISPGuide-Menu.asp">Return to the <font face="Verdana,Arial,Helvetica" size="-1">
+ <b><i>ECHO</b></I></font> <b>Internet Development Tools</b> home page.</a>
+ <h1>Part V: Decline and Error Responses</h1>
+ <p>
+ This document describes the content of an ECHOTYPE1 response containing a
+ decline or error response received from the <font face="Verdana,Arial,Helvetica" size="-1">
+ <b><i>ECHO</i></b></font> host computers. For a general description of <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i></b> responses see <a href="ISPGuide-Interface.asp#Responses">
+ Response Protocol</a>
+ in Part I of this Specification.
+ <p>
+ Host responses differ depending on the transaction code and whether or not an
+ error or decline was detected by the host. For a description of acknowledgement
+ and approval responses see <a href="ISPGuide-Response.asp"><b>Part IV: <i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i> Host Responses</b></a>
+ .
+ <p>
+ Credit card transactions and electronic check transactions differ slightly in
+ their format. For this reason they are treated separately in the sections
+ below. In the examples, the "·" character is used to indicate a space
+ character.
+ <h2>Credit Card Transactions</h2>
+ Decline and error responses are very similar in that they both represent
+ situations that prevent a transaction from being authorized. Decline codes can
+ actually represent a system error, and error codes can actually represent an
+ account restriction. The difference between the two is more of a historical
+ artifact than any distinction between an "error" and a "decline."
+ <p>
+ Decline responses are always preceded by the word "DECLINED," while error
+ responses contain various text messages from <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO</font></i></b>'s host computer or the issuer's computers.
+ Decline and error responses are described below.
+ <h3>Message Formats</h3>
+ <p>
+ Decline responses are formatted as follows.
+ <p>
+ <center>
+ <table border="1" cellpadding="3" cellspacing="0" width="80%">
+ <tr bgcolor="#e0e0e0">
+ <td valign="top"><b>Field</b></td>
+ <td valign="top"><b>Size</b></td>
+ <td valign="top"><b>Description</b></td>
+ </tr>
+ <tr>
+ <td valign="top">tag</td>
+ <td valign="top">11</td>
+ <td valign="top">"&lt;ECHOTYPE1&gt;"</td>
+ </tr>
+ <tr>
+ <td valign="top">decline</td>
+ <td valign="top">9</td>
+ <td valign="top">"DECLINED "</td>
+ </tr>
+ <tr>
+ <td valign="top">decline code
+ </td>
+ <td valign="top">2</td>
+ <td valign="top">See Decline Codes table below</td>
+ </tr>
+ <tr>
+ <td valign="top">filler</td>
+ <td valign="top">1</td>
+ <td valign="top">" " (space)</td>
+ </tr>
+ <tr>
+ <td valign="top">amount</td>
+ <td valign="top">20</td>
+ <td valign="top">Declined transaction amount. <em><b>Note</b></em>: This field is
+ right-justified with leading zeroes suppressed. Depending on the type of
+ decline, there may or may not be a "$" character in the leftmost position of
+ this field. Examples: "$bbbbbbbbbbbbbbb2.99" and "bbbbbbbbbbbbbbbb2.99"</td>
+ </tr>
+ <tr>
+ <td valign="top">tag</td>
+ <td valign="top">12</td>
+ <td valign="top">"&lt;/ECHOTYPE1&gt;"</td>
+ </tr>
+ </table>
+ </center>
+ <p>
+ Error responses are formatted as follows.
+ <p>
+ <center>
+ <table border="1" cellpadding="3" cellspacing="0" width="80%">
+ <tr bgcolor="#e0e0e0">
+ <td valign="top"><b>Field</b></td>
+ <td valign="top"><b>Size</b></td>
+ <td valign="top"><b>Description</b></td>
+ </tr>
+ <tr>
+ <td valign="top">tag</td>
+ <td valign="top">11</td>
+ <td valign="top">"&lt;ECHOTYPE1&gt;"</td>
+ </tr>
+ <tr>
+ <td valign="top">error text</td>
+ <td valign="top">20</td>
+ <td valign="top">error description</td>
+ </tr>
+ <tr>
+ <td valign="top">error code</td>
+ <td valign="top">4</td>
+ <td valign="top">See Error Codes table below</td>
+ </tr>
+ <tr>
+ <td valign="top">tag</td>
+ <td valign="top">12</td>
+ <td valign="top">"&lt;/ECHOTYPE1&gt;"</td>
+ </tr>
+ </table>
+ </center>
+ <h3>Decline Codes</h3>
+ <p>Decline codes are defined in the following table.</p>
+ <center>
+ <table border="1" cellpadding="3" cellspacing="0" width="80%">
+ <tr bgcolor="#e0e0e0">
+ <td valign="top"><b>Decline<br>
+ Code</b></td>
+ <td valign="top" width="259"><b>Short<br>
+ Description</b></td>
+ <td valign="top"><b><br>
+ Explanation</b></td>
+ </tr>
+ <tr>
+ <td valign="top">01</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Refer
+ to card issuer</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ merchant must call the issuer before the transaction can be approved.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">02</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Refer
+ to card issuer, special condition</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ merchant must call the issuer before the transaction can be approved.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">03</td>
+ <td valign="top" width="259">Invalid merchant number</td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ merchant ID is not valid.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">04</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Pick-up
+ card. Capture for reward</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card is listed on the Warning Bulletin.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant
+ may receive reward money by capturing the card.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">05</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Do
+ not honor. The transaction was declined by the issuer without definition or
+ reason</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ transaction was declined without explanation by the card issuer.</FONT></SPAN>
+ </SPAN></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">06</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Error</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card issuer returned an error without further explanation.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">07</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Pick-up
+ card, special condition</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card is listed on the Warning Bulletin.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant
+ may receive reward money by capturing the card.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">08</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Honor
+ with identification</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Honor
+ with identification.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">09</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Request
+ in progress</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Request
+ in progress.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">10</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Approved
+ for partial amount</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Approved
+ for partial amount.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 11</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Approved,
+ VIP</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Approved,
+ VIP program.</FONT></SPAN>
+ </SPAN></FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">12</td>
+ <td valign="top" width="259">Invalid transaction</td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ requested transaction is not supported or is not valid for the card number
+ presented.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">13</td>
+ <td valign="top" width="259">Invalid amount</td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ amount exceeds the limits established by the issuer for this type of
+ transaction.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">14</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Invalid
+ card #</FONT></SPAN></td>
+ <td valign="top">The issuer indicates that this card is not valid.</td>
+ </tr>
+ <tr>
+ <td valign="top">15</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ such issuer</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card issuer number is not valid.</FONT></SPAN></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">16</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Approved,
+ update track 3</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Approved,
+ update track 3.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">17</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Customer
+ cancellation</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Customer
+ cancellation.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">18</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Customer
+ dispute</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Customer
+ dispute.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">19</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Re
+ enter transaction</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Customer
+ should resubmit transaction.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">20</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Invalid
+ response</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Invalid
+ response.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">21</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ action taken</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ action taken. The issuer declined with no other explanation.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">22</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Suspected
+ malfunction</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Suspected
+ malfunction.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">23</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Unacceptable
+ transaction fee</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Unacceptable
+ transaction fee.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">24</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">File
+ update not supported</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">File
+ update not supported.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">25</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Unable
+ to locate record</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Unable
+ to locate record.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">26</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Duplicate
+ record</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Duplicate
+ record.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">27</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">File
+ update edit error</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">File
+ update edit error.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">28</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">File
+ update file locked</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">File
+ update file locked.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 29</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">30</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Format
+ error, call ECHO</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ host reported that the transaction was not formatted properly.</FONT></SPAN></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">31</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Bank
+ not supported</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Bank
+ not supported by switch.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">32</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Completed
+ partially</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Completed
+ partially.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">33</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Expired
+ card, pick-up</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card is expired.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant may
+ receive reward money by capturing the card.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">34</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Issuer
+ suspects fraud, pick-up card</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card issuer suspects fraud.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant
+ may receive reward money by capturing the card.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">35</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Contact
+ acquirer, pick-up</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Contact
+ card issuer.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant may receive
+ reward money by capturing the card.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">36</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Restricted
+ card, pick-up</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card is restricted by the issuer.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant
+ may receive reward money by capturing the card.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">37</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Call
+ ECHO security, pick-up</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Contact
+ ECHO security.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant may
+ receive reward money by capturing the card.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">38</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">PIN
+ tries exceeded, pick-up</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">PIN
+ attempts exceed issuer limits.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Merchant
+ may receive reward money by capturing the card.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">39</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ credit account</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ credit account.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 40</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Function
+ not supported</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Requested
+ function not supported.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">41</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Lost
+ Card, capture for reward</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card has been reported lost.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">42</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ universal account</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ universal account.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">43</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Stolen
+ Card, capture for reward</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card has been reported stolen.</FONT></SPAN></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">44</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ investment account</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ investment account.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">45 - 50</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">51</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Not
+ sufficient funds</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ credit limit for this account has been exceeded.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">52 - 53</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">54</td>
+ <td valign="top" width="259">Expired card</td>
+ <td valign="top">The card is expired.</td>
+ </tr>
+ <tr>
+ <td valign="top">55</td>
+ <td valign="top" width="259">Incorrect PIN</td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ cardholder PIN is incorrect.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">56</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ card record</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">No
+ card record.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">57</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Transaction
+ not permitted to cardholder</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ card is not allowed the type of transaction requested.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">58</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Transaction
+ not permitted on terminal</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ Merchant is not allowed this type of transaction.</FONT></SPAN></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">59</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Suspected
+ fraud</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Suspected
+ fraud.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 60</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Contact
+ ECHO</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Contact
+ ECHO.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">61</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Exceeds
+ withdrawal limit</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ amount exceeds the allowed daily maximum.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">62</td>
+ <td valign="top" width="259">Restricted card</td>
+ <td valign="top">The card has been restricted.</td>
+ </tr>
+ <tr>
+ <td valign="top">63</td>
+ <td valign="top" width="259">Security violation.</td>
+ <td valign="top">The card has been restricted.</td>
+ </tr>
+ <tr>
+ <td valign="top">64</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Original
+ amount incorrect</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Original
+ amount incorrect.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">65</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Exceeds
+ withdrawal frequency</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ allowable number of daily transactions has been exceeded.</FONT></SPAN></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">66</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Call
+ acquirer security, call ECHO</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Call
+ acquirer security, call ECHO.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 67</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <TR>
+ <TD vAlign="top">68</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Response
+ received too late</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Response
+ received too late.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">69 - 74</TD>
+ <TD vAlign="top" width="259">not used</TD>
+ <TD vAlign="top">&nbsp;</TD>
+ </TR>
+ <tr>
+ <td valign="top">75</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">PIN
+ tries exceeded</FONT></SPAN></td>
+ <td valign="top">The allowed number of PIN retries has been exceeded.</td>
+ </tr>
+ <tr>
+ <td valign="top">76</td>
+ <td valign="top" width="259">Invalid "to" account</td>
+ <td valign="top">The debit account does not exist.</td>
+ </tr>
+ <tr>
+ <td valign="top">77</td>
+ <td valign="top" width="259">Invalid "from" account</td>
+ <td valign="top">The credit account does not exist.</td>
+ </tr>
+ <tr>
+ <td valign="top">78</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Invalid
+ account specified (general)</FONT></SPAN></td>
+ <td valign="top">
+ The associated card number account is invalid or does not exist.</td>
+ </tr>
+ <TR>
+ <TD vAlign="top">79</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Already
+ reversed</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Already
+ reversed.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">80&nbsp;- 83</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">84</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Invalid
+ authorization life cycle</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">The
+ authorization life cycle is invalid.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">85&nbsp;</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <TR>
+ <TD vAlign="top">86</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Cannot
+ verify PIN</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Cannot
+ verify PIN.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">87</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Network
+ Unavailable</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Network
+ Unavailable.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">88</TD>
+ <TD vAlign="top" width="259">not used</TD>
+ <TD vAlign="top">&nbsp;</TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">89</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Ineligible
+ to receive financial position information</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Ineligible
+ to receive financial position information.</FONT></SPAN></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">90</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Cut-off
+ in progress</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Cut-off
+ in progress.</FONT></SPAN></TD>
+ </TR>
+ <tr>
+ <td valign="top">91</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Issuer
+ or switch inoperative</FONT></SPAN></td>
+ <td valign="top">The bank is not available to authorize this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">92</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Routing
+ error</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT size="3"><FONT face="Times New Roman">The
+ transaction cannot be routed to the authorizing agency.</FONT></FONT>
+ </SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">93</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Violation
+ of law</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Violation
+ of law.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">94</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Duplicate
+ transaction</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Duplicate
+ transaction.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">95</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Reconcile
+ error</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Reconcile
+ error.</FONT></SPAN></td>
+ </tr>
+ <tr>
+ <td valign="top">96</td>
+ <td valign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">System
+ malfunction</FONT></SPAN></td>
+ <td valign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">A
+ system error has occurred.</FONT></SPAN></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">97</TD>
+ <TD vAlign="top" width="259">not used</TD>
+ <TD vAlign="top">&nbsp;</TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">98</TD>
+ <TD vAlign="top" width="259"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Exceeds
+ cash limit</FONT></SPAN></TD>
+ <TD vAlign="top"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><FONT face="Times New Roman" size="3">Exceeds
+ cash limit.</FONT></SPAN></TD>
+ </TR>
+ </table>
+ </center>
+ <p>
+ Error codes are defined in the following table.</p>
+ <center>
+ <table border="1" cellpadding="3" cellspacing="0" width="80%">
+ <tr bgcolor="#e0e0e0">
+ <td valign="top"><b>Error<br>
+ Code</b></td>
+ <td valign="top"><b>Short<br>
+ Description</b></td>
+ <td valign="top"><b><br>
+ Explanation</b></td>
+ </tr>
+ <tr>
+ <td valign="top">1000</td>
+ <td valign="top">Unrecoverable error.</td>
+ <td valign="top">An unrecoverable error has occurred in the <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i></b> processing.</td>
+ </tr>
+ <tr>
+ <td valign="top">1001</td>
+ <td valign="top">Account closed</td>
+ <td valign="top">The merchant account has been closed.</td>
+ </tr>
+ <tr>
+ <td valign="top">1002</td>
+ <td valign="top">System closed</td>
+ <td valign="top">
+ Services for this system are not available.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1003</td>
+ <td valign="top">E-Mail Down</td>
+ <td valign="top">The e-mail function is not available.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1004-1011</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1012</td>
+ <td valign="top">Invalid trans code</td>
+ <td valign="top">The host computer received an invalid transaction code.</td>
+ </tr>
+ <tr>
+ <td valign="top">1013</td>
+ <td valign="top">Invalid term id</td>
+ <td valign="top">The ECHO-ID is invalid.</td>
+ </tr>
+ <tr>
+ <td valign="top">1014</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1015</td>
+ <td valign="top">Invalid card number</td>
+ <td valign="top">The credit card number that was sent to the host computer was
+ invalid</td>
+ </tr>
+ <tr>
+ <td valign="top">1016</td>
+ <td valign="top">Invalid expiry date</td>
+ <td valign="top">The card has expired or the expiration date was invalid.</td>
+ </tr>
+ <tr>
+ <td valign="top">1017</td>
+ <td valign="top">Invalid amount</td>
+ <td valign="top">The dollar amount was less than 1.00 or greater than the maximum
+ allowed for this card.</td>
+ </tr>
+ <tr>
+ <td valign="top">1018</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1019</td>
+ <td valign="top">Invalid state</td>
+ <td valign="top">The state code was invalid.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1020</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1021</td>
+ <td valign="top">Invalid service</td>
+ <td valign="top">The merchant or card holder is not allowed to perform that kind of
+ transaction</td>
+ </tr>
+ <tr>
+ <td valign="top">1022-1023</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1024</td>
+ <td valign="top">Invalid auth code</td>
+ <td valign="top">The authorization number presented with this transaction is
+ incorrect. (deposit transactions only)</td>
+ </tr>
+ <tr>
+ <td valign="top">1025</td>
+ <td valign="top">Invalid reference number</td>
+ <td valign="top">The reference number presented with this transaction is incorrect
+ or is not numeric.</td>
+ </tr>
+ <tr>
+ <td valign="top">1026-1028</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1029</td>
+ <td valign="top">Invalid contract number</td>
+ <td valign="top">The contract number presented with this transaction is incorrect
+ or is not numeric.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1030</td>
+ <td valign="top">Invalid inventory data</td>
+ <td valign="top">The inventory data presented with this transaction is not ASCII
+ "printable".<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1031-1500</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <i>Error Codes 1501 through 1599 are generated by <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i></b> after validating
+ the merchant but before presenting the transaction to the host computers for
+ processing.</i>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1501-1507</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1508</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">Invalid or missing order_type.</td>
+ </tr>
+ <tr>
+ <td valign="top">1509</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">The merchant is not approved to submit this order_type.</td>
+ </tr>
+ <tr>
+ <td valign="top">1510</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">The merchant is not approved to submit this transaction_type.</td>
+ </tr>
+ <tr>
+ <td valign="top">1511</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">
+ Duplicate transaction attempt (see <a href="ISPGuide-Interface.asp#counter">counter</a>
+ in Part I of this Specification</EM>).
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1512-1598</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1599</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">An system error occurred while validating the transaction input.</td>
+ </tr>
+ <tr>
+ <td valign="top">1600-1800</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <i>Error Codes 1801 through 1814 are generated by <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i></b> to indicate
+ responses to <a href="ISPGuide-Response.asp#AVSOnly">AVS-Only transactions</a> when
+ the response is anything but "X" or "Y" (all digits match).</i>
+ </td>
+ </tr>
+ <tr>
+ <td>1801</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "A"</a></td>
+ <td>Address matches; ZIP does not match.</td>
+ </tr>
+ <tr>
+ <td>1802</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "W"</a></td>
+ <td>9-digit ZIP matches; Address does not match.</td>
+ </tr>
+ <tr>
+ <td>1803</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "Z"</a></td>
+ <td>5-digit ZIP matches; Address does not match.</td>
+ </tr>
+ <tr>
+ <td>1804</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Codes "U"</a></td>
+ <td>Issuer unavailable; cannot verify.</td>
+ </tr>
+ <tr>
+ <td>1805</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "R"</a></td>
+ <td>Retry; system is currently unable to process.</td>
+ </tr>
+ <tr>
+ <td>1806</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "S" or "G"</a></td>
+ <td>Issuer does not support AVS.</td>
+ </tr>
+ <tr>
+ <td>1807</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "N"</a></td>
+ <td>Nothing matches.</td>
+ </tr>
+ <tr>
+ <td>1808</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "E"</a></td>
+ <td>Invalid AVS only response.</td>
+ </tr>
+ <tr>
+ <td>1809</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "B"</a></td>
+ <td>Street address match. Postal code not verified because of incompatible formats.</td>
+ </tr>
+ <tr>
+ <td>1810</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "C"</a></td>
+ <td>Street address and Postal code not verified because of incompatible formats.</td>
+ </tr>
+ <tr>
+ <td>1811</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "D"</a></td>
+ <td>Street address match and Postal code match.</td>
+ </tr>
+ <tr>
+ <td>1812</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "I"</a></td>
+ <td>Address information not verified for international transaction.</td>
+ </tr>
+ <tr>
+ <td>1813</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "M"</a></td>
+ <td>Street address match and Postal code match.</td>
+ </tr>
+ <tr>
+ <td>1814</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "P"</a></td>
+ <td>Postal code match. Street address not verified because of incompatible formats.</td>
+ </tr>
+ <tr>
+ <td>1815-1896</td>
+ <td>not used</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1897</td>
+ <td valign="top">invalid response</td>
+ <td valign="top">The host returned an invalid response.</td>
+ </tr>
+ <tr>
+ <td valign="top">1898</td>
+ <td valign="top">disconnect</td>
+ <td valign="top">The host unexpectedly disconnected.</td>
+ </tr>
+ <tr>
+ <td valign="top">1899</td>
+ <td valign="top">timeout</td>
+ <td valign="top">Timeout waiting for host response.</td>
+ </tr>
+ <tr>
+ <td valign="top">1900-2070</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">2071</td>
+ <td valign="top">Call VISA</td>
+ <td valign="top">An authorization number from the VISA Voice Center is required to
+ approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2072</td>
+ <td valign="top">Call Master Card</td>
+ <td valign="top">An authorization number from the Master Card Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2073</td>
+ <td valign="top">Call Carte Blanche</td>
+ <td valign="top">An authorization number from the Carte Blanche Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2074</td>
+ <td valign="top">Call Diners Club</td>
+ <td valign="top">An authorization number from the Diners' Club Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2075</td>
+ <td valign="top">Call AMEX</td>
+ <td valign="top">An authorization number from the American Express Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2076</td>
+ <td valign="top">Call Discover</td>
+ <td valign="top">An authorization number from the Discover Voice Center is required
+ to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2077</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">2078</td>
+ <td valign="top">Call ECHO</td>
+ <td valign="top">The merchant must call <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO</font></i></b>
+ Customer Support for approval.or because there is a problem with the merchant's
+ account.</td>
+ </tr>
+ <tr>
+ <td>2079</td>
+ <td>Call XpresscheX</td>
+ <td>The merchant must call <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO</font></i></b>
+ Customer Support for approval.or because there is a problem with the merchant's
+ account.</td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <i>The remaining error codes are generated by the <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO</font></i></b> host computers in response to errors in the
+ dial-up protocol. These messages should never appear in <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i></b>. They are listed
+ below for completeness. </i>
+ </td>
+ </tr>
+ <tr>
+ <td>3001</td>
+ <td>No ACK on Resp</td>
+ <td>The host did not receive an ACK from the terminal after sending the transaction
+ response.</td>
+ </tr>
+ <tr>
+ <td>3002</td>
+ <td>POS NAK'd 3 Times</td>
+ <td>The host disconnected after the terminal replied 3 times to the host response
+ with a NAK.</td>
+ </tr>
+ <tr>
+ <td>3003</td>
+ <td>Drop on Wait</td>
+ <td>The line dropped before the host could send a response to the terminal.</td>
+ </tr>
+ <tr>
+ <td>3005</td>
+ <td>Drop on Resp</td>
+ <td>The line dropped while the host was sending the response to the terminal.</td>
+ </tr>
+ <tr>
+ <td>3007</td>
+ <td>Drop Before EOT</td>
+ <td>The host received an ACK from the terminal but the line dropped before the host
+ could send the EOT.</td>
+ </tr>
+ <tr>
+ <td>3011</td>
+ <td>No Resp to ENQ</td>
+ <td>The line was up and carrier detected, but the terminal did not respond to the
+ ENQ.</td>
+ </tr>
+ <tr>
+ <td>3012</td>
+ <td>Drop on Input</td>
+ <td>The line disconnected while the host was receiving data from the terminal.</td>
+ </tr>
+ <tr>
+ <td>3013</td>
+ <td>FEP NAK'd 3 Times</td>
+ <td>The host disconnected after receiving 3 transmissions with incorrect LRC from
+ the terminal.</td>
+ </tr>
+ <tr>
+ <td>3014</td>
+ <td>No Resp to ENQ</td>
+ <td>The line disconnected during input data wait in Multi-Trans Mode.</td>
+ </tr>
+ <tr>
+ <td>3015</td>
+ <td>Drop on Input</td>
+ <td>The host encountered a full queue and discarded the input data.</td>
+ </tr>
+ <tr>
+ <td>9000-9999</td>
+ <td>Host Error</td>
+ <td>The host encountered an internal error and was not able to process the
+ transaction.</td>
+ </tr>
+ </table>
+ </center>
+ <h2>Electronic Check Transactions</h2>
+ <FONT face="Verdana,Arial,Helvetica" size="-1"><B><I>ECHO</I></B></FONT> verifies
+ all electronic checks against the National Check Information Systems (NCIS)
+ database. This is a real-time check verification system that can return a wide
+ variety of responses and conditions. <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>
+ does nor recognize a warning response, only approvals and declines. Therefore,
+ warnings received from NCIS are treated as declines by <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i></b>.
+ <p>
+ Decline responses are formatted as shown below. Each message is 16 characters
+ long and contains information regarding the reasons for the decline or warning
+ and the name and contact number for the agency providing the information
+ leading to the decline.
+ <p>
+ The NCN Response Format.pdf document located in the <A href="/XCXPlusTrans.zip"><I><FONT face="Verdana,Arial,Helvetica" size="-1">
+ X<FONT size="-2">PRESS</FONT>C<FONT size="-2">HE</FONT>X<FONT size="-2">PLUS</FONT></FONT></I>
+ Transaction Validation Tool</A>
+ contains all Check Verification Responses.
+ <p>
+ <center>
+ <table border="1" cellpadding="3" cellspacing="0" width="80%">
+ <tr bgcolor="#e0e0e0">
+ <td valign="top"><b>Field</b></td>
+ <td valign="top"><b>Size</b></td>
+ <td valign="top"><b>Description</b></td>
+ </tr>
+ <tr>
+ <td valign="top">tag</td>
+ <td valign="top">11</td>
+ <td valign="top">"&lt;ECHOTYPE1&gt;"</td>
+ </tr>
+ <tr>
+ <td valign="top">message</td>
+ <td valign="top">16</td>
+ <td valign="top">
+ Decline message (see examples below).
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">message</td>
+ <td valign="top">16</td>
+ <td valign="top">
+ from 0 to <i>n</i> instances of additional decline and warning messages.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">tag</td>
+ <td valign="top">12</td>
+ <td valign="top">"&lt;/ECHOTYPE1&gt;"</td>
+ </tr>
+ </table>
+ </center>
+ <p>
+ <b>Examples:</b><br>
+ The first example shows a decline response containing 7 separate
+ messages.&lt;p&gt;&lt;code&gt;&lt;!--&lt;ECHOTYPE1&gt;DECLINE·CHECK···50·UNPAIDS·(ALL)UNPAID·AMT=·3778PHN·800-555-4503···CHKACHEK·····PHN·800-555-2954····XPCK!·······&lt;/ECHOTYPE1&gt;--&gt;&lt;br&gt;&lt;!--&lt;ECHOTYPE1&gt;WARNING·········DAYLOC/NCHCKS=14DAYLOC/AMT=45···WINLOC/AMT=12···&lt;/ECHOTYPE1&gt;
+ --&gt;<BR>
+ &lt;!-- &lt;ECHOTYPE1&gt;ERROR IN ID·····&lt;/ECHOTYPE1&gt; --&gt;<BR>
+ &lt;!--
+ &lt;ECHOTYPE1&gt;DECLINE·CHECK····2·UNPAIDS·(LOC)UNPAID·AMT=··376BANK·STOP·······PHN
+ 800-555-4503SUPER·COLLECT···&lt;/ECHOTYPE1&gt; --&gt;<BR>
+ &lt;!-- &lt;ECHOTYPE1&gt;RE-PRESENTED CHK&lt;/ECHOTYPE1&gt; --&gt; </CODE>
+ <p>
+ <b>Note:</b><br>
+ All Electronic Check Declines return a Decline Code of "0005" in the ECHOTYPE3
+ &lt;decline_code&gt; tag (i.e., &lt;decline_code&gt;0005&lt;/decline_code&gt;
+ ). To determine the exact reason for the decline, the ECHOTYPE1 response must
+ be examined.
+ <p>
+ <hr size="3" color="#000080">
+
+<SCRIPT LANGUAGE=JAVASCRIPT>
+/* Opens a new Window linking to the supplied url */
+function popUp(url){
+sealWin=window.open(url,"win",'toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=1,resizable=1,width=500,height=520');
+self.name = "mainWin"; }
+</SCRIPT>
+
+<center>
+<font size="-2" face="Verdana,Arial,Helvetica">
+
+<a href="/">Merchant Center</a>&nbsp;
+<a href="http://www.echo-inc.com/">ECHO Home</a>&nbsp;
+<a href="mailto:webmaster@echo-inc.com">Feedback</a>&nbsp;
+<a href="http://www.echo-inc.com/helpdesk.html">Contact ECHO</a>&nbsp;
+<a href="javascript:popUp('/copyright.asp')">Copyright</a>&nbsp;
+
+
+ <a href="/login.asp">Login</a>
+
+
+</font>
+</center>
+
+</body>
+</html>
+</body>
+</HTML>
diff --git a/generror/errortable.html b/generror/errortable.html
new file mode 100644
index 0000000..b225355
--- /dev/null
+++ b/generror/errortable.html
@@ -0,0 +1,961 @@
+ <tr>
+ <td valign="top">01</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Refer
+ to card issuer</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ merchant must call the issuer before the transaction can be approved.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">02</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Refer
+ to card issuer, special condition</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ merchant must call the issuer before the transaction can be approved.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">03</td>
+ <td valign="top" width="259">Invalid merchant number</td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ merchant ID is not valid.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">04</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Pick-up
+ card. Capture for reward</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ card is listed on the Warning Bulletin.&nbsp; Merchant
+ may receive reward money by capturing the card.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">05</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Do
+ not honor. The transaction was declined by the issuer without definition or
+ reason</FONT></td>
+ <td valign="top">The
+ transaction was declined without explanation by the card issuer.</FONT>
+ </td>
+ </tr>
+ <TR>
+ <TD vAlign="top">06</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Error</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">The
+ card issuer returned an error without further explanation.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">07</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Pick-up
+ card, special condition</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">The
+ card is listed on the Warning Bulletin.&nbsp; Merchant
+ may receive reward money by capturing the card.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">08</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Honor
+ with identification</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Honor
+ with identification.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">09</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Request
+ in progress</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Request
+ in progress.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">10</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Approved
+ for partial amount</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Approved
+ for partial amount.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 11</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Approved,
+ VIP</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3"><FONT face="Times New Roman" size="3">Approved,
+ VIP program.</FONT>
+ </FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">12</td>
+ <td valign="top" width="259">Invalid transaction</td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ requested transaction is not supported or is not valid for the card number
+ presented.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">13</td>
+ <td valign="top" width="259">Invalid amount</td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ amount exceeds the limits established by the issuer for this type of
+ transaction.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">14</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Invalid
+ card #</FONT></td>
+ <td valign="top">The issuer indicates that this card is not valid.</td>
+ </tr>
+ <tr>
+ <td valign="top">15</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">No
+ such issuer</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ card issuer number is not valid.</FONT></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">16</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Approved,
+ update track 3</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Approved,
+ update track 3.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">17</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Customer
+ cancellation</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Customer
+ cancellation.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">18</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Customer
+ dispute</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Customer
+ dispute.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">19</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Re
+ enter transaction</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Customer
+ should resubmit transaction.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">20</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Invalid
+ response</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Invalid
+ response.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">21</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">No
+ action taken</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">No
+ action taken. The issuer declined with no other explanation.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">22</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Suspected
+ malfunction</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Suspected
+ malfunction.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">23</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Unacceptable
+ transaction fee</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Unacceptable
+ transaction fee.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">24</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">File
+ update not supported</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">File
+ update not supported.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">25</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Unable
+ to locate record</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Unable
+ to locate record.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">26</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Duplicate
+ record</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Duplicate
+ record.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">27</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">File
+ update edit error</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">File
+ update edit error.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">28</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">File
+ update file locked</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">File
+ update file locked.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 29</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">30</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Format
+ error, call ECHO</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ host reported that the transaction was not formatted properly.</FONT></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">31</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Bank
+ not supported</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Bank
+ not supported by switch.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">32</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Completed
+ partially</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Completed
+ partially.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">33</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Expired
+ card, pick-up</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">The
+ card is expired.&nbsp; Merchant may
+ receive reward money by capturing the card.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">34</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Issuer
+ suspects fraud, pick-up card</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">The
+ card issuer suspects fraud.&nbsp; Merchant
+ may receive reward money by capturing the card.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">35</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Contact
+ acquirer, pick-up</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Contact
+ card issuer.&nbsp; Merchant may receive
+ reward money by capturing the card.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">36</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Restricted
+ card, pick-up</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">The
+ card is restricted by the issuer.&nbsp; Merchant
+ may receive reward money by capturing the card.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">37</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Call
+ ECHO security, pick-up</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Contact
+ ECHO security.&nbsp; Merchant may
+ receive reward money by capturing the card.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">38</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">PIN
+ tries exceeded, pick-up</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">PIN
+ attempts exceed issuer limits.&nbsp; Merchant
+ may receive reward money by capturing the card.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">39</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">No
+ credit account</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">No
+ credit account.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 40</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Function
+ not supported</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">Requested
+ function not supported.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">41</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Lost
+ Card, capture for reward</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ card has been reported lost.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">42</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">No
+ universal account</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">No
+ universal account.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">43</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Stolen
+ Card, capture for reward</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ card has been reported stolen.</FONT></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">44</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">No
+ investment account</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">No
+ investment account.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">45 - 50</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">51</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Not
+ sufficient funds</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ credit limit for this account has been exceeded.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">52 - 53</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">54</td>
+ <td valign="top" width="259">Expired card</td>
+ <td valign="top">The card is expired.</td>
+ </tr>
+ <tr>
+ <td valign="top">55</td>
+ <td valign="top" width="259">Incorrect PIN</td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ cardholder PIN is incorrect.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">56</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">No
+ card record</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">No
+ card record.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">57</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Transaction
+ not permitted to cardholder</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ card is not allowed the type of transaction requested.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">58</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Transaction
+ not permitted on terminal</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ Merchant is not allowed this type of transaction.</FONT></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">59</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Suspected
+ fraud</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Suspected
+ fraud.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 60</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Contact
+ ECHO</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">Contact
+ ECHO.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">61</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Exceeds
+ withdrawal limit</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ amount exceeds the allowed daily maximum.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">62</td>
+ <td valign="top" width="259">Restricted card</td>
+ <td valign="top">The card has been restricted.</td>
+ </tr>
+ <tr>
+ <td valign="top">63</td>
+ <td valign="top" width="259">Security violation.</td>
+ <td valign="top">The card has been restricted.</td>
+ </tr>
+ <tr>
+ <td valign="top">64</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Original
+ amount incorrect</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">Original
+ amount incorrect.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">65</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Exceeds
+ withdrawal frequency</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ allowable number of daily transactions has been exceeded.</FONT></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">66</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Call
+ acquirer security, call ECHO</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Call
+ acquirer security, call ECHO.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">
+ 67</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <TR>
+ <TD vAlign="top">68</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Response
+ received too late</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Response
+ received too late.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">69 - 74</TD>
+ <TD vAlign="top" width="259">not used</TD>
+ <TD vAlign="top">&nbsp;</TD>
+ </TR>
+ <tr>
+ <td valign="top">75</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">PIN
+ tries exceeded</FONT></td>
+ <td valign="top">The allowed number of PIN retries has been exceeded.</td>
+ </tr>
+ <tr>
+ <td valign="top">76</td>
+ <td valign="top" width="259">Invalid "to" account</td>
+ <td valign="top">The debit account does not exist.</td>
+ </tr>
+ <tr>
+ <td valign="top">77</td>
+ <td valign="top" width="259">Invalid "from" account</td>
+ <td valign="top">The credit account does not exist.</td>
+ </tr>
+ <tr>
+ <td valign="top">78</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Invalid
+ account specified (general)</FONT></td>
+ <td valign="top">
+ The associated card number account is invalid or does not exist.</td>
+ </tr>
+ <TR>
+ <TD vAlign="top">79</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Already
+ reversed</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Already
+ reversed.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">80&nbsp;- 83</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">84</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Invalid
+ authorization life cycle</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">The
+ authorization life cycle is invalid.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">85&nbsp;</td>
+ <td valign="top" width="259">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <TR>
+ <TD vAlign="top">86</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Cannot
+ verify PIN</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Cannot
+ verify PIN.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">87</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Network
+ Unavailable</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Network
+ Unavailable.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">88</TD>
+ <TD vAlign="top" width="259">not used</TD>
+ <TD vAlign="top">&nbsp;</TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">89</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Ineligible
+ to receive financial position information</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Ineligible
+ to receive financial position information.</FONT></TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">90</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Cut-off
+ in progress</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Cut-off
+ in progress.</FONT></TD>
+ </TR>
+ <tr>
+ <td valign="top">91</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Issuer
+ or switch inoperative</FONT></td>
+ <td valign="top">The bank is not available to authorize this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">92</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Routing
+ error</FONT></td>
+ <td valign="top"><FONT size="3"><FONT face="Times New Roman">The
+ transaction cannot be routed to the authorizing agency.</FONT></FONT>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">93</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Violation
+ of law</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">Violation
+ of law.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">94</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Duplicate
+ transaction</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">Duplicate
+ transaction.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">95</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">Reconcile
+ error</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">Reconcile
+ error.</FONT></td>
+ </tr>
+ <tr>
+ <td valign="top">96</td>
+ <td valign="top" width="259"><FONT face="Times New Roman" size="3">System
+ malfunction</FONT></td>
+ <td valign="top"><FONT face="Times New Roman" size="3">A
+ system error has occurred.</FONT></td>
+ </tr>
+ <TR>
+ <TD vAlign="top">97</TD>
+ <TD vAlign="top" width="259">not used</TD>
+ <TD vAlign="top">&nbsp;</TD>
+ </TR>
+ <TR>
+ <TD vAlign="top">98</TD>
+ <TD vAlign="top" width="259"><FONT face="Times New Roman" size="3">Exceeds
+ cash limit</FONT></TD>
+ <TD vAlign="top"><FONT face="Times New Roman" size="3">Exceeds
+ cash limit.</FONT></TD>
+ </TR>
+
+
+
+ <tr>
+ <td valign="top">1000</td>
+ <td valign="top">Unrecoverable error.</td>
+ <td valign="top">An unrecoverable error has occurred in the <b><i><font face="Verdana,Arial,Helvetica" size="-1">
+ ECHO<font size="-2">NLINE</font></font></i></b> processing.</td>
+ </tr>
+ <tr>
+ <td valign="top">1001</td>
+ <td valign="top">Account closed</td>
+ <td valign="top">The merchant account has been closed.</td>
+ </tr>
+ <tr>
+ <td valign="top">1002</td>
+ <td valign="top">System closed</td>
+ <td valign="top">
+ Services for this system are not available.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1003</td>
+ <td valign="top">E-Mail Down</td>
+ <td valign="top">The e-mail function is not available.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1004-1011</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1012</td>
+ <td valign="top">Invalid trans code</td>
+ <td valign="top">The host computer received an invalid transaction code.</td>
+ </tr>
+ <tr>
+ <td valign="top">1013</td>
+ <td valign="top">Invalid term id</td>
+ <td valign="top">The ECHO-ID is invalid.</td>
+ </tr>
+ <tr>
+ <td valign="top">1014</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1015</td>
+ <td valign="top">Invalid card number</td>
+ <td valign="top">The credit card number that was sent to the host computer was
+ invalid</td>
+ </tr>
+ <tr>
+ <td valign="top">1016</td>
+ <td valign="top">Invalid expiry date</td>
+ <td valign="top">The card has expired or the expiration date was invalid.</td>
+ </tr>
+ <tr>
+ <td valign="top">1017</td>
+ <td valign="top">Invalid amount</td>
+ <td valign="top">The dollar amount was less than 1.00 or greater than the maximum
+ allowed for this card.</td>
+ </tr>
+ <tr>
+ <td valign="top">1018</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1019</td>
+ <td valign="top">Invalid state</td>
+ <td valign="top">The state code was invalid.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1020</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1021</td>
+ <td valign="top">Invalid service</td>
+ <td valign="top">The merchant or card holder is not allowed to perform that kind of
+ transaction</td>
+ </tr>
+ <tr>
+ <td valign="top">1022-1023</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1024</td>
+ <td valign="top">Invalid auth code</td>
+ <td valign="top">The authorization number presented with this transaction is
+ incorrect. (deposit transactions only)</td>
+ </tr>
+ <tr>
+ <td valign="top">1025</td>
+ <td valign="top">Invalid reference number</td>
+ <td valign="top">The reference number presented with this transaction is incorrect
+ or is not numeric.</td>
+ </tr>
+ <tr>
+ <td valign="top">1026-1028</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1029</td>
+ <td valign="top">Invalid contract number</td>
+ <td valign="top">The contract number presented with this transaction is incorrect
+ or is not numeric.<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1030</td>
+ <td valign="top">Invalid inventory data</td>
+ <td valign="top">The inventory data presented with this transaction is not ASCII
+ "printable".<br>
+ (Not used by <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO<font size="-2">NLINE</font></font></i></b>)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1031-1500</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+
+
+ <tr>
+ <td valign="top">1501-1507</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1508</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">Invalid or missing order_type.</td>
+ </tr>
+ <tr>
+ <td valign="top">1509</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">The merchant is not approved to submit this order_type.</td>
+ </tr>
+ <tr>
+ <td valign="top">1510</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">The merchant is not approved to submit this transaction_type.</td>
+ </tr>
+ <tr>
+ <td valign="top">1511</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">
+ Duplicate transaction attempt (see <a href="ISPGuide-Interface.asp#counter">counter</a>
+ in Part I of this Specification</EM>).
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">1512-1598</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1599</td>
+ <td valign="top">&nbsp;</td>
+ <td valign="top">An system error occurred while validating the transaction input.</td>
+ </tr>
+ <tr>
+ <td valign="top">1600-1800</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td>1801</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "A"</a></td>
+ <td>Address matches; ZIP does not match.</td>
+ </tr>
+ <tr>
+ <td>1802</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "W"</a></td>
+ <td>9-digit ZIP matches; Address does not match.</td>
+ </tr>
+ <tr>
+ <td>1803</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "Z"</a></td>
+ <td>5-digit ZIP matches; Address does not match.</td>
+ </tr>
+ <tr>
+ <td>1804</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Codes "U"</a></td>
+ <td>Issuer unavailable; cannot verify.</td>
+ </tr>
+ <tr>
+ <td>1805</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "R"</a></td>
+ <td>Retry; system is currently unable to process.</td>
+ </tr>
+ <tr>
+ <td>1806</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "S" or "G"</a></td>
+ <td>Issuer does not support AVS.</td>
+ </tr>
+ <tr>
+ <td>1807</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "N"</a></td>
+ <td>Nothing matches.</td>
+ </tr>
+ <tr>
+ <td>1808</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "E"</a></td>
+ <td>Invalid AVS only response.</td>
+ </tr>
+ <tr>
+ <td>1809</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "B"</a></td>
+ <td>Street address match. Postal code not verified because of incompatible formats.</td>
+ </tr>
+ <tr>
+ <td>1810</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "C"</a></td>
+ <td>Street address and Postal code not verified because of incompatible formats.</td>
+ </tr>
+ <tr>
+ <td>1811</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "D"</a></td>
+ <td>Street address match and Postal code match.</td>
+ </tr>
+ <tr>
+ <td>1812</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "I"</a></td>
+ <td>Address information not verified for international transaction.</td>
+ </tr>
+ <tr>
+ <td>1813</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "M"</a></td>
+ <td>Street address match and Postal code match.</td>
+ </tr>
+ <tr>
+ <td>1814</td>
+ <td><a href="ISPGuide-Response.asp#AVSOnly">Return Code "P"</a></td>
+ <td>Postal code match. Street address not verified because of incompatible formats.</td>
+ </tr>
+ <tr>
+ <td>1815-1896</td>
+ <td>not used</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">1897</td>
+ <td valign="top">invalid response</td>
+ <td valign="top">The host returned an invalid response.</td>
+ </tr>
+ <tr>
+ <td valign="top">1898</td>
+ <td valign="top">disconnect</td>
+ <td valign="top">The host unexpectedly disconnected.</td>
+ </tr>
+ <tr>
+ <td valign="top">1899</td>
+ <td valign="top">timeout</td>
+ <td valign="top">Timeout waiting for host response.</td>
+ </tr>
+ <tr>
+ <td valign="top">1900-2070</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">2071</td>
+ <td valign="top">Call VISA</td>
+ <td valign="top">An authorization number from the VISA Voice Center is required to
+ approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2072</td>
+ <td valign="top">Call Master Card</td>
+ <td valign="top">An authorization number from the Master Card Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2073</td>
+ <td valign="top">Call Carte Blanche</td>
+ <td valign="top">An authorization number from the Carte Blanche Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2074</td>
+ <td valign="top">Call Diners Club</td>
+ <td valign="top">An authorization number from the Diners' Club Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2075</td>
+ <td valign="top">Call AMEX</td>
+ <td valign="top">An authorization number from the American Express Voice Center is
+ required to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2076</td>
+ <td valign="top">Call Discover</td>
+ <td valign="top">An authorization number from the Discover Voice Center is required
+ to approve this transaction.</td>
+ </tr>
+ <tr>
+ <td valign="top">2077</td>
+ <td valign="top">not used</td>
+ <td valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top">2078</td>
+ <td valign="top">Call ECHO</td>
+ <td valign="top">The merchant must call <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO</font></i></b>
+ Customer Support for approval.or because there is a problem with the merchant's
+ account.</td>
+ </tr>
+ <tr>
+ <td>2079</td>
+ <td>Call XpresscheX</td>
+ <td>The merchant must call <b><i><font face="Verdana,Arial,Helvetica" size="-1">ECHO</font></i></b>
+ Customer Support for approval.or because there is a problem with the merchant's
+ account.</td>
+ </tr>
+
+ <tr>
+ <td>3001</td>
+ <td>No ACK on Resp</td>
+ <td>The host did not receive an ACK from the terminal after sending the transaction
+ response.</td>
+ </tr>
+ <tr>
+ <td>3002</td>
+ <td>POS NAK'd 3 Times</td>
+ <td>The host disconnected after the terminal replied 3 times to the host response
+ with a NAK.</td>
+ </tr>
+ <tr>
+ <td>3003</td>
+ <td>Drop on Wait</td>
+ <td>The line dropped before the host could send a response to the terminal.</td>
+ </tr>
+ <tr>
+ <td>3005</td>
+ <td>Drop on Resp</td>
+ <td>The line dropped while the host was sending the response to the terminal.</td>
+ </tr>
+ <tr>
+ <td>3007</td>
+ <td>Drop Before EOT</td>
+ <td>The host received an ACK from the terminal but the line dropped before the host
+ could send the EOT.</td>
+ </tr>
+ <tr>
+ <td>3011</td>
+ <td>No Resp to ENQ</td>
+ <td>The line was up and carrier detected, but the terminal did not respond to the
+ ENQ.</td>
+ </tr>
+ <tr>
+ <td>3012</td>
+ <td>Drop on Input</td>
+ <td>The line disconnected while the host was receiving data from the terminal.</td>
+ </tr>
+ <tr>
+ <td>3013</td>
+ <td>FEP NAK'd 3 Times</td>
+ <td>The host disconnected after receiving 3 transmissions with incorrect LRC from
+ the terminal.</td>
+ </tr>
+ <tr>
+ <td>3014</td>
+ <td>No Resp to ENQ</td>
+ <td>The line disconnected during input data wait in Multi-Trans Mode.</td>
+ </tr>
+ <tr>
+ <td>3015</td>
+ <td>Drop on Input</td>
+ <td>The host encountered a full queue and discarded the input data.</td>
+ </tr>
+ <tr>
+ <td>9000-9999</td>
+ <td>Host Error</td>
+ <td>The host encountered an internal error and was not able to process the
+ transaction.</td>
+ </tr>
diff --git a/generror/errortable2hash.pl b/generror/errortable2hash.pl
new file mode 100755
index 0000000..2046f86
--- /dev/null
+++ b/generror/errortable2hash.pl
@@ -0,0 +1,88 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+my($code, $short, $explanation);
+my $mode = 'code';
+
+my $DEBUG = 0;
+
+while (<>) {
+
+ if ( /^\s*<tr>\s*$/i ) {
+ ($code, $short, $explanation) = ('', '', '');
+ } elsif ( /^\s*<td[^>]*>(\d+)(\s|&nbsp;)*<\/td>\s*$/i ) {
+ $code = $1;
+ warn "found code $code" if $DEBUG;
+ $mode = 'short';
+ } elsif ( /^\s*<td[^>]*>(\d+(\s|&nbsp;)*\-\s*\d+)<\/td>\s*$/i ){
+ warn "skipping range $1" if $DEBUG;
+ until ( ($_=<>) =~ /^\s*<\/tr>\s*$/i ) {
+ #nop
+ }
+ next;
+ } elsif ( /^\s*<td[^>]*>(.*)<\/td>\s*$/i ) {
+ warn "found one line data" if $DEBUG;
+ if ( $mode eq 'short' ) {
+ $short = $1;
+ $short =~ s/<\/?FONT[^>]*>//gi;
+ $short =~ s/&nbsp;/ /g;
+ $short =~ s/<\/?a[^>]*>//gi;
+ $mode = 'explanation';
+ } elsif ( $mode eq 'explanation' ) {
+ $explanation = $1;
+ $explanation =~ s/<\/?FONT[^>]*>//gi;
+ $explanation =~ s/&nbsp;/ /g;
+ $mode = 'code';
+ } else {
+ die "found (one-line) data, but in unknown mode $mode";
+ }
+ } elsif ( /^\s*<td[^>]*>(.*)$/i ) {
+ warn "found multi-line data (mode $mode)" if $DEBUG;
+ chop(my $data = $1);
+ #$data =~ s/<\/?FONT[^>]*>//g;
+ until ( ($_=<>) =~ /^\s*(.*)<\/td>/i ) {
+ /^\s*(.*)\s*$/ or die;
+ chop($data .= $1);
+ warn "found intermediate data $1" if $DEBUG;
+ }
+ $_ =~ /^\s*(.*)<\/td>/i;
+ $data .= $1;
+ $data =~ s/<\/?FONT[^>]*>//gi;
+ $data =~ s/&nbsp;/ /g;
+ $data =~ s/<\/?[BI]>//gi;
+ $data =~ s/<\/?BR>/ /gi;
+ $data =~ s/<\/?a[^>]*>//gi;
+ warn "last line $1 ($_)" if $DEBUG;
+ warn "coalesced multi-line data: $data" if $DEBUG;
+ if ( $mode eq 'short' ) {
+ $short = $data;
+ $mode = 'explanation';
+ } elsif ( $mode eq 'explanation' ) {
+ $explanation = $data;
+ $mode = 'code';
+ } elsif ( $mode eq 'code' && $data =~ /^(\d+)$/ ) {
+ $code = $1;
+ warn "found code $code" if $DEBUG;
+ $mode = 'short';
+ } else {
+ die "found (multi-line) data, but in unknown mode $mode or don't know what to do with it: $data";
+ }
+
+ } elsif ( /^\s*<\/tr>\s*$/i ) {
+ #$short =~ s/<\/?FONT[^>]*>//g;
+ #$explanation =~ s/<\/?FONT[^>]*>//g;
+ #$short =~ s/[\n\r]//;
+ #$explanation =~ s/[\n\r]//;
+
+ $short =~ s/"/\\"/gi;
+ $explanation =~ s/"/\\"/gi;
+
+ warn "end of row, printing hash element (code $code)" if $DEBUG;
+ print qq! "$code" => \[ "$short", "$explanation" \],\n!
+ unless $short =~ /^\s*not\s*used\s*/i;
+ $mode = 'code';
+ }
+
+}
+
diff --git a/pm_to_blib b/pm_to_blib
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pm_to_blib
diff --git a/t/bad_card.t b/t/bad_card.t
new file mode 100644
index 0000000..b2bc0f1
--- /dev/null
+++ b/t/bad_card.t
@@ -0,0 +1,40 @@
+BEGIN { $| = 1; print "1..1\n"; }
+
+eval "use Net::SSLeay;";
+if ( $@ ) {
+ print "ok 1 # Skipped: Net::SSLeay is not installed\n"; exit;
+}
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("OpenECHO");
+$tx->content(
+ type => 'VISA',
+ #login => '123>4684752',
+ login => '1234684752',
+ password => '43400210',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment visa test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ phone => '420-543-2199',
+ card_number => '4007000000027',
+ expiration => '08/06',
+);
+$tx->test_transaction(1); # test, dont really charge
+$tx->submit();
+
+if($tx->is_success()) {
+ print "not ok 1\n";
+} else {
+ #warn $tx->server_response."\n";
+ #warn $tx->error_message. "\n";
+ print "ok 1\n";
+}
diff --git a/t/bop.t b/t/bop.t
new file mode 100644
index 0000000..64332c5
--- /dev/null
+++ b/t/bop.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Business::OnlinePayment;
+$loaded = 1;
+print "ok 1\n";
diff --git a/t/capture.t b/t/capture.t
new file mode 100644
index 0000000..53b2c4a
--- /dev/null
+++ b/t/capture.t
@@ -0,0 +1,63 @@
+BEGIN { $| = 1; print "1..2\n"; }
+
+print "ok 1 # Skipped: no separate auth + capture test yet\n";
+print "ok 2 # Skipped: no separate auth + capture test yet\n";
+exit;
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("OpenECHO");
+$tx->content(
+ type => 'VISA',
+ login => 'testing',# CHANGE THESE TO TEST
+ password => 'testing',#
+ action => 'Authorization Only',
+ description => 'Business::OnlinePayment visa test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ card_number => '4007000000027',
+ expiration => '08/06',
+);
+$tx->test_transaction(1); # test, dont really charge
+$tx->submit();
+
+unless($tx->is_success()) {
+ print "not ok 1\n";
+ print "not ok 2\n";
+} else {
+ my $order_number = $tx->order_number;
+ warn $order_number;
+ print "ok 1\n";
+
+ my $settle_tx = new Business::OnlinePayment("OpenECHO");
+ $settle_tx->content(
+ type => 'VISA',
+ login => 'testing', # CHANGE THESE TO TEST
+ password => 'testing', #
+ action => 'Post Authorization',
+ description => 'Business::OnlinePayment visa test',
+ amount => '49.95',
+ invoice_number => '100100',
+ order_number => '111',
+ card_number => '4007000000027',
+ expiration => '08/06',
+ );
+
+ $settle_tx->test_transaction(1); # test, dont really charge
+ $settle_tx->submit();
+
+ if($settle_tx->is_success()) {
+ print "ok 2\n";
+ } else {
+ warn $settle_tx->error_message;
+ print "not ok 2\n";
+ }
+
+}
diff --git a/t/check.t b/t/check.t
new file mode 100644
index 0000000..d64d49c
--- /dev/null
+++ b/t/check.t
@@ -0,0 +1,32 @@
+BEGIN { $| = 1; print "1..1\n"; }
+
+print "ok 1 # Skipped: no ACH test yet\n"; exit;
+
+use Business::OnlinePayment;
+
+# checks are broken it seems
+my $ctx = new Business::OnlinePayment("OpenECHO");
+$ctx->content(
+ type => 'CHECK',
+ login => 'testing',
+ password => 'testing',
+ action => 'Normal Authorization',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ account_number => '12345',
+ routing_code => '123456789',
+ bank_name => 'First National Test Bank',
+);
+$ctx->test_transaction(1); # test, dont really charge
+$ctx->submit();
+
+print $ctx->is_success()."\n";
+
+if($ctx->is_success()) {
+ print "ok 1\n";
+} else {
+ print "not ok 1 (".$ctx->error_message().")\n";
+}
diff --git a/t/credit_card.t b/t/credit_card.t
new file mode 100644
index 0000000..f7dfafb
--- /dev/null
+++ b/t/credit_card.t
@@ -0,0 +1,41 @@
+BEGIN { $| = 1; print "1..1\n"; }
+
+eval "use Net::SSLeay;";
+if ( $@ ) {
+ print "ok 1 # Skipped: Net::SSLeay is not installed\n"; exit;
+}
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("OpenECHO");
+$tx->content(
+ type => 'VISA',
+ #login => '123>4684752',
+ login => '1234684752',
+ password => '43400210',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment visa test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ phone => '420-543-2199',
+ card_number => '4005550000000019',
+ expiration => '08/06',
+);
+$tx->test_transaction(1); # test, dont really charge
+$tx->submit();
+
+if($tx->is_success()) {
+ print "ok 1\n";
+} else {
+ #warn $tx->server_response."\n";
+ warn $tx->error_message. "\n";
+ print "not ok 1\n";
+}
+
diff --git a/t/crypt_bad_card.t b/t/crypt_bad_card.t
new file mode 100644
index 0000000..24810d2
--- /dev/null
+++ b/t/crypt_bad_card.t
@@ -0,0 +1,45 @@
+BEGIN {
+ $| = 1; print "1..1\n";
+ $Business::OnlinePayment::HTTPS::skip_NetSSLeay=1;
+ $Business::OnlinePayment::HTTPS::skip_NetSSLeay=1;
+}
+
+eval "use Crypt::SSLeay;";
+if ( $@ ) {
+ print "ok 1 # Skipped: Crypt::SSLeay is not installed\n"; exit;
+}
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("OpenECHO");
+$tx->content(
+ type => 'VISA',
+ #login => '123>4684752',
+ login => '1234684752',
+ password => '43400210',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment visa test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ phone => '420-543-2199',
+ card_number => '4007000000027',
+ expiration => '08/06',
+);
+$tx->test_transaction(1); # test, dont really charge
+$tx->submit();
+
+if($tx->is_success()) {
+ print "not ok 1\n";
+} else {
+ #warn $tx->server_response."\n";
+ #warn $tx->error_message. "\n";
+ print "ok 1\n";
+}
+
diff --git a/t/crypt_credit_card.t b/t/crypt_credit_card.t
new file mode 100644
index 0000000..ca51239
--- /dev/null
+++ b/t/crypt_credit_card.t
@@ -0,0 +1,45 @@
+BEGIN {
+ $| = 1; print "1..1\n";
+ $Business::OnlinePayment::HTTPS::skip_NetSSLeay=1;
+ $Business::OnlinePayment::HTTPS::skip_NetSSLeay=1;
+}
+
+eval "use Crypt::SSLeay;";
+if ( $@ ) {
+ print "ok 1 # Skipped: Crypt::SSLeay is not installed\n"; exit;
+}
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("OpenECHO");
+$tx->content(
+ type => 'VISA',
+ #login => '123>4684752',
+ login => '1234684752',
+ password => '43400210',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment visa test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ phone => '420-543-2199',
+ card_number => '4005550000000019',
+ expiration => '08/06',
+);
+$tx->test_transaction(1); # test, dont really charge
+$tx->submit();
+
+if($tx->is_success()) {
+ print "ok 1\n";
+} else {
+ #warn $tx->server_response."\n";
+ warn $tx->error_message. "\n";
+ print "not ok 1\n";
+}
+
diff --git a/t/crypt_load.t b/t/crypt_load.t
new file mode 100644
index 0000000..d92b8f3
--- /dev/null
+++ b/t/crypt_load.t
@@ -0,0 +1,13 @@
+BEGIN {
+ $| = 1; print "1..1\n";
+ eval "use Crypt::SSLeay;";
+ if ( $@ ) {
+ print "ok 1 # Skipped: Crypt::SSLeay is not installed\n"; exit;
+ }
+ $Business::OnlinePayment::HTTPS::skip_NetSSLeay=1;
+ $Business::OnlinePayment::HTTPS::skip_NetSSLeay=1;
+}
+END {print "not ok 1\n" unless $loaded;}
+use Business::OnlinePayment::OpenECHO;
+$loaded = 1;
+print "ok 1\n";
diff --git a/t/load.t b/t/load.t
new file mode 100644
index 0000000..cca662e
--- /dev/null
+++ b/t/load.t
@@ -0,0 +1,12 @@
+BEGIN {
+ $| = 1; print "1..1\n";
+ eval "use Net::SSLeay;";
+ if ( $@ ) {
+ print "ok 1 # Skipped: Net::SSLeay is not installed\n"; exit;
+ }
+
+}
+END {print "not ok 1\n" unless $loaded;}
+use Business::OnlinePayment::OpenECHO;
+$loaded = 1;
+print "ok 1\n";