From: jeff Date: Mon, 2 Mar 2009 23:42:02 +0000 (+0000) Subject: (no commit message) X-Git-Tag: import X-Git-Url: http://git.freeside.biz/gitweb/?p=Business-OnlineThirdPartyPayment.git;a=commitdiff_plain;h=0d35df46d6edbe51eb56f7444e4382f69827150a --- 0d35df46d6edbe51eb56f7444e4382f69827150a 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 ', + '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 + +=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 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 + +=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, http://420.am/business-onlinepayment/ + +For verification of credit card checksums, see L. + +=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();