From 915bd5ff8cf528b62d79d045c436d17d92be4d89 Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 3 Sep 2004 23:37:13 +0000 Subject: [PATCH] inital checking of OpenECHO module --- Changes | 3 + MANIFEST | 17 + Makefile | 710 +++++++++++ Makefile.PL | 24 + OpenECHO.pm | 673 +++++++++++ README | 20 + TODO | 15 + .../auto/Business/OnlinePayment/OpenECHO/.exists | 0 blib/lib/Business/OnlinePayment/.exists | 0 blib/lib/Business/OnlinePayment/OpenECHO.pm | 673 +++++++++++ .../auto/Business/OnlinePayment/OpenECHO/.exists | 0 blib/man3/.exists | 0 generror/ISPGuide-Codes.asp | 1249 ++++++++++++++++++++ generror/errortable.html | 961 +++++++++++++++ generror/errortable2hash.pl | 88 ++ pm_to_blib | 0 t/bad_card.t | 40 + t/bop.t | 5 + t/capture.t | 63 + t/check.t | 32 + t/credit_card.t | 41 + t/crypt_bad_card.t | 45 + t/crypt_credit_card.t | 45 + t/crypt_load.t | 13 + t/load.t | 12 + 25 files changed, 4729 insertions(+) create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 Makefile create mode 100644 Makefile.PL create mode 100644 OpenECHO.pm create mode 100644 README create mode 100644 TODO create mode 100644 blib/arch/auto/Business/OnlinePayment/OpenECHO/.exists create mode 100644 blib/lib/Business/OnlinePayment/.exists create mode 100644 blib/lib/Business/OnlinePayment/OpenECHO.pm create mode 100644 blib/lib/auto/Business/OnlinePayment/OpenECHO/.exists create mode 100644 blib/man3/.exists create mode 100644 generror/ISPGuide-Codes.asp create mode 100644 generror/errortable.html create mode 100755 generror/errortable2hash.pl create mode 100644 pm_to_blib create mode 100644 t/bad_card.t create mode 100644 t/bop.t create mode 100644 t/capture.t create mode 100644 t/check.t create mode 100644 t/credit_card.t create mode 100644 t/crypt_bad_card.t create mode 100644 t/crypt_credit_card.t create mode 100644 t/crypt_load.t create mode 100644 t/load.t 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 ] +# 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) '' > $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' $(DISTNAME)' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' Ivan Kohler <ivan-openecho@420.am>' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) '' >> $(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 ', #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 +# +# SPECIAL THANKS +# Jim Darden +# Dan Browning +# +# BUSINESS::ONLINEPAYMENT IMPLEMENTATION +# Ivan Kohler +# +# 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. +# 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/
/\n/ig; + $echotype2 =~ s'''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>(.*?)"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 Echo::Process +# module. +sub GetEchoReturn { + my( $self, $page, $type ) = @_; + local $^W=0; + + my $data; + if ($type eq 'OPEN') { + ($data) = $page =~ m"(.*?)"gsi; + } + else { + ($data) = $page =~ m"(.*?)"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)." ], + "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. + +=head1 AUTHOR + +Original Author +Michael Lehmkuhl + +Special Thanks +Jim Darden +Dan Browning + +Business::OnlinePayment Implementation +Ivan Kohler + +=head1 SEE ALSO + +perl(1). L. + +=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. +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 +, with special thanks to Jim Darden + and Dan Browning . It was adapted to +the Business::OnlinePayment API by Ivan Kohler . + +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 diff --git a/blib/lib/Business/OnlinePayment/.exists b/blib/lib/Business/OnlinePayment/.exists new file mode 100644 index 0000000..e69de29 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 +# +# SPECIAL THANKS +# Jim Darden +# Dan Browning +# +# BUSINESS::ONLINEPAYMENT IMPLEMENTATION +# Ivan Kohler +# +# 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. +# 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/
/\n/ig; + $echotype2 =~ s'''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>(.*?)"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 Echo::Process +# module. +sub GetEchoReturn { + my( $self, $page, $type ) = @_; + local $^W=0; + + my $data; + if ($type eq 'OPEN') { + ($data) = $page =~ m"(.*?)"gsi; + } + else { + ($data) = $page =~ m"(.*?)"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)." ], + "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. + +=head1 AUTHOR + +Original Author +Michael Lehmkuhl + +Special Thanks +Jim Darden +Dan Browning + +Business::OnlinePayment Implementation +Ivan Kohler + +=head1 SEE ALSO + +perl(1). L. + +=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 diff --git a/blib/man3/.exists b/blib/man3/.exists new file mode 100644 index 0000000..e69de29 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 @@ + + + + V: ECHOnline Decline and Error Responses + + + + + + + + + + + + + +
+ + + ECHO Merchant Center + + + Interface Specification + + ECHOnline + + +
Document revision date 05/24/2004
+
+ +
+ Return to the + ECHO Internet Development Tools home page. +

