Patch From Steve Simitzis for better compatiblity with eProcessingNetwork's Authorize...
[Business-OnlinePayment-AuthorizeNet.git] / AuthorizeNet.pm
index 12ae79b..c9cebaa 100644 (file)
@@ -9,10 +9,10 @@ use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
 
 require Exporter;
 
-@ISA = qw(Exporter AutoLoader Business::OnlinePayment);
+@ISA = qw(Exporter Business::OnlinePayment);
 @EXPORT = qw();
 @EXPORT_OK = qw();
-$VERSION = '3.16';
+$VERSION = '3.18';
 
 sub set_defaults {
     my $self = shift;
@@ -50,10 +50,23 @@ sub map_fields {
     $content{'type'} = $types{lc($content{'type'})} || $content{'type'};
     $self->transaction_type($content{'type'});
 
+    # ACCOUNT TYPE MAP
+    my %account_types = ('personal checking'   => 'CHECKING',
+                         'personal savings'    => 'SAVINGS',
+                         'business checking'   => 'CHECKING',
+                         'business savings'    => 'SAVINGS',
+                        );
+    $content{'account_type'} = $account_types{lc($content{'account_type'})}
+                               || $content{'account_type'};
+
     $content{'referer'} = defined( $content{'referer'} )
                             ? make_headers( 'Referer' => $content{'referer'} )
                             : "";
 
+    if (length $content{'password'} == 15) {
+        $content{'transaction_key'} = delete $content{'password'};
+    }
+
     # stuff it back into %content
     $self->content(%content);
 }
@@ -114,6 +127,7 @@ sub submit {
         phone             => 'x_Phone',
         fax               => 'x_Fax',
         email             => 'x_Email',
+        email_customer    => 'x_Email_Customer',
         card_number       => 'x_Card_Num',
         expiration        => 'x_Exp_Date',
         cvv2              => 'x_Card_Code',
@@ -143,10 +157,12 @@ sub submit {
 
         push @required_fields, qw(
           amount routing_code account_number account_type bank_name
-          account_name account_type
+          account_name
         );
 
-        if ($self->{_content}->{customer_org} ne '') {
+        if (defined $self->{_content}->{customer_org} and
+            length  $self->{_content}->{customer_org}
+        ) {
           push @required_fields, qw( customer_org customer_ssn );
         } else {
           push @required_fields, qw(license_num license_state license_dob);
@@ -191,7 +207,17 @@ sub submit {
         x_Ship_To_Country
         x_Phone x_Fax x_Email x_Email_Customer x_Country
         x_Currency_Code x_Trans_ID/);
-    $post_data{'x_Test_Request'} = $self->test_transaction()?"TRUE":"FALSE";
+
+    $post_data{'x_Test_Request'} = $self->test_transaction() ? 'TRUE' : 'FALSE';
+
+    #deal with perl-style bool
+    if (    $post_data{'x_Email_Customer'}
+         && $post_data{'x_Email_Customer'} !~ /^FALSE$/i ) {
+      $post_data{'x_Email_Customer'} = 'TRUE';
+    } else {
+      $post_data{'x_Email_Customer'} = 'FALSE';
+    }
+
     $post_data{'x_ADC_Delim_Data'} = 'TRUE';
     $post_data{'x_delim_char'} = ',';
     $post_data{'x_encap_char'} = '"';
@@ -207,7 +233,10 @@ sub submit {
     #escape NULL (binary 0x00) values
     $page =~ s/\x00/\^0/g;
 
-    my $csv = new Text::CSV_XS({ 'binary'=>1 });
+    #trim 'ip_addr="1.2.3.4"' added by eProcessingNetwork Authorize.Net compat
+    $page =~ s/,ip_addr="[\d\.]+"$//;
+
+    my $csv = new Text::CSV_XS({ binary=>1, escape_char=>'' });
     $csv->parse($page);
     my @col = $csv->fields();
 
@@ -221,7 +250,11 @@ sub submit {
     if($col[0] eq "1" ) { # Authorized/Pending/Test
         $self->is_success(1);
         $self->result_code($col[0]);
-        $self->authorization($col[4]);
+        if ($col[4] =~ /^(.*)\s+(\d+)$/) { #eProcessingNetwork extra bits..
+          $self->authorization($2);
+        } else {
+          $self->authorization($col[4]);
+        }
     } else {
         $self->is_success(0);
         $self->result_code($col[2]);
@@ -258,7 +291,7 @@ Business::OnlinePayment::AuthorizeNet - AuthorizeNet backend for Business::Onlin
   $tx->content(
       type           => 'VISA',
       login          => 'testdrive',
-      password       => '',
+      password       => '', #password or transaction key
       action         => 'Normal Authorization',
       description    => 'Business::OnlinePayment test',
       amount         => '49.95',
@@ -293,7 +326,7 @@ Business::OnlinePayment::AuthorizeNet - AuthorizeNet backend for Business::Onlin
   $tx->content(
       type           => 'VISA',
       login          => 'testdrive',
-      password       => '',
+      password       => '',  #password or transaction key
       action         => 'Authorization Only',
       description    => 'Business::OnlinePayment test',
       amount         => '49.95',
@@ -360,6 +393,22 @@ Content required: type, login, password|transaction_key, action, amount, first_n
 
 For detailed information see L<Business::OnlinePayment>.
 
+=head1 METHODS AND FUNCTIONS
+
+See L<Business::OnlinePayment> for the complete list. The following methods either override the methods in L<Business::OnlinePayment> or provide additional functions.
+
+=head2 result_code
+
+Returns the response reason code (this is different than the response code).
+
+=head2 error_message
+
+Returns the response reason text.
+
+=head2 server_response
+
+Returns the complete response from the server.
+
 =head1 NOTE
 
 Unlike Business::OnlinePayment or pre-3.0 verisons of
@@ -419,6 +468,9 @@ Daemmon Hughes <daemmon@daemmonhughes.com> sent in a patch for "transaction
 key" authentication as well support for the recurring_billing flag and the md5
 method that returns the MD5 hash which is returned by the gateway.
 
+Steve Simitzis contributed a patch for better compatibility with
+eProcessingNetwork's AuthorizeNet compatability mode.
+
 =head1 SEE ALSO
 
 perl(1). L<Business::OnlinePayment>.