package Business::OnlinePayment::AuthorizeNet;
-# $Id: AuthorizeNet.pm,v 1.5 2002-02-16 06:54:36 thalakan Exp $
+# $Id: AuthorizeNet.pm,v 1.11 2002-07-31 14:38:17 ivan Exp $
use strict;
+use Carp;
use Business::OnlinePayment;
use Net::SSLeay qw/make_form post_https/;
use Text::CSV_XS;
@ISA = qw(Exporter AutoLoader Business::OnlinePayment);
@EXPORT = qw();
@EXPORT_OK = qw();
-$VERSION = '3.02';
+$VERSION = '3.12';
sub set_defaults {
my $self = shift;
$self->server('secure.authorize.net');
$self->port('443');
$self->path('/gateway/transact.dll');
+
+ $self->build_subs('order_number'); #no idea how it worked for jason w/o this
}
sub map_fields {
email => 'x_Email',
company => 'x_Company',
order_number => 'x_Trans_ID',
+ cvv2 => 'x_Card_Code',
);
if($self->transaction_type() eq "ECHECK") {
first_name account_number routing_code
bank_name/);
} elsif($self->transaction_type() eq 'CC' ) {
+ if ( $self->{_content}->{action} eq 'PRIOR_AUTH_CAPTURE' ) {
+ $self->required_fields(qw/type login password action amount
+ card_number expiration/);
+ } else {
$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());
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 x_Trans_ID/);
+ x_Company x_Country x_Trans_ID
+ x_Card_Code /);
$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';
+ $post_data{'x_Version'} = '3.1';
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);
+ #escape NULL (binary 0x00) values
+ $page =~ s/\x00/\^0/g;
my $csv = new Text::CSV_XS();
$csv->parse($page);
$self->is_success(0);
$self->result_code($col[2]);
$self->error_message($col[3]);
+ unless ( $self->result_code() ) { #additional logging information
+ #$page =~ s/\x00/\^0/g;
+ $self->error_message($col[3].
+ " DEBUG: No x_response_code from server, ".
+ "(HTTPS response: $server_response) ".
+ "(HTTPS headers: ".
+ join(", ", map { "$_ => ". $headers{$_} } keys %headers ). ") ".
+ "(Raw HTTPS content: $page)"
+ );
+ }
}
}
zip => '84058',
card_number => '4007000000027',
expiration => '09/02',
+ cvv2 => '1234', #optional
);
$tx->submit();
=head1 NOTE
-Unlike Business::OnlinePayment or previous verisons of
-Business::OnlinePayment::AuthorizeNet, 3.0 requires separate first_name and
+Unlike Business::OnlinePayment or pre-3.0 verisons of
+Business::OnlinePayment::AuthorizeNet, 3.1 requires separate first_name and
last_name fields.
To settle an authorization-only transaction (where you set action to
valid address information for your customer (such as in an IVR
application), you must disable address verification in the Merchant
Menu page at https://secure.authorize.net/ so that the transactions
-aren't denied due to a lack of addres information.
+aren't denied due to a lack of address information.
=head1 COMPATIBILITY
-This module implements Authorize.Net's API verison 3.0 using the ADC
+This module implements Authorize.Net's API verison 3.1 using the ADC
Direct Response method. See
https://secure.authorize.net/docs/developersguide.pml for details.
Jason Kohles, jason@mediabang.com
Ivan Kohler <ivan-authorizenet@420.am> updated it for Authorize.Net protocol
-3.0 and is the current maintainer.
+3.0/3.1 and is the current maintainer.
-Jason Spence <jspence@lightconsulting.com> got settlements working and
-wrote some docs. OST <services@ostel.com> paid for it.
+Jason Spence <jspence@lightconsulting.com> contributed support for separate
+Authorization Only and Post Authorization steps and wrote some docs.
+OST <services@ostel.com> paid for it.
=head1 SEE ALSO