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