[interchange/gateway_log: 2/11] Add gateway_log to AuthorizeNet.pm
Mark Johnson <[email protected]> Sat, 04 Nov 2017 18:05:19 +0000
| Newsgroups | gmane.comp.web.interchange.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 11ad20bce4d9d4b4e26d86f7dc2f050d62113292 Author: Mark Johnson <[email protected]> Date: Tue Sep 8 13:34:02 2009 -0400 Add gateway_log to AuthorizeNet.pm * Expanded out gateway_log fields to include new Authnet-specific return values. * Migrated chunk of log_it() code that would clearly be exactly duplicated between implementations into a new write() sub that actually updates the database and logs any errors that occur. dist/standard/products/gateway_log.txt | 2 +- lib/Vend/Payment/AuthorizeNet.pm | 97 +++++++++++++++++++++++++++- lib/Vend/Payment/GatewayLog.pm | 34 ++++++++++ lib/Vend/Payment/PayflowPro.pm | 114 +++++++++++++------------------- 4 files changed, 176 insertions(+), 71 deletions(-) --- diff --git a/dist/standard/products/gateway_log.txt b/dist/standard/products/gateway_log.txt index ff58fba..a04a22b 100644 --- a/dist/standard/products/gateway_log.txt +++ b/dist/standard/products/gateway_log.txt @@ -1 +1 @@ -gateway_log_id trans_type processor catalog result_code response_msg request_id order_number email session_id request_source request_date request_duration request response +gateway_log_id trans_type processor catalog order_md5 result_code result_subcode reason_code response_msg request_id order_number email session_id request_source request_date request_duration request response diff --git a/lib/Vend/Payment/AuthorizeNet.pm b/lib/Vend/Payment/AuthorizeNet.pm index 75b0f7a..7388860 100644 --- a/lib/Vend/Payment/AuthorizeNet.pm +++ b/lib/Vend/Payment/AuthorizeNet.pm @@ -525,10 +525,34 @@ sub authorizenet { ## doesn't need it delete $query{x_Trans_ID} if $no_trans_id{ $query{x_Type} }; -#::logDebug("Authorizenet query: " . ::uneval(\%query)); + my $gwl = Vend::Payment::AuthorizeNet + -> new({ + Enabled => charge_param('gwl_enabled'), + LogTable => charge_param('gwl_table'), + }) + ; + + { + my %munged_query = %query; + $munged_query{x_Card_Num} =~ s/^(\d{4})(.*)/$1 . ('X' x length($2))/e + if defined $munged_query{x_Card_Num}; + + $munged_query{$_} = 'X' + for grep { defined $munged_query{$_} } qw/x_Password x_Tran_Key/; + + $munged_query{$_} =~ s/./X/g + for grep { defined $munged_query{$_} } + qw/x_Card_Code x_bank_aba_code x_bank_acct_num/ + ; +#::logDebug("Authorizenet query: " . ::uneval(\%munged_query)); + $gwl->request(\%munged_query); + } + $opt->{extra_headers} = { Referer => $referer }; + $gwl->start; my $thing = post_data($opt, \%query); + $gwl->stop; my $page = $thing->{result_page}; my $response = $thing->{status_line}; @@ -595,6 +619,7 @@ sub authorizenet { } = split (/\037/,$page); + $gwl->response(\%result); #::logDebug(qq{authorizenet response_reason_text=$result{x_response_reason_text} response_code: $result{x_response_code}}); for (keys %result_map) { @@ -633,4 +658,74 @@ sub authorizenet { package Vend::Payment::AuthorizeNet; +use Vend::Payment::GatewayLog; +use base qw/Vend::Payment::GatewayLog/; + +# log_it() must be overridden. +sub log_it { + my $self = shift; + + my $request = $self->request; + unless ($request) { + ::logDebug('Nothing to write to %s: no request present', $self->table); + return; + } + + unless ($self->response) { + + if ($Vend::Payment::Global_Timeout) { + my $msg = errmsg('No response. Global timeout triggered'); + ::logDebug($msg); + $self->response({ + x_response_code => -2, + x_response_reason_text => $Vend::Payment::Global_Timeout, + }); + } + else { + my $msg = errmsg('No response. Reason unknown'); + ::logDebug($msg); + $self->response({ + x_response_code => -3, + x_response_reason_text => $msg, + }); + } + } + my $response = $self->response; + + my %fields = ( + trans_type => $request->{x_Type} || 'x', + processor => 'authorizenet', + catalog => $Vend::Cfg->{CatalogName}, + result_code => $response->{x_response_code} || '', + result_subcode => $response->{x_response_subcode} || '', + reason_code => $response->{x_response_reason_code} || '', + response_msg => $response->{x_response_reason_text} || '', + request_id => $response->{x_trans_id} || '', + order_number => $response->{x_invoice_num} || $request->{x_Invoice_Num} || '', + request_duration => $self->duration, + request_date => $self->timestamp, + email => $request->{x_Email} || $response->{x_email} || '', + request => ::uneval($request) || '', + response => ::uneval($response) || '', + session_id => $::Session->{id}, + ); + + my $hostname = `hostname -s`; + chomp $hostname; + $fields{request_source} = $hostname; + + $fields{order_md5} = + Digest::MD5::md5_hex( + $request->{x_Email}, + $request->{x_Type}, + $request->{x_Auth_Code}, + $request->{x_Amount}, + $::Session->{id}, + map { ($_->{code}, $_->{quantity}) } @$Vend::Items + ) + ; + + $self->write(\%fields); +} + 1; diff --git a/lib/Vend/Payment/GatewayLog.pm b/lib/Vend/Payment/GatewayLog.pm index f0bb49c..1d6a1d5 100644 --- a/lib/Vend/Payment/GatewayLog.pm +++ b/lib/Vend/Payment/GatewayLog.pm @@ -92,6 +92,40 @@ sub log_it { die 'Must override log_it() in subclass'; } +sub write { + my $self = shift; + my $data = shift; + + eval { + my $table = $self->table; + my $db = ::database_exists_ref($table) + or die "'$table' not a valid Interchange table"; + $db = $db->ref; + + $db->set_slice( + [ { dml => 'insert' } ], + $data + ) + or die "set_slice for $table failed"; + }; # End eval + + if ($@) { + my $err = $@; + ::logDebug( + q{Couldn't write to %s: %s -- request: %s -- response: %s}, + $self->table, + $err, + ::uneval($self->request), + ::uneval($self->response) + ); + } + else { + $self->clean; + } + + return 1; +} + sub table { return shift()->{_log_table}; } diff --git a/lib/Vend/Payment/PayflowPro.pm b/lib/Vend/Payment/PayflowPro.pm index 085a61b..fb383c2 100644 --- a/lib/Vend/Payment/PayflowPro.pm +++ b/lib/Vend/Payment/PayflowPro.pm @@ -865,94 +865,70 @@ use base qw/Vend::Payment::GatewayLog/; # log_it() must be overridden. sub log_it { my $self = shift; - my $request = $self->request - or ::logDebug('Cannot write to %s: no request present', $self->table), - return; - my $response = $self->response; - unless ($response) { + my $request = $self->request; + unless ($request) { + ::logDebug('Nothing to write to %s: no request present', $self->table); + return; + } + + unless ($self->response) { if ($Vend::Payment::Global_Timeout) { my $msg = errmsg('No response. Global timeout triggered'); ::logDebug($msg); - $response = { + $self->response({ RESULT => -2, RESPMSG => $Vend::Payment::Global_Timeout, - }; + }); } else { my $msg = errmsg('No response. Reason unknown'); ::logDebug($msg); - $response = { + $self->response({ RESULT => -3, RESPMSG => $msg, - }; + }); } } + my $response = $self->response; - eval { - my $table = $self->table; - my $db = ::database_exists_ref($table) - or die "'$table' not a valid Interchange table"; - $db = $db->ref; - - my %fields = ( - trans_type => $request->{TRXTYPE} || 'x', - processor => 'payflowpro', - catalog => $Vend::Cfg->{CatalogName}, - result_code => - defined ($response->{RESULT}) - && $response->{RESULT} =~ /^-?\d+$/ - ? $response->{RESULT} - : undef, - response_msg => $response->{RESPMSG} || '', - request_id => $response->{PNREF} || '', - order_number => $request->{COMMENT1} || '', - request_duration => $self->duration, - request_date => $self->timestamp, - email => $request->{EMAIL} || '', - request => ::uneval($request) || '', - response => ::uneval($response) || '', - session_id => $::Session->{id}, - ); + my %fields = ( + trans_type => $request->{TRXTYPE} || 'x', + processor => 'payflowpro', + catalog => $Vend::Cfg->{CatalogName}, + result_code => + defined ($response->{RESULT}) + && $response->{RESULT} =~ /^-?\d+$/ + ? $response->{RESULT} + : undef, + response_msg => $response->{RESPMSG} || '', + request_id => $response->{PNREF} || '', + order_number => $request->{COMMENT1} || '', + request_duration => $self->duration, + request_date => $self->timestamp, + email => $request->{EMAIL} || '', + request => ::uneval($request) || '', + response => ::uneval($response) || '', + session_id => $::Session->{id}, + ); - my $hostname = `hostname -s`; - chomp $hostname; - $fields{request_source} = $hostname; - - $fields{order_md5} = - Digest::MD5::md5_hex( - $request->{EMAIL}, - $request->{TRXTYPE}, - $request->{ORIGID}, - $request->{AMT}, - $::Session->{id}, - map { ($_->{code}, $_->{quantity}) } @$Vend::Items - ) - ; - - $db->set_slice( - [ { dml => 'insert' } ], - \%fields + my $hostname = `hostname -s`; + chomp $hostname; + $fields{request_source} = $hostname; + + $fields{order_md5} = + Digest::MD5::md5_hex( + $request->{EMAIL}, + $request->{TRXTYPE}, + $request->{ORIGID}, + $request->{AMT}, + $::Session->{id}, + map { ($_->{code}, $_->{quantity}) } @$Vend::Items ) - or die "set_slice for $table failed"; - }; # End eval - - if ($@) { - my $err = $@; - ::logDebug( - q{Couldn't write to %s: %s -- request: %s -- response: %s}, - $self->table, - $err, - ::uneval($request), - ::uneval($response) - ); - } - else { - $self->clean; - } + ; - return 1; + $self->write(\%fields); } 1;