refactor most of the B:OP:HTTPS code out to Net:HTTPS::Any. Add card_token documenta...
[Business-OnlinePayment.git] / OnlinePayment.pm
index 05d89bd..00a34c1 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.01_04';
 $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 : [ $v ];
+    $types = { map { $_=>1 } @$types } if ref($v) 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) = @_;
 
@@ -291,10 +335,27 @@ 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 Void
+
+=item Credit
+
+=item Recurring Authorization
+
+=item Modify Recurring Authorization
+
+=item Cancel Recurring Authorization
+
+=back
 
 =item amount
 
 
 =item amount
 
@@ -431,14 +492,27 @@ IP Address from which the transaction originated.
 
 Credit card number.
 
 
 Credit card number.
 
+=item expiration
+
+Credit card expiration.
+
 =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
 
@@ -460,32 +534,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 +571,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
 
@@ -587,6 +662,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 +675,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 +699,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,9 +755,13 @@ 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>