Part V: Decline and Error Responses

+

+ This document describes the content of an ECHOTYPE1 response containing a + decline or error response received from the + ECHO host computers. For a general description of + ECHONLINE responses see + Response Protocol + in Part I of this Specification. +

+ 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 Part IV: + ECHONLINE Host Responses + . +

+ 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. +

Credit Card Transactions

+ 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." +

+ Decline responses are always preceded by the word "DECLINED," while error + responses contain various text messages from + ECHO's host computer or the issuer's computers. + Decline and error responses are described below. +

Message Formats

+

+ Decline responses are formatted as follows. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldSizeDescription
tag11"<ECHOTYPE1>"
decline9"DECLINED "
decline code + 2See Decline Codes table below
filler1" " (space)
amount20Declined transaction amount. Note: 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"
tag12"</ECHOTYPE1>"
+
+

+ Error responses are formatted as follows. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldSizeDescription
tag11"<ECHOTYPE1>"
error text20error description
error code4See Error Codes table below
tag12"</ECHOTYPE1>"
+
+

Decline Codes

+

Decline codes are defined in the following table.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Decline
+ Code
Short
+ Description

+ Explanation
01Refer + to card issuerThe + merchant must call the issuer before the transaction can be approved.
02Refer + to card issuer, special conditionThe + merchant must call the issuer before the transaction can be approved.
03Invalid merchant numberThe + merchant ID is not valid.
04Pick-up + card. Capture for rewardThe + card is listed on the Warning Bulletin.  Merchant + may receive reward money by capturing the card.
05Do + not honor. The transaction was declined by the issuer without definition or + reasonThe + transaction was declined without explanation by the card issuer. +
06ErrorThe + card issuer returned an error without further explanation.
07Pick-up + card, special conditionThe + card is listed on the Warning Bulletin.  Merchant + may receive reward money by capturing the card.
08Honor + with identificationHonor + with identification.
09Request + in progressRequest + in progress.
10Approved + for partial amountApproved + for partial amount.
+ 11Approved, + VIPApproved, + VIP program. +
12Invalid transactionThe + requested transaction is not supported or is not valid for the card number + presented.
13Invalid amountThe + amount exceeds the limits established by the issuer for this type of + transaction.
14Invalid + card #The issuer indicates that this card is not valid.
15No + such issuerThe + card issuer number is not valid.
16Approved, + update track 3Approved, + update track 3.
17Customer + cancellationCustomer + cancellation.
18Customer + disputeCustomer + dispute.
19Re + enter transactionCustomer + should resubmit transaction.
20Invalid + responseInvalid + response.
21No + action takenNo + action taken. The issuer declined with no other explanation.
22Suspected + malfunctionSuspected + malfunction.
23Unacceptable + transaction feeUnacceptable + transaction fee.
24File + update not supportedFile + update not supported.
25Unable + to locate recordUnable + to locate record.
26Duplicate + recordDuplicate + record.
27File + update edit errorFile + update edit error.
28File + update file lockedFile + update file locked.
+ 29not used 
30Format + error, call ECHOThe + host reported that the transaction was not formatted properly.
31Bank + not supportedBank + not supported by switch.
32Completed + partiallyCompleted + partially.
33Expired + card, pick-upThe + card is expired.  Merchant may + receive reward money by capturing the card.
34Issuer + suspects fraud, pick-up cardThe + card issuer suspects fraud.  Merchant + may receive reward money by capturing the card.
35Contact + acquirer, pick-upContact + card issuer.  Merchant may receive + reward money by capturing the card.
36Restricted + card, pick-upThe + card is restricted by the issuer.  Merchant + may receive reward money by capturing the card.
37Call + ECHO security, pick-upContact + ECHO security.  Merchant may + receive reward money by capturing the card.
38PIN + tries exceeded, pick-upPIN + attempts exceed issuer limits.  Merchant + may receive reward money by capturing the card.
39No + credit accountNo + credit account.
+ 40Function + not supportedRequested + function not supported.
41Lost + Card, capture for rewardThe + card has been reported lost.
42No + universal accountNo + universal account.
43Stolen + Card, capture for rewardThe + card has been reported stolen.
44No + investment accountNo + investment account.
45 - 50not used 
51Not + sufficient fundsThe + credit limit for this account has been exceeded.
52 - 53not used 
54Expired cardThe card is expired.
55Incorrect PINThe + cardholder PIN is incorrect.
56No + card recordNo + card record.
57Transaction + not permitted to cardholderThe + card is not allowed the type of transaction requested.
58Transaction + not permitted on terminalThe + Merchant is not allowed this type of transaction.
59Suspected + fraudSuspected + fraud.
+ 60Contact + ECHOContact + ECHO.
61Exceeds + withdrawal limitThe + amount exceeds the allowed daily maximum.
62Restricted cardThe card has been restricted.
63Security violation.The card has been restricted.
64Original + amount incorrectOriginal + amount incorrect.
65Exceeds + withdrawal frequencyThe + allowable number of daily transactions has been exceeded.
66Call + acquirer security, call ECHOCall + acquirer security, call ECHO.
+ 67not used 
68Response + received too lateResponse + received too late.
69 - 74not used 
75PIN + tries exceededThe allowed number of PIN retries has been exceeded.
76Invalid "to" accountThe debit account does not exist.
77Invalid "from" accountThe credit account does not exist.
78Invalid + account specified (general) + The associated card number account is invalid or does not exist.
79Already + reversedAlready + reversed.
80 - 83not used 
84Invalid + authorization life cycleThe + authorization life cycle is invalid.
85 not used 
86Cannot + verify PINCannot + verify PIN.
87Network + UnavailableNetwork + Unavailable.
88not used 
89Ineligible + to receive financial position informationIneligible + to receive financial position information.
90Cut-off + in progressCut-off + in progress.
91Issuer + or switch inoperativeThe bank is not available to authorize this transaction.
92Routing + errorThe + transaction cannot be routed to the authorizing agency. +
93Violation + of lawViolation + of law.
94Duplicate + transactionDuplicate + transaction.
95Reconcile + errorReconcile + error.
96System + malfunctionA + system error has occurred.
97not used 
98Exceeds + cash limitExceeds + cash limit.
+
+

