New module for preCharge
authorlawrence <lawrence>
Wed, 16 Aug 2006 23:45:12 +0000 (23:45 +0000)
committerlawrence <lawrence>
Wed, 16 Aug 2006 23:45:12 +0000 (23:45 +0000)
FraudDetect/preCharge.pm [new file with mode: 0644]

diff --git a/FraudDetect/preCharge.pm b/FraudDetect/preCharge.pm
new file mode 100644 (file)
index 0000000..da97fb3
--- /dev/null
@@ -0,0 +1,142 @@
+
+package Business::FraudDetect::preCharge;
+
+use strict;
+use Carp;
+use vars qw($VERSION @ISA);
+#use Data::Dumper;
+
+use Business::OnlinePayment::HTTPS;
+@ISA = qw / Business::OnlinePayment::HTTPS /;
+
+$VERSION = '0.01';
+
+sub set_defaults {
+    my ($self) = @_;
+    $self->server('api.precharge.net');
+    $self->port(443);
+    $self->path('/charge');
+    $self->build_subs(qw /currency risk_level error_code
+                     precharge_id precharge_security1 precharge_security2 force_success / );
+    $self->currency('USD');
+    return $self;
+}
+
+sub submit {
+    my ($self) = @_;
+    if ($self->force_success()) {
+       $self->is_success(1);
+       $self->risk_level(100);
+       $self->result_code('1');
+       $self->error_message('No Error.  Force success path');
+       return $self;
+    }
+    my %content = $self->content();
+    Carp::croak("Action: $content{action} not supported.") unless
+       lc($content{action}) eq 'fraud detect';
+    
+    $self->required_fields(qw(
+                             amount card_number expiration
+                             first_name last_name state zip country phone email
+                             ip_address
+                             ));
+
+    $self->remap_fields( qw /
+                        ip_address             ecom_billto_online_ip 
+                        zip                    ecom_billto_postal_code 
+                        phone                  ecom_billto_telecom_phone_number 
+                        first_name             ecom_billto_postal_name_first
+                        last_name              ecom_billto_postal_name_last
+                        email                  ecom_billto_online_email 
+                        amount                 ecom_transaction_amount  /
+                        );
+
+
+    my %post_data = $self->get_fields(qw ( ecom_billto_online_ip ecom_billto_postal_code
+                                          ecom_billto_telecom_phone_number ecom_billto_online_email
+                                          ecom_transaction_amount currency
+                                          ));
+
+    # set up some reasonable defaults
+
+    #
+    # split out MM/YY from exp date
+    #
+
+    @post_data{qw/ecom_payment_card_expdate_month ecom_payment_card_expdate_year/} = $content{expiration} =~ m/(\d{1,2})(\d{2})/;
+    @post_data{qw/merchant_id security_1 security_2/} = ($self->precharge_id,
+                                                        $self->precharge_security1,
+                                                        $self->precharge_security2);
+
+    if ($self->test_transaction()) {
+       $post_data{test} = 1;
+    }
+
+#    warn Dumper \%post_data;
+    my ($page, $response, %headers) = $self->https_post(\%post_data);
+
+    $self->server_response($page);
+
+    my @details = split ',',$page;
+
+    my %error_map = ( 101 => 'Invalid Request Method',
+                     102 => 'Invalid Request URL',
+                     103 => 'Invalid Security Code(s)',
+                     104 => 'Merchant Status not Verified',
+                     105 => 'Merchant Feed is Disabled',
+                     106 => 'Invalid Request Type',
+                     107 => 'Missing IP Address',
+                     108 => 'Invalid IP Address Syntax',
+                     109 => 'Missing First Name',
+                     110 => 'Invalid First Name',
+                     111 => 'Missing Last Name',
+                     112 => 'Invalid Last Name',
+                     113 => 'Invalid Address 1',
+                     114 => 'Invalid Address 2',
+                     115 => 'Invalid City',
+                     116 => 'Invalid State',
+                     117 => 'Invalid Country',
+                     118 => 'Missing Postal Code',
+                     119 => 'Invalid Postal Code',
+                     120 => 'Missing Phone Number',
+                     121 => 'Invalid Phone Number',
+                     122 => 'Missing Expiration Month',
+                     123 => 'Invalid Expiration Month',
+                     124 => 'Missing Expiration Year',
+                     125 => 'Invalid Expiration Year',
+                     126 => 'Expired Credit Card',
+                     127 => 'Missing Credit Card Number',
+                     128 => 'Invalid Credit Card Number',
+                     129 => 'Missing Email Address',
+                     130 => 'Invlaid Email Syntax',
+                     131 => 'Duplicate Transaction',
+                     132 => 'Invlaid Transaction Amount',
+                     133 => 'Invalid Currency',
+                     998 => 'Unknown Error',
+                     999 => 'Service Unavailable',
+                     1001 => 'No detail returned',
+                  );
+                  
+
+    my %output = ( error => 1001 );
+
+    foreach my $detail (@details) {
+       my ($k, $v) = split('=', $detail);
+       $output{$k} = $v;
+    }
+
+    if ($output{response} == 1 )  {
+       $self->is_success(1);
+       $self->risk_level($output{score});
+       $self->result_code($output{response});
+       $self->error_message('No Error.  Risk assesment transaction successful');
+    } else {
+       $self->is_success(0);
+       $self->result_code($output{error});
+       $self->error_message(exists $error_map{$output{error}} ? $error_map{$output{error}} :  "preCharge error $output{error} occurred.");
+    }
+}
+
+1;
+
+