From a906edd8acfc363934aecc7b035e92aad117f602 Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 1 Sep 2001 21:47:31 +0000 Subject: [PATCH 1/1] initial import --- AuthorizeNet.pm | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Changes | 8 ++ MANIFEST | 9 +++ Makefile.PL | 12 +++ README | 16 ++++ t/bop.t | 5 ++ t/check.t | 32 ++++++++ t/credit_card.t | 31 ++++++++ t/load.t | 5 ++ 9 files changed, 343 insertions(+) create mode 100644 AuthorizeNet.pm create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 Makefile.PL create mode 100644 README create mode 100644 t/bop.t create mode 100644 t/check.t create mode 100644 t/credit_card.t create mode 100644 t/load.t 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. + +=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 updated it for Authorize.Net protocol +3.0 and is the current maintainer. + +=head1 SEE ALSO + +perl(1). L. + +=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 ', #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 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"; -- 2.11.0