+ Error codes are defined in the following table.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Error
+ Code
Short
+ Description

+ Explanation
1000Unrecoverable error.An unrecoverable error has occurred in the + ECHONLINE processing.
1001Account closedThe merchant account has been closed.
1002System closed + Services for this system are not available.
+ (Not used by ECHONLINE) +
1003E-Mail DownThe e-mail function is not available.
+ (Not used by ECHONLINE) +
1004-1011not used 
1012Invalid trans codeThe host computer received an invalid transaction code.
1013Invalid term idThe ECHO-ID is invalid.
1014not used 
1015Invalid card numberThe credit card number that was sent to the host computer was + invalid
1016Invalid expiry dateThe card has expired or the expiration date was invalid.
1017Invalid amountThe dollar amount was less than 1.00 or greater than the maximum + allowed for this card.
1018not used 
1019Invalid stateThe state code was invalid.
+ (Not used by ECHONLINE) +
1020not used 
1021Invalid serviceThe merchant or card holder is not allowed to perform that kind of + transaction
1022-1023not used 
1024Invalid auth codeThe authorization number presented with this transaction is + incorrect. (deposit transactions only)
1025Invalid reference numberThe reference number presented with this transaction is incorrect + or is not numeric.
1026-1028not used 
1029Invalid contract numberThe contract number presented with this transaction is incorrect + or is not numeric.
+ (Not used by ECHONLINE) +
1030Invalid inventory dataThe inventory data presented with this transaction is not ASCII + "printable".
+ (Not used by ECHONLINE) +
1031-1500not used 
+ Error Codes 1501 through 1599 are generated by + ECHONLINE after validating + the merchant but before presenting the transaction to the host computers for + processing. +
1501-1507not used 
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 counter + in Part I of this Specification). +
1512-1598not used 
1599 An system error occurred while validating the transaction input.
1600-1800not used 
+ Error Codes 1801 through 1814 are generated by + ECHONLINE to indicate + responses to AVS-Only transactions when + the response is anything but "X" or "Y" (all digits match). +
1801Return Code "A"Address matches; ZIP does not match.
1802Return Code "W"9-digit ZIP matches; Address does not match.
1803Return Code "Z"5-digit ZIP matches; Address does not match.
1804Return Codes "U"Issuer unavailable; cannot verify.
1805Return Code "R"Retry; system is currently unable to process.
1806Return Code "S" or "G"Issuer does not support AVS.
1807Return Code "N"Nothing matches.
1808Return Code "E"Invalid AVS only response.
1809Return Code "B"Street address match. Postal code not verified because of incompatible formats.
1810Return Code "C"Street address and Postal code not verified because of incompatible formats.
1811Return Code "D"Street address match and Postal code match.
1812Return Code "I"Address information not verified for international transaction.
1813Return Code "M"Street address match and Postal code match.
1814Return Code "P"Postal code match. Street address not verified because of incompatible formats.
1815-1896not used 
1897invalid responseThe host returned an invalid response.
1898disconnectThe host unexpectedly disconnected.
1899timeoutTimeout waiting for host response.
1900-2070not used 
2071Call VISAAn authorization number from the VISA Voice Center is required to + approve this transaction.
2072Call Master CardAn authorization number from the Master Card Voice Center is + required to approve this transaction.
2073Call Carte BlancheAn authorization number from the Carte Blanche Voice Center is + required to approve this transaction.
2074Call Diners ClubAn authorization number from the Diners' Club Voice Center is + required to approve this transaction.
2075Call AMEXAn authorization number from the American Express Voice Center is + required to approve this transaction.
2076Call DiscoverAn authorization number from the Discover Voice Center is required + to approve this transaction.
2077not used 
2078Call ECHOThe merchant must call ECHO + Customer Support for approval.or because there is a problem with the merchant's + account.
2079Call XpresscheXThe merchant must call ECHO + Customer Support for approval.or because there is a problem with the merchant's + account.
+ The remaining error codes are generated by the + ECHO host computers in response to errors in the + dial-up protocol. These messages should never appear in + ECHONLINE. They are listed + below for completeness. +
3001No ACK on RespThe host did not receive an ACK from the terminal after sending the transaction + response.
3002POS NAK'd 3 TimesThe host disconnected after the terminal replied 3 times to the host response + with a NAK.
3003Drop on WaitThe line dropped before the host could send a response to the terminal.
3005Drop on RespThe line dropped while the host was sending the response to the terminal.
3007Drop Before EOTThe host received an ACK from the terminal but the line dropped before the host + could send the EOT.
3011No Resp to ENQThe line was up and carrier detected, but the terminal did not respond to the + ENQ.
3012Drop on InputThe line disconnected while the host was receiving data from the terminal.
3013FEP NAK'd 3 TimesThe host disconnected after receiving 3 transmissions with incorrect LRC from + the terminal.
3014No Resp to ENQThe line disconnected during input data wait in Multi-Trans Mode.
3015Drop on InputThe host encountered a full queue and discarded the input data.
9000-9999Host ErrorThe host encountered an internal error and was not able to process the + transaction.
+
+

