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