--- /dev/null
+
+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;
+
+