Merge branch 'master' of git.freeside.biz:/home/git/Business-OnlinePayment
[Business-OnlinePayment.git] / OnlinePayment.pm
index a249981..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()
@@ -35,6 +35,47 @@ my @methods = qw(
     response_page
 );
 
     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) = @_;
 
@@ -229,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();
@@ -294,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
 
@@ -340,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
@@ -434,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
 
 
-Credit card expiration.
+If supported by your gateway, you can pass a card_token instead of a
+card_number and expiration.
+
+=cut
+
+#=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
 
@@ -451,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
 
@@ -463,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
 
@@ -496,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
 
@@ -556,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()
 
@@ -590,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
@@ -678,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/