--- /dev/null
+package Business::OnlinePayment::Dummy;
+
+use strict;
+use Carp;
+use Business::OnlinePayment;
+use vars qw($VERSION @ISA $me);
+
+@ISA = qw(Business::OnlinePayment);
+$VERSION = '0.01';
+$me = 'Business::OnlinePayment::Dummy';
+
+sub submit {
+ my($self) = @_;
+ $self->authorization(time . int(rand(10000)));
+ $self->is_success(1);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Business::OnlinePayment::AuthorizeNet - AuthorizeNet backend for Business::OnlinePayment
+
+=head1 SYNOPSIS
+
+ use Business::OnlinePayment;
+
+ ####
+ # One step transaction, the simple case.
+ ####
+
+ my $tx = new Business::OnlinePayment("AuthorizeNet");
+ $tx->content(
+ type => 'VISA',
+ login => 'testdrive',
+ password => '', #password or transaction key
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ email => 'jason@example.com',
+ first_name => 'Jason',
+ last_name => 'Kohles',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ country => 'US',
+ card_number => '4007000000027',
+ expiration => '09/02',
+ cvv2 => '1234', #optional
+ referer => 'http://valid.referer.url/',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ print "Card processed successfully: ".$tx->authorization."\n";
+ } else {
+ print "Card was rejected: ".$tx->error_message."\n";
+ }
+
+ ####
+ # Two step transaction, authorization and capture.
+ # If you don't need to review order before capture, you can
+ # process in one step as above.
+ ####
+
+ my $tx = new Business::OnlinePayment("AuthorizeNet");
+ $tx->content(
+ type => 'VISA',
+ login => 'testdrive',
+ password => '', #password or transaction key
+ action => 'Authorization Only',
+ description => 'Business::OnlinePayment test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ email => 'jason@example.com',
+ first_name => 'Jason',
+ last_name => 'Kohles',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ country => 'US',
+ card_number => '4007000000027',
+ expiration => '09/02',
+ cvv2 => '1234', #optional
+ referer => 'http://valid.referer.url/',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ # get information about authorization
+ $authorization = $tx->authorization
+ $ordernum = $tx->order_number;
+ $avs_code = $tx->avs_code; # AVS Response Code
+ $cvv2_response = $tx->cvv2_response; # CVV2/CVC2/CID Response Code
+ $cavv_response = $tx->cavv_response; # Cardholder Authentication
+ # Verification Value (CAVV) Response
+ # Code
+
+ # now capture transaction
+ my $capture = new Business::OnlinePayment("AuthorizeNet");
+
+ $capture->content(
+ type => 'CC',
+ action => 'Post Authorization',
+ login => 'YOURLOGIN
+ password => 'YOURPASSWORD', #or transaction key
+ order_number => $ordernum,
+ amount => '49.95',
+ );
+
+ $capture->submit();
+
+ if($capture->is_success()) {
+ print "Card captured successfully: ".$capture->authorization."\n";
+ } else {
+ print "Card was rejected: ".$capture->error_message."\n";
+ }
+
+ } else {
+ print "Card was rejected: ".$tx->error_message."\n";
+ }
+
+ ####
+ # One step subscription, the simple case.
+ ####
+
+ my $tx = new Business::OnlinePayment("AuthorizeNet::ARB");
+ $tx->content(
+ type => 'CC',
+ login => 'testdrive',
+ password => 'testpass', #or transaction key
+ action => 'Recurring Authorization',
+ interval => '7 days',
+ start => '2008-3-10',
+ periods => '16',
+ amount => '99.95',
+ trialperiods => '4',
+ trialamount => '0',
+ description => 'Business::OnlinePayment test',
+ invoice_number => '1153B33F',
+ customer_id => 'vip',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'GA',
+ zip => '84058',
+ card_number => '4111111111111111',
+ expiration => '09/02',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ print "Card processed successfully: ".$tx->order_number."\n";
+ } else {
+ print "Card was rejected: ".$tx->error_message."\n";
+ }
+ my $subscription = $tx->order_number
+
+
+ ####
+ # Subscription change. Modestly more complicated.
+ ####
+
+ $tx->content(
+ type => 'CC',
+ subscription => '99W2C',
+ login => 'testdrive',
+ password => 'testpass', #or transaction key
+ action => 'Modify Recurring Authorization',
+ interval => '7 days',
+ start => '2008-3-10',
+ periods => '16',
+ amount => '29.95',
+ trialperiods => '4',
+ trialamount => '0',
+ description => 'Business::OnlinePayment test',
+ invoice_number => '1153B340',
+ customer_id => 'vip',
+ first_name => 'Tofu',
+ last_name => 'Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'GA',
+ zip => '84058',
+ card_number => '4111111111111111',
+ expiration => '09/02',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ print "Update processed successfully."\n";
+ } else {
+ print "Update was rejected: ".$tx->error_message."\n";
+ }
+ $tx->content(
+ subscription => '99W2D',
+ login => 'testdrive',
+ password => 'testpass', # or transaction key
+ action => 'Cancel Recurring Authorization',
+ );
+ $tx->submit();
+
+ ####
+ # Subscription cancellation. It happens.
+ ####
+
+ if($tx->is_success()) {
+ print "Cancellation processed successfully."\n";
+ } else {
+ print "Cancellation was rejected: ".$tx->error_message."\n";
+ }
+
+
+=head1 SUPPORTED TRANSACTION TYPES
+
+=head2 CC, 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 (non-subscription), account_type (subscription), check_type (subscription).
+
+=head2 Subscriptions
+
+Additional content required: interval, start, periods.
+
+=head1 DESCRIPTION
+
+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 (from the message.code field for subscriptions).
+
+=head2 error_message
+
+Returns the response reason text (from the message.text field for subscriptions.
+
+=head2 server_response
+
+Returns the complete response from the server.
+
+=head1 Handling of content(%content) data:
+
+=head2 action
+
+The following actions are valid
+
+ normal authorization
+ authorization only
+ credit
+ post authorization
+ void
+ recurring authorization
+ modify recurring authorization
+ cancel recurring authorization
+
+=head2 interval
+
+ Interval contains a number of digits, whitespace, and the units of days or months in either singular or plural form.
+
+
+=head1 Setting AuthorizeNet ARB parameters from content(%content)
+
+The following rules are applied to map data to AuthorizeNet ARB parameters
+from content(%content):
+
+ # ARB param => $content{<key>}
+ merchantAuthentication
+ name => 'login',
+ transactionKey => 'password',
+ subscription
+ paymentSchedule
+ interval
+ length => \( the digits in 'interval' ),
+ unit => \( days or months gleaned from 'interval' ), startDate => 'start',
+ totalOccurrences => 'periods',
+ trialOccurrences => 'trialperiods',
+ amount => 'amount',
+ trialAmount => 'trialamount',
+ payment
+ creditCard
+ cardNumber => 'card_number',
+ expiration => \( $year.'-'.$month ), # YYYY-MM from 'expiration'
+ bankAccount
+ accountType => 'account_type',
+ routingNumber => 'routing_code',
+ accountNumber => 'account_number,
+ nameOnAccount => 'name',
+ bankName => 'bank_name',
+ echeckType => 'check_type',
+ order
+ invoiceNumber => 'invoice_number',
+ description => 'description',
+ customer
+ type => 'customer_org',
+ id => 'customer_id',
+ email => 'email',
+ phoneNumber => 'phone',
+ faxNumber => 'fax',
+ driversLicense
+ number => 'license_num',
+ state => 'license_state',
+ dateOfBirth => 'license_dob',
+ taxid => 'customer_ssn',
+ billTo
+ firstName => 'first_name',
+ lastName => 'last_name',
+ company => 'company',
+ address => 'address',
+ city => 'city',
+ state => 'state',
+ zip => 'zip',
+ country => 'country',
+ shipTo
+ firstName => 'ship_first_name',
+ lastName => 'ship_last_name',
+ company => 'ship_company',
+ address => 'ship_address',
+ city => 'ship_city',
+ state => 'ship_state',
+ zip => 'ship_zip',
+ country => 'ship_country',
+
+=head1 NOTES
+
+Use your transaction key in the password field.
+
+Unlike Business::OnlinePayment or pre-3.0 versions of
+Business::OnlinePayment::AuthorizeNet, 3.1 requires separate first_name and
+last_name fields.
+
+Business::OnlinePayment::AuthorizeNet uses Authorize.Net's "Advanced
+Integration Method (AIM) (formerly known as ADC direct response)" and
+"Automatic Recurring Billing (ARB)", sending a username and password (or
+transaction key as 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
+the field "order_number" with the action set to "Post Authorization".
+You can get the transaction id from the authorization by calling the
+order_number method on the object returned from the authorization.
+You must also submit the amount field with a value less than or equal
+to the amount specified in the original authorization.
+
+For the subscription actions an authorization code is never returned by
+the module. Instead it returns the value of subscriptionId in order_number.
+This is the value to use for changing or cancelling subscriptions.
+
+Authorize.Net has turned address verification on by default for all merchants
+since 2002. If you do not have 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 address information.
+
+=head1 COMPATIBILITY
+
+This module implements Authorize.Net's API using the Advanced Integration
+Method (AIM) version 3.1, formerly known as ADC Direct Response and the
+Automatic Recurring Billing version 1.0 using the XML interface. See
+http://www.authorize.net/support/AIM_guide.pdf and http://www.authorize.net/support/ARB_guide.pdf for details.
+
+=head1 AUTHORS
+
+Original author: Jason Kohles, jason@mediabang.com
+
+Ivan Kohler <ivan-authorizenet@freeside.biz> updated it for Authorize.Net
+protocol 3.0/3.1 and is the current maintainer. Please see the next section
+for for information on contributing.
+
+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.
+
+Jeff Finucane <authorizenetarb@weasellips.com> added the ARB support.
+ARB support sponsored by Plus Three, LP. L<http://www.plusthree.com>.
+
+T.J. Mather <tjmather@maxmind.com> sent a number of CVV2 patches.
+
+Mike Barry <mbarry@cos.com> sent in a patch for the referer field and a fix for
+ship_company.
+
+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.
+
+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 compatibility mode.
+
+Michael G. Schwern contributed cleanups, test fixes, and more.
+
+Erik Hollensbe implemented card-present data (track1/track2), the
+duplicate_window parameter, and test fixes.
+
+Paul Timmins added the check_number field.
+
+Nate Nuss implemented the ("Additional Shipping Information (Level 2 Data)"
+fields: tax, freight, duty, tax_exempt, po_number.
+
+Michael Peters fixed a bug in email address handling.
+
+Thomas Sibley <trs@bestpractical.com> wrote B:OP:AuthorizeNet::AIM::ErrorCodes
+which was borged and used to provide more descriptive error messages.
+
+Craig Pearlman <cpearlma@yahoo.com> sent in a patch to more accurately declare
+required fields for E-check transcations.
+
+=head1 CONTRIBUTIONS AND REPOSITORY
+
+Please send patches as unified diffs (diff -u) to (in order of preference):
+
+=over 4
+
+=item CPAN RT
+
+http://rt.cpan.org/Public/Bug/Report.html?Queue=Business-OnlinePayment-AuthorizeNet
+
+=item The bop-devel mailing list
+
+http://420.am/cgi-bin/mailman/listinfo/bop-devel
+
+=item Ivan
+
+Ivan Kohler <ivan-authorizenet@freeside.biz>
+
+=back
+
+The code is available from our public CVS repository:
+
+ export CVSROOT=":pserver:anonymous@cvs.freeside.biz:/home/cvs/cvsroot"
+ cvs login
+ # The password for the user `anonymous' is `anonymous'.
+ cvs checkout Business-OnlinePayment-AuthorizeNet
+
+Or on the web:
+
+ http://freeside.biz/cgi-bin/viewvc.cgi/Business-OnlinePayment-AuthorizeNet/
+
+=head1 A WORD FROM OUR SPONSOR
+
+This module and the Business::OnlinePayment framework are maintained by by
+Freeside Internet Services. If you need a complete, open-source web-based
+application to manage your customers, billing and trouble ticketing, please
+visit http://freeside.biz/
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2010 Freeside Internet Services, Inc.
+Copyright 2008 Thomas Sibley
+All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+perl(1). L<Business::OnlinePayment>.
+
+=cut
+