package Business::OnlinePayment::AuthorizeNet;
-# $Id: AuthorizeNet.pm,v 1.14 2002-08-16 06:53:28 ivan Exp $
-
use strict;
use Carp;
use Business::OnlinePayment;
@ISA = qw(Exporter AutoLoader Business::OnlinePayment);
@EXPORT = qw();
@EXPORT_OK = qw();
-$VERSION = '3.12';
+$VERSION = '3.13';
sub set_defaults {
my $self = shift;
'authorization only' => 'AUTH_ONLY',
'credit' => 'CREDIT',
'post authorization' => 'PRIOR_AUTH_CAPTURE',
+ 'void' => 'VOID',
);
$content{'action'} = $actions{lc($content{'action'})} || $content{'action'};
action => 'x_Type',
description => 'x_Description',
amount => 'x_Amount',
+ currency => 'x_Currency_Code',
invoice_number => 'x_Invoice_Num',
+ order_number => 'x_Trans_ID',
+ auth_code => 'x_Auth_Code',
customer_id => 'x_Cust_ID',
+ customer_ip => 'x_Customer_IP',
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',
- order_number => 'x_Trans_ID',
- cvv2 => 'x_Card_Code',
- currency => 'x_Currency_Code',
+ card_number => 'x_Card_Num',
+ expiration => 'x_Exp_Date',
+ cvv2 => 'x_Card_Code',
+ check_type => 'x_Echeck_Type',
+ account_name => 'x_Bank_Acct_Name',
+ account_number => 'x_Bank_Acct_Num',
+ account_type => 'x_Bank_Acct_Type',
+ bank_name => 'x_Bank_Name',
+ routing_code => 'x_Bank_ABA_Code',
+ customer_org => 'x_Customer_Organization_Type',
+ customer_ssn => 'x_Customer_Tax_ID',
+ license_num => 'x_Drivers_License_Num',
+ license_state => 'x_Drivers_License_State',
+ license_dob => 'x_Drivers_License_DOB',
);
- 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' ) {
+ if ($self->transaction_type() eq "ECHECK") {
+ if ($self->{_content}->{customer_org} ne '') {
+ $self->required_fields(qw/type login password amount routing_code
+ account_number account_type bank_name
+ account_name account_type
+ customer_org customer_ssn/);
+ } else {
+ $self->required_fields(qw/type login password amount routing_code
+ account_number account_type bank_name
+ account_name account_type
+ license_num license_state license_dob/);
+ }
+ } 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/);
+ if ( $self->{_content}->{order_number}) {
+ $self->required_fields(qw/type login password action amount/);
+ } else {
+ $self->required_fields(qw/type login password action amount
+ card_number expiration/);
+ }
+ } elsif ( $self->{_content}->{action} eq 'VOID' ) {
+ $self->required_fields(qw/login password action/);
} else {
$self->required_fields(qw/type login password action amount last_name
first_name card_number expiration/);
}
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 x_Trans_ID
- x_Card_Code /);
+ x_Description x_Amount x_Cust_ID x_Method x_Type x_Card_Num x_Exp_Date
+ x_Card_Code x_Auth_Code x_Echeck_Type x_Bank_Acct_Num
+ x_Bank_Account_Name x_Bank_ABA_Code x_Bank_Name x_Bank_Acct_Type
+ x_Customer_Organization_Type x_Customer_Tax_ID x_Customer_IP
+ x_Drivers_License_Num x_Drivers_License_State x_Drivers_License_DOB
+ 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_Currency_Code x_Trans_ID/);
$post_data{'x_Test_Request'} = $self->test_transaction()?"TRUE":"FALSE";
$post_data{'x_ADC_Delim_Data'} = 'TRUE';
$post_data{'x_ADC_URL'} = 'FALSE';
#escape NULL (binary 0x00) values
$page =~ s/\x00/\^0/g;
- my $csv = new Text::CSV_XS();
+ my $csv = new Text::CSV_XS({ 'binary'=>1 });
$csv->parse($page);
my @col = $csv->fields();
Business::OnlinePayment::AuthorizeNet, 3.1 requires separate first_name and
last_name fields.
-Business::OnlinePayment::AuthorizeNet uses the ADC direct response method,
-and sends a username and password with every transaction. Therefore,
-Authorize.Net's referrer "security" is not necessary. In your Authorize.Net
-interface at https://secure.authorize.net/ make sure the list of allowable
-referers is blank. Alternatively, set the B<referer> field in the transaction
-content.
+Business::OnlinePayment::AuthorizeNet uses Authorize.Net's "Advanced
+Integration Method (AIM) (formerly known as ADC direct response)", sending a
+username and password with every transaction. Therefore, Authorize.Net's
+referrer "security" is not necessary. In your Authorize.Net interface at
+https://secure.authorize.net/ make sure the list of allowable referers is
+blank. Alternatively, set the B<referer> field in the transaction content.
To settle an authorization-only transaction (where you set action to
'Authorization Only'), submit the nine-digit transaction id code in
Jason Kohles, jason@mediabang.com
Ivan Kohler <ivan-authorizenet@420.am> updated it for Authorize.Net protocol
-3.0/3.1 and is the current maintainer.
+3.0/3.1 and is the current maintainer. Please send patches as unified diffs
+(diff -u).
Jason Spence <jspence@lightconsulting.com> contributed support for separate
Authorization Only and Post Authorization steps and wrote some docs.
Mike Barry <mbarry@cos.com> sent in a patch for the referer field.
+Yuri V. Mkrtumyan <yuramk@novosoft.ru> sent in a patch to add the void action.
+
+Paul Zimmer <AuthorizeNetpm@pzimmer.box.bepress.com> sent in a patch for
+card-less post authorizations.
+
=head1 SEE ALSO
perl(1). L<Business::OnlinePayment>.