partial auth
[Business-OnlinePayment.git] / OnlinePayment.pm
1 package Business::OnlinePayment;
2
3 use strict;
4 use vars qw($VERSION %_info_handler);
5 use Carp;
6
7 require 5.005;
8
9 $VERSION = '3.04_02';
10 $VERSION = eval $VERSION; # modperlstyle: convert the string into a number
11
12 # Remember subclasses we have "wrapped" submit() with _pre_submit()
13 my %Presubmit_Added = ();
14
15 my @methods = qw(
16     authorization
17     order_number
18     error_message
19     failure_status
20     fraud_detect
21     is_success
22     maximum_risk
23     path
24     port
25     require_avs
26     result_code
27     server
28     server_response
29     test_transaction
30     transaction_type
31     fraud_score
32     fraud_transaction_id
33     response_code
34     response_header
35     response_page
36     avs_code
37     cvv2_response
38     partial_auth
39     partial_auth_amount
40 );
41
42 __PACKAGE__->build_subs(@methods);
43
44 #fallback
45 sub _info {
46   my $class = shift;
47   ( my $gw = $class ) =~ s/^Business::OnlinePayment:://;
48   {
49     'info_compat'    => '0.00',
50     'gateway_name'   => $gw,
51     'module_notes'   => "Module does not yet provide info.",
52   };
53 }
54
55 #allow classes to declare info in a flexible way, but return normalized info
56 %_info_handler = (
57   'supported_types'   => sub {
58     my( $class, $v ) = @_;
59     my $types = ref($v) ? $v : defined($v) ? [ $v ] : [];
60     $types = { map { $_=>1 } @$types } if ref($types) eq 'ARRAY';
61     $types;
62   },
63   'supported_actions' => sub {
64     my( $class, $v ) = @_;
65     return %$v if ref($v) eq 'HASH';
66     $v = [ $v ] unless ref($v);
67     my $types = $class->info('supported_types') || {};
68     ( map { $_ => $v } keys %$types );
69   },
70 );
71
72 sub info {
73   my $class = shift; #class or object
74   my $info = $class->_info;
75   if ( @_ ) {
76     my $key = shift;
77     exists($_info_handler{$key})
78       ? &{ $_info_handler{$key} }( $class, $info->{$key} )
79       : $info->{$key};
80   } else {
81     wantarray ? ( keys %$info ) : [ keys %$info ];
82   }
83 }
84
85 sub new {
86     my($class,$processor,%data) = @_;
87
88     croak("unspecified processor") unless $processor;
89
90     my $subclass = "${class}::$processor";
91     eval "use $subclass";
92     croak("unknown processor $processor ($@)") if $@;
93
94     my $self = bless {processor => $processor}, $subclass;
95
96     if($self->can("set_defaults")) {
97         $self->set_defaults(%data);
98     }
99
100     foreach(keys %data) {
101         my $key = lc($_);
102         my $value = $data{$_};
103         $key =~ s/^\-+//;
104         $self->build_subs($key);
105         $self->$key($value);
106     }
107
108     # "wrap" submit with _pre_submit only once
109     unless ( $Presubmit_Added{$subclass} ) {
110         my $real_submit = $subclass->can('submit');
111
112         no warnings 'redefine';
113         no strict 'refs';
114
115         *{"${subclass}::submit"} = sub {
116             my $self = shift;
117             return unless $self->_pre_submit(@_);
118             return $real_submit->($self, @_);
119         }
120     }
121
122     return $self;
123 }
124
125 sub _risk_detect {
126     my ($self, $risk_transaction) = @_;
127
128     my %parent_content = $self->content();
129     $parent_content{action} = 'Fraud Detect';
130     $risk_transaction->content( %parent_content );
131     $risk_transaction->submit();
132     if ($risk_transaction->is_success()) {
133          $self->fraud_score( $risk_transaction->fraud_score );
134          $self->fraud_transaction_id( $risk_transaction->fraud_transaction_id );
135         if ( $risk_transaction->fraud_score <= $self->maximum_fraud_score()) {
136             return 1;
137         } else {
138             $self->error_message('Excessive risk from risk management');
139         }
140     } else {
141         $self->error_message('Error in risk detection stage: ' .  $risk_transaction->error_message);
142     }
143     $self->is_success(0);
144     return 0;
145 }
146
147 my @Fraud_Class_Path = qw(Business::OnlinePayment Business::FraudDetect);
148
149 sub _pre_submit {
150     my ($self) = @_;
151     my $fraud_detection = $self->fraud_detect();
152
153     # early return if user does not want optional risk mgt
154     return 1 unless $fraud_detection;
155
156     # Search for an appropriate FD module
157     foreach my $fraud_class ( @Fraud_Class_Path ) {
158         my $subclass = $fraud_class . "::" . $fraud_detection;
159         eval "use $subclass ()";
160         if ($@) {
161             croak("error loading fraud_detection module ($@)")
162               unless ( $@ =~ m/^Can\'t locate/ );
163         } else {
164             my $risk_tx = bless( { processor => $fraud_detection }, $subclass );
165             if ($risk_tx->can('set_defaults')) {
166                 $risk_tx->set_defaults();
167             }
168             $risk_tx->_glean_parameters_from_parent($self);
169             return $self->_risk_detect($risk_tx);
170         }
171     }
172     croak("Unable to locate fraud_detection module $fraud_detection"
173                 . " in \@INC under Fraud_Class_Path (\@Fraud_Class_Path"
174                 . " contains: @Fraud_Class_Path) (\@INC contains: @INC)");
175 }
176
177 sub content {
178     my($self,%params) = @_;
179
180     if(%params) {
181         if($params{'type'}) { $self->transaction_type($params{'type'}); }
182         %{$self->{'_content'}} = %params;
183     }
184     return exists $self->{'_content'} ? %{$self->{'_content'}} : ();
185 }
186
187 sub required_fields {
188     my($self,@fields) = @_;
189
190     my @missing;
191     my %content = $self->content();
192     foreach(@fields) {
193         push(@missing, $_) unless exists $content{$_};
194     }
195
196     croak("missing required field(s): " . join(", ", @missing) . "\n")
197           if(@missing);
198 }
199
200 sub get_fields {
201     my($self, @fields) = @_;
202
203     my %content = $self->content();
204
205     #my %new = ();
206     #foreach(@fields) { $new{$_} = $content{$_}; }
207     #return %new;
208     map { $_ => $content{$_} } grep defined $content{$_}, @fields;
209 }
210
211 sub remap_fields {
212     my($self,%map) = @_;
213
214     my %content = $self->content();
215     foreach( keys %map ) {
216         $content{$map{$_}} = $content{$_};
217     }
218     $self->content(%content);
219 }
220
221 sub submit {
222     my($self) = @_;
223
224     croak("Processor subclass did not override submit function");
225 }
226
227 sub dump_contents {
228     my($self) = @_;
229
230     my %content = $self->content();
231     my $dump = "";
232     foreach(sort keys %content) {
233         $dump .= "$_ = $content{$_}\n";
234     }
235     return $dump;
236 }
237
238 # didnt use AUTOLOAD because Net::SSLeay::AUTOLOAD passes right to
239 # AutoLoader::AUTOLOAD, instead of passing up the chain
240 sub build_subs {
241     my $self = shift;
242
243     foreach(@_) {
244         next if($self->can($_));
245         eval "sub $_ { my \$self = shift; if(\@_) { \$self->{$_} = shift; } return \$self->{$_}; }";
246     }
247 }
248
249 #helper method
250
251 sub silly_bool {
252   my( $self, $value ) = @_;
253   return 1 if $value =~ /^[yt]/i;
254   return 0 if $value =~ /^[fn]/i;
255   #return 1 if $value == 1;
256   #return 0 if $value == 0;
257   $value; #die??
258 }
259
260 1;
261
262 __END__
263
264 =head1 NAME
265
266 Business::OnlinePayment - Perl extension for online payment processing
267
268 =head1 SYNOPSIS
269
270   use Business::OnlinePayment;
271   
272   my $transaction = new Business::OnlinePayment($processor, %processor_info);
273   $transaction->content(
274                         type        => 'Visa',
275                         amount      => '49.95',
276                         card_number => '1234123412341238',
277                         expiration  => '06/15',
278                         name        => 'John Q Doe',
279                        );
280
281   eval { $transaction->submit(); };
282
283   if ( $@ ) {
284
285     print "$processor error: $@\n";
286
287   } else {
288   
289     if ( $transaction->is_success() ) {
290       print "Card processed successfully: ". $transaction->authorization()."\n";
291     } else {
292       print "Card was rejected: ". $transaction->error_message(). "\n";
293     }
294
295   }
296
297 =head1 DESCRIPTION
298
299 Business::OnlinePayment is a generic module for processing payments
300 through online credit card processors, electronic cash systems, etc.
301
302 =head1 CONSTRUCTOR
303
304 =head2 new($processor, %processor_options)
305
306 Create a new Business::OnlinePayment object, $processor is required,
307 and defines the online processor to use.  If necessary, processor
308 options can be specified, currently supported options are 'Server',
309 'Port', and 'Path', which specify how to find the online processor
310 (https://server:port/path), but individual processor modules should
311 supply reasonable defaults for this information, override the defaults
312 only if absolutely necessary (especially path), as the processor
313 module was probably written with a specific target script in mind.
314
315 =head1 TRANSACTION SETUP METHODS
316
317 =head2 content(%content)
318
319 The information necessary for the transaction, this tends to vary a
320 little depending on the processor, so we have chosen to use a system
321 which defines specific fields in the frontend which get mapped to the
322 correct fields in the backend.  The currently defined fields are:
323
324 =head3 PROCESSOR FIELDS
325
326 =over 4
327
328 =item login
329
330 Your login name to use for authentication to the online processor.
331
332 =item password
333
334 Your password to use for authentication to the online processor.
335
336 =back
337
338 =head3 REQUIRED TRANSACTION FIELDS
339
340 =over 4
341
342 =item type
343
344 Transaction type, supported types are: CC (credit card), ECHECK
345 (electronic check) and LEC (phone bill billing).  Deprecated types
346 are: Visa, MasterCard, American Express, Discover, Check.  Not all
347 processors support all transaction types.
348
349 =item action
350
351 What action being taken by this transaction. Currently available are:
352
353 =over 8
354
355 =item Normal Authorization
356
357 =item Authorization Only
358
359 =item Post Authorization
360
361 =item Reverse Authorization
362
363 =item Void
364
365 =item Credit
366
367 =item Recurring Authorization
368
369 =item Modify Recurring Authorization
370
371 =item Cancel Recurring Authorization
372
373 =back
374
375 =item amount
376
377 The amount of the transaction.  No dollar signs or currency identifiers,
378 just a whole or floating point number (i.e. 26, 26.1 or 26.13).
379
380 =back
381
382 =head3 OPTIONAL TRANSACTION FIELDS
383
384 =over 4
385
386 =item partial_auth
387
388 Set true to accept a partial authorization.  If this flag is not set, a partial
389 authorization will be immediately reversed or voided.
390
391 =item description
392
393 A description of the transaction (used by some processors to send
394 information to the client, normally not a required field).
395
396 =item invoice_number
397
398 An invoice number, for your use and not normally required, many
399 processors require this field to be a numeric only field.
400
401 =item po_number
402
403 Purchase order number (normally not required).
404
405 =item tax
406
407 Tax amount (portion of amount field, not added to it).
408
409 =item freight
410
411 Freight amount (portion of amount field, not added to it).
412
413 =item duty
414
415 Duty amount (portion of amount field, not added to it).
416
417 =item tax_exempt
418
419 Tax exempt flag (i.e. TRUE, FALSE, T, F, YES, NO, Y, N, 1, 0).
420
421 =item currency
422
423 Currency, specified as an ISO 4217 three-letter code, such as USD, CAD, EUR,
424 AUD, DKK, GBP, JPY, NZD, etc.
425
426 =back
427
428 =head3 CUSTOMER INFO FIELDS
429
430 =over 4
431
432 =item customer_id
433
434 A customer identifier, again not normally required.
435
436 =item name
437
438 The customer's name, your processor may not require this.
439
440 =item first_name
441
442 =item last_name
443
444 The customer's first and last name as separate fields.
445
446 =item company
447
448 The customer's company name, not normally required.
449
450 =item address
451
452 The customer's address (your processor may not require this unless you
453 are requiring AVS Verification).
454
455 =item city
456
457 The customer's city (your processor may not require this unless you
458 are requiring AVS Verification).
459
460 =item state
461
462 The customer's state (your processor may not require this unless you
463 are requiring AVS Verification).
464
465 =item zip
466
467 The customer's zip code (your processor may not require this unless
468 you are requiring AVS Verification).
469
470 =item country
471
472 Customer's country.
473
474 =item ship_first_name
475
476 =item ship_last_name
477
478 =item ship_company
479
480 =item ship_address
481
482 =item ship_city
483
484 =item ship_state
485
486 =item ship_zip
487
488 =item ship_country
489
490 These shipping address fields may be accepted by your processor.
491 Refer to the description for the corresponding non-ship field for
492 general information on each field.
493
494 =item phone
495
496 Customer's phone number.
497
498 =item fax
499
500 Customer's fax number.
501
502 =item email
503
504 Customer's email address.
505
506 =item customer_ip
507
508 IP Address from which the transaction originated.
509
510 =back
511
512 =head3 CREDIT CARD FIELDS
513
514 =over 4
515
516 =item card_number
517
518 Credit card number.
519
520 =item expiration
521
522 Credit card expiration, MM/YY.
523
524 =item cvv2
525
526 CVV2 number (also called CVC2 or CID) is a three- or four-digit
527 security code used to reduce credit card fraud.
528
529 =item card_token
530
531 If supported by your gateway, you can pass a card_token instead of a
532 card_number and expiration.
533
534 =cut
535
536 #=item card_response
537 #
538 #Some card_token schemes implement a challenge/response handshake.  In those
539 #cases, this field is used for the response.  In most cases the handshake
540 #it taken care of by the gateway module.
541
542 =item track1
543
544 Track 1 on the magnetic stripe (Card present only)
545
546 =item track2
547
548 Track 2 on the magnetic stripe (Card present only)
549
550 =item recurring_billing
551
552 Recurring billing flag
553
554 =back
555
556 =head3 ELECTRONIC CHECK FIELDS
557
558 =over 4
559
560 =item account_number
561
562 Bank account number
563
564 =item routing_code
565
566 Bank's routing code
567
568 =item account_type
569
570 Account type.  Can be (case-insensitive): B<Personal Checking>,
571 B<Personal Savings>, B<Business Checking> or B<Business Savings>.
572
573 =item account_name
574
575 Account holder's name.
576
577 =item bank_name
578
579 Bank name.
580
581 =item bank_city
582
583 Bank city.
584
585 =item bank_state
586
587 Bank state.
588
589 =item check_type
590
591 Check type.
592
593 =item customer_org
594
595 Customer organization type.
596
597 =item customer_ssn
598
599 Customer's social security number.
600
601 =item license_num
602
603 Customer's driver's license number.
604
605 =item license_dob
606
607 Customer's date of birth.
608
609 =back
610
611 =head3 RECURRING BILLING FIELDS
612
613 =over 4
614
615 =item interval 
616
617 Interval expresses the amount of time between billings: digits, whitespace
618 and units (currently "days" or "months" in either singular or plural form).
619
620 =item start
621
622 The date of the first transaction (used for processors which allow delayed
623 start) expressed as YYYY-MM-DD.
624
625 =item periods
626
627 The number of cycles of interval length for which billing should occur 
628 (inclusive of 'trial periods' if the processor supports recurring billing
629 at more than one rate)
630
631 =back
632
633 =head2 test_transaction()
634
635 Most processors provide a test mode, where submitted transactions will
636 not actually be charged or added to your batch, calling this function
637 with a true argument will turn that mode on if the processor supports
638 it, or generate a fatal error if the processor does not support a test
639 mode (which is probably better than accidentally making real charges).
640
641 =head2 require_avs()
642
643 Providing a true argument to this module will turn on address
644 verification (if the processor supports it).
645
646 =head1 TRANSACTION SUBMISSION METHOD
647
648 =head2 submit()
649
650 Submit the transaction to the processor for completion.
651
652 If there is a gateway communication error or other "meta" , the submit method
653 will throw a fatal exception.  You can catch this with eval {} if you would
654 like to treat gateway co
655
656 =head1 TRANSACTION RESULT METHODS
657
658 =head2 is_success()
659
660 Returns true if the transaction was approved by the gateway, false if 
661 it was submitted but not approved, or undef if it has not been 
662 submitted yet.
663
664 =head2 error_message()
665
666 If the transaction has been submitted but was not accepted, this
667 function will return the provided error message (if any) that the
668 processor returned.
669
670 =head2 failure_status()
671
672 If the transaction failed, it can optionally return a specific failure
673 status (normalized, not gateway-specific).  Currently defined statuses
674 are: "expired", "nsf" (non-sufficient funds), "stolen", "pickup",
675 "blacklisted" and "declined" (card/transaction declines only, not
676 other errors).
677
678 Note that not all processor modules support this, and that if supported,
679 it may not be set for all declines.
680
681 =head2 partial_auth_amount()
682
683 Amount of the partial authorization, if the processor supports them and the
684 partial_auth flag was passed to indicate they should be processed.
685
686 =head2 authorization()
687
688 If the transaction has been submitted and accepted, this function will
689 provide you with the authorization code that the processor returned.
690 Store this if you would like to run inquiries or refunds on the transaction
691 later.
692
693 =head2 order_number()
694
695 The unique order number for the transaction generated by the gateway.  Store
696 this if you would like to run inquiries or refunds on the transaction later.
697
698 =head2 card_token()
699
700 If supported by your gateway, a card_token can be used in a subsequent
701 transaction to refer to a card number.
702
703 =head2 fraud_score()
704
705 Retrieve or change the fraud score from any Business::FraudDetect plugin
706
707 =head2 fraud_transaction_id()
708
709 Retrieve or change the transaction id from any Business::FraudDetect plugin
710
711 =head2 response_code()
712
713 =head2 response_headers()
714
715 =head2 response_page()
716
717 These three fields are set by some processors (especially those which use
718 HTTPS) when the transaction fails at the communication level rather than
719 as a transaction.
720
721 response_code is the HTTP response code and message, i.e.
722 '500 Internal Server Error'.
723
724 response_headers is a hash reference of the response headers
725
726 response_page is the raw content.
727
728 =head2 result_code()
729
730 Returns the precise result code that the processor returned, these are
731 normally one letter codes that don't mean much unless you understand
732 the protocol they speak, you probably don't need this, but it's there
733 just in case.
734
735 =head2 avs_code()
736
737 =head2 cvv2_response()
738
739 =head1 MISCELLANEOUS INTERNAL METHODS
740
741 =head2 transaction_type()
742
743 Retrieve the transaction type (the 'type' argument to contents()).
744 Generally only used internally, but provided in case it is useful.
745
746 =head2 server()
747
748 Retrieve or change the processor submission server address (CHANGE AT
749 YOUR OWN RISK).
750
751 =head2 port()
752
753 Retrieve or change the processor submission port (CHANGE AT YOUR OWN
754 RISK).
755
756 =head2 path()
757
758 Retrieve or change the processor submission path (CHANGE AT YOUR OWN
759 RISK).
760
761 =head1 HELPER METHODS FOR GATEWAY MODULE AUTHORS
762
763 =head2 build_subs( @sub_names )
764
765 Build setter/getter subroutines for new return values.
766
767 =head2 get_fields( @fields )
768
769 Get the named fields if they are defined.
770
771 =head2 remap_fields( %map )
772
773 Remap field content (and stuff it back into content).
774
775 =head2 required_fields( @fields )
776
777 Croaks if any of the required fields are not present.
778
779 =head2 dump_contents
780
781 =head2 silly_bool( $value )
782
783 Returns 0 if the value starts with y, Y, t or T.
784 Returns 1 if the value starts with n, N, f or F.
785 Otherwise returns the value itself.
786
787 Use this for handling boolean content like tax_exempt.
788
789 =head1 AUTHORS
790
791 (v2 series)
792
793 Jason Kohles, email@jasonkohles.com
794
795 (v3 rewrite)
796
797 Ivan Kohler <ivan-business-onlinepayment@420.am>
798
799 Phil Lobbes E<lt>phil at perkpartners dot comE<gt>
800
801 =head1 COPYRIGHT
802
803 Copyright (c) 1999-2004 Jason Kohles
804 Copyright (c) 2004 Ivan Kohler
805 Copyright (c) 2007-2015 Freeside Internet Services, Inc.
806
807 All rights reserved.
808
809 This program is free software; you can redistribute it and/or modify it under
810 the same terms as Perl itself.
811
812 =head1 HOMEPAGE
813
814 Homepage:  http://perl.business/onlinepayment
815
816 Development:  http://perl.business/onlinepayment/ng.html
817
818 =head1 MAILING LIST
819
820 Please direct current development questions, patches, etc. to the mailing list:
821 http://420.am/cgi-bin/mailman/listinfo/bop-devel/
822
823 =head1 REPOSITORY
824
825 The code is available from our public git repository:
826
827   git clone git://git.freeside.biz/Business-OnlinePayment.git
828
829 Or on the web:
830
831   http://freeside.biz/gitweb/?p=Business-OnlinePayment.git
832   Or:
833   http://freeside.biz/gitlist/Business-OnlinePayment.git
834
835 Many (but by no means all!) processor plugins are also available in the same
836 repository, see:
837
838   http://freeside.biz/gitweb/
839   Or:
840   http://freeside.biz/gitlist/
841
842 =head1 DISCLAIMER
843
844 THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
845 WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
846 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
847
848 =head1 SEE ALSO
849
850 http://perl.business/onlinepayment
851
852 For verification of credit card checksums, see L<Business::CreditCard>.
853
854 =cut