summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes5
-rw-r--r--MANIFEST9
-rw-r--r--Makefile.PL12
-rw-r--r--OnlineThirdPartyPayment.pm187
-rw-r--r--README23
-rw-r--r--notes_for_module_writers33
-rw-r--r--t/00load.t10
-rw-r--r--t/pod.t9
8 files changed, 288 insertions, 0 deletions
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..b43b667
--- /dev/null
+++ b/Changes
@@ -0,0 +1,5 @@
+Revision history for Perl extension Business::OnlineThirdPartyPayment.
+
+0.01 unreleased
+ - original version; created by jeff
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..2580e9d
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,9 @@
+README
+Changes
+MANIFEST
+Makefile.PL
+OnlineThirdPartyPayment.pm
+t/00load.t
+t/pod.t
+notes_for_module_writers
+META.yml Module meta-data (added by MakeMaker)
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..53f13e8
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,12 @@
+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::OnlineThirdPartyPayment',
+ 'VERSION_FROM' => 'OnlineThirdPartyPayment.pm', # finds $VERSION
+ 'AUTHOR' => 'Jeff Finucane <business-onlinethirdpartypayment@weasellips.com>',
+ 'PREREQ_PM' => {
+ 'Business::OnlinePayment' => 3,
+ 'Test::More' => 0.42,
+ },
+);
diff --git a/OnlineThirdPartyPayment.pm b/OnlineThirdPartyPayment.pm
new file mode 100644
index 0000000..1c3ef16
--- /dev/null
+++ b/OnlineThirdPartyPayment.pm
@@ -0,0 +1,187 @@
+package Business::OnlineThirdPartyPayment;
+
+use strict;
+use vars qw($VERSION);
+use Carp;
+use base qw(Business::OnlinePayment);
+
+require 5.005;
+
+$VERSION = '3.00_09';
+$VERSION = eval $VERSION; # modperlstyle: convert the string into a number
+
+my %fields = (
+ authorization => undef,
+ error_message => undef,
+ failure_status => undef,
+ fraud_detect => undef, # unsupported
+ is_success => undef,
+ maximum_risk => undef, # unsupported
+ path => undef,
+ port => undef,
+ require_avs => undef,
+ result_code => undef,
+ server => undef,
+ server_response => undef,
+ test_transaction => undef,
+ transaction_type => undef,
+ fraud_score => undef, # unsupported
+ fraud_transaction_id => undef, # unsupported
+ popup_url => undef,
+ collectitems => undef,
+);
+
+sub new {
+ my($class,$processor,%data) = @_;
+
+ croak("unspecified processor") unless $processor;
+
+ my $subclass = "${class}::$processor";
+ eval "use $subclass";
+ croak("unknown processor $processor ($@)") if $@;
+
+ my $self = bless {processor => $processor}, $subclass;
+ $self->build_subs(keys %fields);
+
+ if($self->can("set_defaults")) {
+ $self->set_defaults(%data);
+ }
+
+ foreach(keys %data) {
+ my $key = lc($_);
+ my $value = $data{$_};
+ $key =~ s/^\-+//;
+ $self->build_subs($key);
+ $self->$key($value);
+ }
+
+ return $self;
+}
+
+sub reference {
+ my($self) = @_;
+
+ croak("Processor subclass did not override reference function");
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Business::OnlineThirdPartyPayment - Perl extension for third party web page based online payment processing
+
+=head1 SYNOPSIS
+
+ use Business::OnlineThirdPartyPayment;
+
+ my $transaction =
+ new Business::OnlineThirdPartyPayment($processor, %processor_info);
+ $transaction->content(
+ type => 'CC',
+ action => 'Authorization Only',
+ amount => '49.95',
+ reference => '3735928559',
+ );
+ $transaction->submit();
+
+ if($transaction->is_success()) {
+ print "Success! Redirect browser to ". $transaction->popup_url();
+ } else {
+ print "Card was rejected: ", $transaction->error_message(), "\n";
+ }
+
+ #when the provider calls us back via HTTP
+ use CGI;
+ my $cgi = new CGI; #initialized to current page
+
+ my $reference = $transaction->reference($cgi->Vars);
+ $transaction->content(
+ type => 'CC',
+ action => 'Post Authorization',
+ reference => $reference,
+ );
+ $transaction->submit();
+ if($transaction->is_success()) {
+ print "Card processed scucessfully: ", $transaction->authorization(), "\n";
+ } else {
+ print "Card was rejected: ", $transaction->error_message(), "\n";
+ }
+
+
+
+=head1 DESCRIPTION
+
+Business::OnlineThirdPartyPayment is a generic module for processing payments
+through online credit card processors, electronic cash systems, etc. through
+which the payors web browser is redirected. It is a subclass of
+L<Business::OnlinePayment>
+
+=head1 METHODS AND FUNCTIONS
+
+=head2 new($processor, %processor_options);
+
+Create a new Business::OnlineThirdPartyPayment object, $processor is required,
+and defines the online processor to use. If necessary, processor
+options can be specified, currently supported options are 'Server',
+'Port', and 'Path', which specify how to find the online processor
+(https://server:port/path), but individual processor modules should
+supply reasonable defaults for this information, override the defaults
+only if absolutely necessary (especially path), as the processor
+module was probably written with a specific target script in mind.
+
+=head2 content(%content);
+
+The information necessary for the transaction, this tends to vary a
+little depending on the processor, so we have chosen to use a system
+which defines specific fields in the frontend which get mapped to the
+correct fields in the backend. Currently defined fields are:
+
+=head3 PROCESSOR FIELDS
+
+=over 4
+
+=item * reference
+
+A unique reference for this transaction.
+
+=back
+
+For additional fields, see L<Business::OnlinePayment> and the specific
+processor module used.
+
+=head2 submit();
+
+Submit the transaction to the processor for completion
+
+=head2 is_success();
+
+Returns true if the transaction was submitted successfully, false if
+it failed (or undef if it has not been submitted yet).
+
+=head2 test_transaction();
+
+Most processors provide a test mode, where submitted transactions will
+not actually be charged or added to your batch, calling this function
+with a true argument will turn that mode on if the processor supports
+it, or generate a fatal error if the processor does not support a test
+mode (which is probably better than accidentally making real charges).
+
+=head1 AUTHORS
+
+Jeff Finucane <business-onlinethirdpartypayment@weasellips>
+
+=head1 DISCLAIMER
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+=head1 SEE ALSO
+
+L<Business::OnlinePayment>, http://420.am/business-onlinepayment/
+
+For verification of credit card checksums, see L<Business::CreditCard>.
+
+=cut
diff --git a/README b/README
new file mode 100644
index 0000000..7865e93
--- /dev/null
+++ b/README
@@ -0,0 +1,23 @@
+*****************************************************************************
+* Copyright (c) 1999-2004 Jason Kohles. *
+* Copyright (c) 2004 Ivan Kohler *
+* Copyright (c) 2007 Freeside Internet Services, Inc.
+* All rights reserved. This program is free software; you can redistribute *
+* it and/or modify it under the same terms as Perl itself. *
+*****************************************************************************
+
+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").
+
+IMPORTANT: Business::OnlinePayment only defines the frontend interface to the
+system, in order to use it you also need to have at least one backend
+processing module installed.
+
+Homepage:
+ http://420.am/business-onlinepayment/
+
+Search CPAN for backends:
+ http://search.cpan.org/search?m=all&q=Business::OnlinePayment::
+
diff --git a/notes_for_module_writers b/notes_for_module_writers
new file mode 100644
index 0000000..57bd098
--- /dev/null
+++ b/notes_for_module_writers
@@ -0,0 +1,33 @@
+Information on creating a new processor backend to go with
+Business::OnlineThirdPartyPayment.
+-----------------------------------------------------------
+
+NOTE:
+
+ You should read the notes in Business::OnlinePayment first.
+
+Create a subclass of Business::OnlineThirdPartyPayment called
+Business::OnlinePayment::(processor name). You should override at least
+the set_defaults, submit, and reference methods.
+
+See Business::OnlineThirdPartyPayment::Interswitchng as an example.
+
+submit:
+ This method functions with both a "Authorize Only" and "Post Authorization"
+action. The former must, at a minumum, ensure that popup_url will return
+an appropriate value when submit also sets is_successful.
+
+ Nothing has happened at this point other than verifying the data is valid
+and providing the caller with a redirection url.
+
+ When called with "Post Authorization" steps are taken to verify that funds
+have been authorized by the processor.
+
+reference:
+ This method is called with a hash of key/value pairs, typically as the
+result of a HTTP GET or POST, but by whatever mechanism the processor provides.
+The return value must be the unique reference provided to the "Authorize Only"
+submit. Since the usage consists of submit(action=>'Authorize Only'),
+reference(key=>value...), submit(action=>'Post Authorization'), this may be
+the appropriate time to set the state of the object for some processors.
+
diff --git a/t/00load.t b/t/00load.t
new file mode 100644
index 0000000..63aec97
--- /dev/null
+++ b/t/00load.t
@@ -0,0 +1,10 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok("Business::OnlineThirdPartyPayment")
+ or BAIL_OUT("unable to load Business::OnlineThirdPartyPayment\n");
+}
diff --git a/t/pod.t b/t/pod.t
new file mode 100644
index 0000000..2c9935c
--- /dev/null
+++ b/t/pod.t
@@ -0,0 +1,9 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More;
+
+eval "use Test::Pod 1.00";
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+all_pod_files_ok();