(no commit message) import
authorjeff <jeff>
Mon, 2 Mar 2009 23:42:02 +0000 (23:42 +0000)
committerjeff <jeff>
Mon, 2 Mar 2009 23:42:02 +0000 (23:42 +0000)
Changes [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
Makefile.PL [new file with mode: 0644]
OnlineThirdPartyPayment.pm [new file with mode: 0644]
README [new file with mode: 0644]
notes_for_module_writers [new file with mode: 0644]
t/00load.t [new file with mode: 0644]
t/pod.t [new file with mode: 0644]

diff --git a/Changes b/Changes
new file mode 100644 (file)
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 (file)
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 (file)
index 0000000..53f13e8
--- /dev/null
@@ -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 (file)
index 0000000..1c3ef16
--- /dev/null
@@ -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 (file)
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 (file)
index 0000000..57bd098
--- /dev/null
@@ -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 (file)
index 0000000..63aec97
--- /dev/null
@@ -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 (file)
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();