Merge branch 'master' of git.freeside.biz:/home/git/Business-OnlinePayment
[Business-OnlinePayment.git] / OnlinePayment.pm
index 05d89bd..12b3899 100644 (file)
@@ -1,12 +1,12 @@
 package Business::OnlinePayment;
 
 use strict;
 package Business::OnlinePayment;
 
 use strict;
-use vars qw($VERSION);
+use vars qw($VERSION %_info_handler);
 use Carp;
 
 require 5.005;
 
 use Carp;
 
 require 5.005;
 
-$VERSION = '3.01_01';
+$VERSION = '3.03_01';
 $VERSION = eval $VERSION; # modperlstyle: convert the string into a number
 
 # Remember subclasses we have "wrapped" submit() with _pre_submit()
 $VERSION = eval $VERSION; # modperlstyle: convert the string into a number
 
 # Remember subclasses we have "wrapped" submit() with _pre_submit()
@@ -30,8 +30,52 @@ my @methods = qw(
     transaction_type
     fraud_score
     fraud_transaction_id
     transaction_type
     fraud_score
     fraud_transaction_id
+    response_code
+    response_header
+    response_page
 );
 
 );
 
+#fallback
+sub _info {
+  my $class = shift;
+  ( my $gw = $class ) =~ s/^Business::OnlinePayment:://;
+  {
+    'info_compat'    => '0.00',
+    'gateway_name'   => $gw,
+    'module_notes'   => "Module does not yet provide info.",
+  };
+}
+
+#allow classes to declare info in a flexible way, but return normalized info
+%_info_handler = (
+  'supported_types'   => sub {
+    my( $class, $v ) = @_;
+    my $types = ref($v) ? $v : defined($v) ? [ $v ] : [];
+    $types = { map { $_=>1 } @$types } if ref($types) eq 'ARRAY';
+    $types;
+  },
+  'supported_actions' => sub {
+    my( $class, $v ) = @_;
+    return %$v if ref($v) eq 'HASH';
+    $v = [ $v ] unless ref($v);
+    my $types = $class->info('supported_types') || {};
+    ( map { $_ => $v } keys %$types );
+  },
+);
+
+sub info {
+  my $class = shift; #class or object
+  my $info = $class->_info;
+  if ( @_ ) {
+    my $key = shift;
+    exists($_info_handler{$key})
+      ? &{ $_info_handler{$key} }( $class, $info->{$key} )
+      : $info->{$key};
+  } else {
+    wantarray ? ( keys %$info ) : [ keys %$info ];
+  }
+}
+
 sub new {
     my($class,$processor,%data) = @_;
 
 sub new {
     my($class,$processor,%data) = @_;
 
@@ -226,7 +270,7 @@ Business::OnlinePayment - Perl extension for online payment processing
                         type        => 'Visa',
                         amount      => '49.95',
                         card_number => '1234123412341238',
                         type        => 'Visa',
                         amount      => '49.95',
                         card_number => '1234123412341238',
-                        expiration  => '0100',
+                        expiration  => '06/15',
                         name        => 'John Q Doe',
                        );
   $transaction->submit();
                         name        => 'John Q Doe',
                        );
   $transaction->submit();
@@ -291,10 +335,29 @@ processors support all transaction types.
 
 =item action
 
 
 =item action
 
-What to do with the transaction (currently available are: Normal
-Authorization, Authorization Only, Credit, Post Authorization,
-Recurring Authorization, Modify Recurring Authorization,
-Cancel Recurring Authorization)
+What action being taken by this transaction. Currently available are:
+
+=over 8
+
+=item Normal Authorization
+
+=item Authorization Only
+
+=item Post Authorization
+
+=item Reverse Authorization
+
+=item Void
+
+=item Credit
+
+=item Recurring Authorization
+
+=item Modify Recurring Authorization
+
+=item Cancel Recurring Authorization
+
+=back
 
 =item amount
 
 
 =item amount
 
@@ -337,6 +400,11 @@ Duty amount (portion of amount field, not added to it).
 
 Tax exempt flag (i.e. TRUE, FALSE, T, F, YES, NO, Y, N, 1, 0).
 
 
 Tax exempt flag (i.e. TRUE, FALSE, T, F, YES, NO, Y, N, 1, 0).
 
+=item currency
+
+Currency, specified as an ISO 4217 three-letter code, such as USD, CAD, EUR,
+AUD, DKK, GBP, JPY, NZD, etc.
+
 =back
 
 =head3 CUSTOMER INFO FIELDS
 =back
 
 =head3 CUSTOMER INFO FIELDS
@@ -431,14 +499,27 @@ IP Address from which the transaction originated.
 
 Credit card number.
 
 
 Credit card number.
 
+=item expiration
+
+Credit card expiration, MM/YY.
+
 =item cvv2
 
 CVV2 number (also called CVC2 or CID) is a three- or four-digit
 security code used to reduce credit card fraud.
 
 =item cvv2
 
 CVV2 number (also called CVC2 or CID) is a three- or four-digit
 security code used to reduce credit card fraud.
 
-=item expiration
+=item card_token
+
+If supported by your gateway, you can pass a card_token instead of a
+card_number and expiration.
+
+=cut
 
 
-Credit card expiration.
+#=item card_response
+#
+#Some card_token schemes implement a challenge/response handshake.  In those
+#cases, this field is used for the response.  In most cases the handshake
+#it taken care of by the gateway module.
 
 =item track1
 
 
 =item track1
 
@@ -448,7 +529,7 @@ Track 1 on the magnetic stripe (Card present only)
 
 Track 2 on the magnetic stripe (Card present only)
 
 
 Track 2 on the magnetic stripe (Card present only)
 