Electronic Check Transactions

+ ECHO 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. ECHONLINE + does nor recognize a warning response, only approvals and declines. Therefore, + warnings received from NCIS are treated as declines by + ECHONLINE. +

+ 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. +

+ The NCN Response Format.pdf document located in the + XPRESSCHEXPLUS + Transaction Validation Tool + contains all Check Verification Responses. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldSizeDescription
tag11"<ECHOTYPE1>"
message16 + Decline message (see examples below). +
message16 + from 0 to n instances of additional decline and warning messages. +
tag12"</ECHOTYPE1>"
+
+

+ Examples:
+ The first example shows a decline response containing 7 separate + messages.<p><code><!--<ECHOTYPE1>DECLINE·CHECK···50·UNPAIDS·(ALL)UNPAID·AMT=·3778PHN·800-555-4503···CHKACHEK·····PHN·800-555-2954····XPCK!·······</ECHOTYPE1>--><br><!--<ECHOTYPE1>WARNING·········DAYLOC/NCHCKS=14DAYLOC/AMT=45···WINLOC/AMT=12···</ECHOTYPE1> + -->
+ <!-- <ECHOTYPE1>ERROR IN ID·····</ECHOTYPE1> -->
+ <!-- + <ECHOTYPE1>DECLINE·CHECK····2·UNPAIDS·(LOC)UNPAID·AMT=··376BANK·STOP·······PHN + 800-555-4503SUPER·COLLECT···</ECHOTYPE1> -->
+ <!-- <ECHOTYPE1>RE-PRESENTED CHK</ECHOTYPE1> --> +

