summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AuthorizeNet.pm225
-rw-r--r--Changes8
-rw-r--r--MANIFEST9
-rw-r--r--Makefile.PL12
-rw-r--r--README16
-rw-r--r--t/bop.t5
-rw-r--r--t/check.t32
-rw-r--r--t/credit_card.t31
-rw-r--r--t/load.t5
9 files changed, 343 insertions, 0 deletions
diff --git a/AuthorizeNet.pm b/AuthorizeNet.pm
new file mode 100644
index 0000000..80fcbbb
--- /dev/null
+++ b/AuthorizeNet.pm
@@ -0,0 +1,225 @@
+package Business::OnlinePayment::AuthorizeNet;
+
+# $Id: AuthorizeNet.pm,v 1.1 2001-09-01 21:47:31 ivan Exp $
+
+use strict;
+use Business::OnlinePayment;
+use Net::SSLeay qw/make_form post_https/;
+use Text::CSV;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+
+require Exporter;
+
+@ISA = qw(Exporter AutoLoader Business::OnlinePayment);
+@EXPORT = qw();
+@EXPORT_OK = qw();
+$VERSION = '3.00';
+
+sub set_defaults {
+ my $self = shift;
+
+ $self->server('secure.authorize.net');
+ $self->port('443');
+ $self->path('/gateway/transact.dll');
+}
+
+sub map_fields {
+ my($self) = @_;
+
+ my %content = $self->content();
+
+ # ACTION MAP
+ my %actions = ('normal authorization' => 'AUTH_CAPTURE',
+ 'authorization only' => 'AUTH_ONLY',
+ 'credit' => 'CREDIT',
+ 'post authorization' => 'PRIOR_AUTH_CAPTURE',
+ );
+ $content{'action'} = $actions{lc($content{'action'})} || $content{'action'};
+
+ # TYPE MAP
+ my %types = ('visa' => 'CC',
+ 'mastercard' => 'CC',
+ 'american express' => 'CC',
+ 'discover' => 'CC',
+ 'check' => 'ECHECK',
+ );
+ $content{'type'} = $types{lc($content{'type'})} || $content{'type'};
+ $self->transaction_type($content{'type'});
+
+ # stuff it back into %content
+ $self->content(%content);
+}
+
+sub remap_fields {
+ my($self,%map) = @_;
+
+ my %content = $self->content();
+ foreach(keys %map) {
+ $content{$map{$_}} = $content{$_};
+ }
+ $self->content(%content);
+}
+
+sub get_fields {
+ my($self,@fields) = @_;
+
+ my %content = $self->content();
+ my %new = ();
+ foreach( grep defined $content{$_}, @fields) { $new{$_} = $content{$_}; }
+ return %new;
+}
+
+sub submit {
+ my($self) = @_;
+
+ $self->map_fields();
+ $self->remap_fields(
+ type => 'x_Method',
+ login => 'x_Login',
+ password => 'x_Password',
+ action => 'x_Type',
+ description => 'x_Description',
+ amount => 'x_Amount',
+ invoice_number => 'x_Invoice_Num',
+ customer_id => 'x_Cust_ID',
+ last_name => 'x_Last_Name',
+ first_name => 'x_First_Name',
+ address => 'x_Address',
+ city => 'x_City',
+ state => 'x_State',
+ zip => 'x_Zip',
+ card_number => 'x_Card_Num',
+ expiration => 'x_Exp_Date',
+ account_number => 'x_Bank_Acct_Num',
+ routing_code => 'x_Bank_ABA_Code',
+ bank_name => 'x_Bank_Name',
+ country => 'x_Country',
+ phone => 'x_Phone',
+ fax => 'x_Fax',
+ email => 'x_Email',
+ company => 'x_Company',
+ );
+
+ if($self->transaction_type() eq "ECHECK") {
+ $self->required_fields(qw/type login password action amount last_name
+ first_name account_number routing_code
+ bank_name/);
+ } elsif($self->transaction_type() eq 'CC' ) {
+ $self->required_fields(qw/type login password action amount last_name
+ first_name card_number expiration/);
+ } else {
+ Carp::croak("AuthorizeNet can't handle transaction type: ".
+ $self->transaction_type());
+ }
+
+ my %post_data = $self->get_fields(qw/x_Login x_Password x_Invoice_Num
+ x_Description x_Amount x_Cust_ID
+ x_Method x_Type x_Card_Num x_Exp_Date
+ x_Auth_Code x_Bank_Acct_Num
+ x_Bank_ABA_Code x_Bank_Name
+ x_Last_Name x_First_Name x_Address
+ x_City x_State x_Zip x_Country x_Phone
+ x_Fax x_Email x_Email_Customer
+ x_Company x_Country/);
+ $post_data{'x_Test_Request'} = $self->test_transaction()?"TRUE":"FALSE";
+ $post_data{'x_ADC_Delim_Data'} = 'TRUE';
+ $post_data{'x_ADC_URL'} = 'FALSE';
+ $post_data{'x_Version'} = '3.0';
+
+ my $pd = make_form(%post_data);
+ my $s = $self->server();
+ my $p = $self->port();
+ my $t = $self->path();
+ my($page,$server_response,%headers) = post_https($s,$p,$t,'',$pd);
+
+ my $csv = new Text::CSV();
+ $csv->parse($page);
+ my @col = $csv->fields();
+
+ $self->server_response($page);
+ if($col[0] eq "1" ) { # Authorized/Pending/Test
+ $self->is_success(1);
+ $self->result_code($col[0]);
+ $self->authorization($col[4]);
+ } else {
+ $self->is_success(0);
+ $self->result_code($col[2]);
+ $self->error_message($col[3]);
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Business::OnlinePayment::AuthorizeNet - AuthorizeNet backend for Business::OnlinePayment
+
+=head1 SYNOPSIS
+
+ use Business::OnlinePayment;
+
+ my $tx = new Business::OnlinePayment("AuthorizeNet");
+ $tx->content(
+ type => 'VISA',
+ login => 'testdrive',
+ password => '',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ first_name => 'Jason',
+ last_name => 'Kohles',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ card_number => '4007000000027',
+ expiration => '09/99',
+ );
+ $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 Visa, MasterCard, American Express, Discover
+
+Content required: type, login, password, action, amount, first_name, last_name, card_number, expiration.
+
+=head2 Check
+
+Content required: type, login, password, action, amount, first_name, last_name, account_number, routing_code, bank_name.
+
+=head1 DESCRIPTION
+
+For detailed information see L<Business::OnlinePayment>.
+
+=head1 NOTE
+
+Unlike Business::OnlinePayment or previous verisons of
+Business::OnlinePayment::AuthorizeNet, 3.0 requires separate first_name and
+last_name fields.
+
+=head1 COMPATIBILITY
+
+This module implements Authorize.Net's API verison 3.0.
+
+=head1 AUTHOR
+
+Jason Kohles, jason@mediabang.com
+
+Ivan Kohler <ivan-authorizenet@420.am> updated it for Authorize.Net protocol
+3.0 and is the current maintainer.
+
+=head1 SEE ALSO
+
+perl(1). L<Business::OnlinePayment>.
+
+=cut
+
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..88923fb
--- /dev/null
+++ b/Changes
@@ -0,0 +1,8 @@
+Revision history for Perl extension Business::OnlinePayment::AuthorizeNet.
+
+3.00 Sat Sep 1 13:29:34 2001
+ - new maintainer, updated for Authorize.Net API 3.0
+
+0.01 Sun Jul 25 16:37:11 1999
+ - original version; created by h2xs 1.19
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..b7ad129
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,9 @@
+AuthorizeNet.pm
+Changes
+MANIFEST
+Makefile.PL
+README
+t/load.t
+t/credit_card.t
+t/check.t
+t/bop.t
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..72e9866
--- /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::OnlinePayment::AuthorizeNet',
+ 'VERSION_FROM' => 'AuthorizeNet.pm', # finds $VERSION
+ 'AUTHOR' => 'Ivan Kohler <ivan-authorizenet@420.am>', #really just
+ #the maintainer
+ #'NORECURS' => 1, # dont descend into subdirectories
+ 'PREREQ_PM' => {'Net::SSLeay' => 0, 'Text::CSV' => 0},
+ #'dist' => {CI => 'ci -l'},
+);
diff --git a/README b/README
new file mode 100644
index 0000000..f621276
--- /dev/null
+++ b/README
@@ -0,0 +1,16 @@
+Copyright (c) 1999 Jason Kohles.
+Copyright (c) 2001 Ivan Kohler
+All rights reserved. This program is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+This is Business::OnlinePayment::AuthorizeNet, an Authorize.Net-specific
+backend module for Business::OnlinePayment. It has been updated and now
+implements Authorize.Net API version 3.0.
+
+Jason Kohles is the original author.
+Ivan Kohler <ivan-authorizenet@420.am> is the current maintainer.
+
+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/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/check.t b/t/check.t
new file mode 100644
index 0000000..a22b727
--- /dev/null
+++ b/t/check.t
@@ -0,0 +1,32 @@
+BEGIN { $| = 1; print "1..1\n"; }
+
+print "ok 1 # Skipped: testdrive account won't accept ACH transactions\n"; exit;
+
+use Business::OnlinePayment;
+
+# checks are broken it seems
+my $ctx = new Business::OnlinePayment("AuthorizeNet");
+$ctx->content(
+ type => 'CHECK',
+ login => 'testdrive',
+ password => 'testdrive',
+ 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..aa8b35c
--- /dev/null
+++ b/t/credit_card.t
@@ -0,0 +1,31 @@
+BEGIN { $| = 1; print "1..1\n"; }
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("AuthorizeNet");
+$tx->content(
+ type => 'VISA',
+ login => 'testdrive',
+ password => 'testdrive',
+ 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',
+ card_number => '4007000000027',
+ expiration => '08/26',
+);
+$tx->test_transaction(1); # test, dont really charge
+$tx->submit();
+
+if($tx->is_success()) {
+ print "ok 1\n";
+} else {
+ print "not ok 1\n";
+}
diff --git a/t/load.t b/t/load.t
new file mode 100644
index 0000000..5d2dfc1
--- /dev/null
+++ b/t/load.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Business::OnlinePayment::AuthorizeNet;
+$loaded = 1;
+print "ok 1\n";