initial import BUSINESS_ONLINEPAYMENT_AUTHORIZENET_3_00 START
authorivan <ivan>
Sat, 1 Sep 2001 21:47:31 +0000 (21:47 +0000)
committerivan <ivan>
Sat, 1 Sep 2001 21:47:31 +0000 (21:47 +0000)
AuthorizeNet.pm [new file with mode: 0644]
Changes [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
Makefile.PL [new file with mode: 0644]
README [new file with mode: 0644]
t/bop.t [new file with mode: 0644]
t/check.t [new file with mode: 0644]
t/credit_card.t [new file with mode: 0644]
t/load.t [new file with mode: 0644]

diff --git a/AuthorizeNet.pm b/AuthorizeNet.pm
new file mode 100644 (file)
index 0000000..80fcbbb
--- /dev/null
@@ -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 (file)
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 (file)
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 (file)
index 0000000..72e9866
--- /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::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 (file)
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 (file)
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 (file)
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 (file)
index 0000000..aa8b35c
--- /dev/null
@@ -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 (file)
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";