+ Note:
+ All Electronic Check Declines return a Decline Code of "0005" in the ECHOTYPE3 + <decline_code> tag (i.e., <decline_code>0005</decline_code> + ). To determine the exact reason for the decline, the ECHOTYPE1 response must + be examined. +

+


+ + + +
+ + +Merchant Center  +ECHO Home  +Feedback  +Contact ECHO  +Copyright  + + + Login + + + +
+ + + + + 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 @@ + + 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. + + + + 29 + not used +   + + + 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. + + + 45 - 50 + not used +   + + + 51 + Not + sufficient funds + The + credit limit for this account has been exceeded. + + + 52 - 53 + not used +   + + + 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. + + + + 67 + not used +   + + + 68 + Response + received too late + Response + received too late. + + + 69 - 74 + not used +   + + + 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. + + + 80 - 83 + not used +   + + + 84 + Invalid + authorization life cycle + The + authorization life cycle is invalid. + + + 85  + not used +   + + + 86 + Cannot + verify PIN + Cannot + verify PIN. + + + 87 + Network + Unavailable + Network + Unavailable. + + + 88 + not used +   + + + 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. + + + 97 + not used +   + + + 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) + + + + 1004-1011 + not used +   + + + 1012 + Invalid trans code + The host computer received an invalid transaction code. + + + 1013 + Invalid term id + The ECHO-ID is invalid. + + + 1014 + not used +   + + + 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. + + + 1018 + not used +   + + + 1019 + Invalid state + The state code was invalid.
+ (Not used by ECHONLINE) + + + + 1020 + not used +   + + + 1021 + Invalid service + The merchant or card holder is not allowed to perform that kind of + transaction + + + 1022-1023 + not used +   + + + 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. + + + 1026-1028 + not used +   + + + 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) + + + + 1031-1500 + not used +   + + + + + 1501-1507 + not used +   + + + 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 counter + in Part I of this Specification). + + + + 1512-1598 + not used +   + + + 1599 +   + An system error occurred while validating the transaction input. + + + 1600-1800 + not used +   + + + + 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. + + + 1815-1896 + not used +   + + + 1897 + invalid response + The host returned an invalid response. + + + 1898 + disconnect + The host unexpectedly disconnected. + + + 1899 + timeout + Timeout waiting for host response. + + + 1900-2070 + not used +   + + + 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. + + + 2077 + not used +   + + + 2078 + Call ECHO + The merchant must call ECHO + Customer Support for approval.or because there is a problem with the merchant's + account. + + + 2079 + Call XpresscheX + The merchant must call ECHO + Customer 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. + + + 9000-9999 + Host Error + The host encountered an internal error and was not able to process the + transaction. + 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*\s*$/i ) { + ($code, $short, $explanation) = ('', '', ''); + } elsif ( /^\s*]*>(\d+)(\s| )*<\/td>\s*$/i ) { + $code = $1; + warn "found code $code" if $DEBUG; + $mode = 'short'; + } elsif ( /^\s*]*>(\d+(\s| )*\-\s*\d+)<\/td>\s*$/i ){ + warn "skipping range $1" if $DEBUG; + until ( ($_=<>) =~ /^\s*<\/tr>\s*$/i ) { + #nop + } + next; + } elsif ( /^\s*]*>(.*)<\/td>\s*$/i ) { + warn "found one line data" if $DEBUG; + if ( $mode eq 'short' ) { + $short = $1; + $short =~ s/<\/?FONT[^>]*>//gi; + $short =~ s/ / /g; + $short =~ s/<\/?a[^>]*>//gi; + $mode = 'explanation'; + } elsif ( $mode eq 'explanation' ) { + $explanation = $1; + $explanation =~ s/<\/?FONT[^>]*>//gi; + $explanation =~ s/ / /g; + $mode = 'code'; + } else { + die "found (one-line) data, but in unknown mode $mode"; + } + } elsif ( /^\s*]*>(.*)$/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/ / /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 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"; -- 2.11.0