-=item recurring billing
+=item recurring_billing
 
 Recurring billing flag
 
 
 Recurring billing flag
 
@@ -460,32 +541,36 @@ Recurring billing flag
 
 =item account_number
 
 
 =item account_number
 
-Bank account number for electronic checks or electronic funds
-transfer.
+Bank account number
 
 =item routing_code
 
 
 =item routing_code
 
-Bank's routing code for electronic checks or electronic funds
-transfer.
+Bank's routing code
 
 =item account_type
 
 
 =item account_type
 
-Account type for electronic checks or electronic funds transfer.  Can be
-(case-insensitive): B<Personal Checking>, B<Personal Savings>,
-B<Business Checking> or B<Business Savings>.
+Account type.  Can be (case-insensitive): B<Personal Checking>,
+B<Personal Savings>, B<Business Checking> or B<Business Savings>.
 
 =item account_name
 
 
 =item account_name
 
-Account holder's name for electronic checks or electronic funds
-transfer.
+Account holder's name.
 
 =item bank_name
 
 
 =item bank_name
 
-Bank's name for electronic checks or electronic funds transfer.
+Bank name.
+
+=item bank_city
+
+Bank city.
+
+=item bank_state
+
+Bank state.
 
 =item check_type
 
 
 =item check_type
 
-Check type for electronic checks or electronic funds transfer.
+Check type.
 
 =item customer_org
 
 
 =item customer_org
 
@@ -493,18 +578,15 @@ Customer organization type.
 
 =item customer_ssn
 
 
 =item customer_ssn
 
-Customer's social security number.  Typically only required for
-electronic checks or electronic funds transfer.
+Customer's social security number.
 
 =item license_num
 
 
 =item license_num
 
-Customer's driver's license number.  Typically only required for
-electronic checks or electronic funds transfer.
+Customer's driver's license number.
 
 =item license_dob
 
 
 =item license_dob
 
-Customer's date of birth.  Typically only required for electronic
-checks or electronic funds transfer.
+Customer's date of birth.
 
 =back
 
 
 =back
 
@@ -553,8 +635,9 @@ Submit the transaction to the processor for completion
 
 =head2 is_success()
 
 
 =head2 is_success()
 
-Returns true if the transaction was submitted successfully, false if
-it failed (or undef if it has not been submitted yet).
+Returns true if the transaction was approved by the gateway, false if 
+it was submitted but not approved, or undef if it has not been 
+submitted yet.
 
 =head2 error_message()
 
 
 =head2 error_message()
 
@@ -587,6 +670,11 @@ later.
 The unique order number for the transaction generated by the gateway.  Store
 this if you would like to run inquiries or refunds on the transaction later.
 
 The unique order number for the transaction generated by the gateway.  Store
 this if you would like to run inquiries or refunds on the transaction later.
 
+=head2 card_token()
+
+If supported by your gateway, a card_token can be used in a subsequent
+transaction to refer to a card number.
+
 =head2 fraud_score()
 
 Retrieve or change the fraud score from any Business::FraudDetect plugin
 =head2 fraud_score()
 
 Retrieve or change the fraud score from any Business::FraudDetect plugin
@@ -595,6 +683,23 @@ Retrieve or change the fraud score from any Business::FraudDetect plugin
 
 Retrieve or change the transaction id from any Business::FraudDetect plugin
 
 
 Retrieve or change the transaction id from any Business::FraudDetect plugin
 
+=head2 response_code()
+
+=head2 response_headers()
+
+=head2 response_page()
+
+These three fields are set by some processors (especially those which use
+HTTPS) when the transaction fails at the communication level rather than
+as a transaction.
+
+response_code is the HTTP response code and message, i.e.
+'500 Internal Server Error'.
+
+response_headers is a hash reference of the response headers
+
+response_page is the raw content.
+
 =head2 result_code()
 
 Returns the precise result code that the processor returned, these are
 =head2 result_code()
 
 Returns the precise result code that the processor returned, these are
@@ -602,6 +707,10 @@ normally one letter codes that don't mean much unless you understand
 the protocol they speak, you probably don't need this, but it's there
 just in case.
 
 the protocol they speak, you probably don't need this, but it's there
 just in case.
 
+=head2 avs_code()
+
+=head2 cvv2_response()
+
 =head1 MISCELLANEOUS INTERNAL METHODS
 
 =head2 transaction_type()
 =head1 MISCELLANEOUS INTERNAL METHODS
 
 =head2 transaction_type()
@@ -654,12 +763,27 @@ Use this for handling boolean content like tax_exempt.
 
 =head1 AUTHORS
 
 
 =head1 AUTHORS
 
+(v2 series)
+
 Jason Kohles, email@jasonkohles.com
 
 Jason Kohles, email@jasonkohles.com
 
-(v3 rewrite) Ivan Kohler <ivan-business-onlinepayment@420.am>
+(v3 rewrite)
+
+Ivan Kohler <ivan-business-onlinepayment@420.am>
 
 Phil Lobbes E<lt>phil at perkpartners dot comE<gt>
 
 
 Phil Lobbes E<lt>phil at perkpartners dot comE<gt>
 
+=head1 COPYRIGHT
+
+Copyright (c) 1999-2004 Jason Kohles
+Copyright (c) 2004 Ivan Kohler
+Copyright (c) 2007-2012 Freeside Internet Services, Inc.
+
+All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
+
 =head1 HOMEPAGE
 
 Homepage:  http://420.am/business-onlinepayment/
 =head1 HOMEPAGE
 
 Homepage:  http://420.am/business-onlinepayment/