[interchange/gateway_log: 6/11] Integrate gateway logging to Vend::Payment::CyberSource
Mark Johnson <[email protected]> Sat, 04 Nov 2017 18:05:39 +0000
| Newsgroups | gmane.comp.web.interchange.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit e909f7705dcd5a6f25312bd8a77d426d40e147cc Author: Mark Johnson <[email protected]> Date: Sat Jan 9 14:49:10 2010 -0500 Integrate gateway logging to Vend::Payment::CyberSource lib/Vend/Payment/CyberSource.pm | 129 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 128 insertions(+), 1 deletions(-) --- diff --git a/lib/Vend/Payment/CyberSource.pm b/lib/Vend/Payment/CyberSource.pm index 7a7c051..0927915 100644 --- a/lib/Vend/Payment/CyberSource.pm +++ b/lib/Vend/Payment/CyberSource.pm @@ -1783,6 +1783,16 @@ sub cybersource { my $cybs = Vend::Payment::CyberSource->new($opt); my %resp; + my $gwl = Vend::Payment::CyberSourceGWL + -> new({ + trans_type => $transtype, + origid => $opt->{origid}, + Enabled => charge_param('gwl_enabled'), + LogTable => charge_param('gwl_table'), + Source => charge_param('gwl_source'), + }) + ; + # Wrapping full call code to APIs in eval to # implement interaction time limit on response. eval { @@ -1809,12 +1819,16 @@ sub cybersource { die $sigalrm_die_msg; }; -#::logDebug("cybersource Sending Request...\n%s", $debug_scrub->(\%request)); + my $scrubbed_request = $debug_scrub->(\%request); +#::logDebug("cybersource Sending Request...\n%s", $scrubbed_request); + $gwl->request(eval $scrubbed_request); my $start = time; alarm $timeout; + $gwl->start; my $rv = $cybs->send(\%request, \%resp); + $gwl->stop; alarm 0; die $sigalrm_die_msg if $should_have_died; @@ -1822,6 +1836,7 @@ sub cybersource { my $end = time; #::logDebug("cybersource Response (%ds):\n%s", $end - $start, ::uneval(\%resp)); + $gwl->response(\%resp); # Initiate a timeout payment if the gateway response # itself was a timeout error @@ -1875,6 +1890,46 @@ sub cybersource { 387 => 'PayPal authorization failed', ); + my %reason_result_map = ( + 100 => 1, + 101 => 0, + 102 => 0, + 150 => -1, + 151 => -1, + 152 => -1, + 200 => 0, + 201 => 0, + 202 => 0, + 203 => 0, + 204 => 0, + 205 => 0, + 207 => 0, + 208 => 0, + 209 => 0, + 210 => 0, + 211 => 0, + 221 => 0, + 223 => 0, + 230 => 0, + 231 => 0, + 232 => 0, + 233 => 0, + 234 => -1, + 235 => 0, + 236 => 0, + 237 => 0, + 238 => 0, + 239 => 0, + 240 => 0, + 241 => 0, + 242 => 0, + 243 => 0, + 246 => 0, + 247 => 0, + 250 => -1, + 387 => 0, + ); + # Stripping out irritating prefix of each service run from each different # type of transaction. Will leave in the unadulterated versions too, in # case anyone actually needs that distinction present. @@ -1946,6 +2001,9 @@ sub cybersource { $resp{transtype} = $inv_trans_map{$transtype} || $transtype; $resp{acct_type} = $acct_type; $resp{rc_msg} = $reason_code_map{ $resp{reasonCode} } || 'Unknown'; + $resp{result_code} = $reason_result_map{ $resp{reasonCode} } || -2; + + $gwl->response(\%resp); #::logDebug("decision: $status, reason code: $resp{reasonCode}"); @@ -2512,4 +2570,73 @@ sub form_header { return $header; } +package Vend::Payment::CyberSourceGWL; + +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({ + reasonCode => -2, + rc_msg => $Vend::Payment::Global_Timeout, + }); + } + else { + my $msg = errmsg('No response. Reason unknown'); + ::logDebug($msg); + $self->response({ + reasonCode => -3, + rc_msg => $msg, + }); + } + } + my $response = $self->response; + + my %fields = ( + trans_type => $response->{transtype} || $self->{trans_type}, + processor => 'cybersource', + catalog => $Vend::Cfg->{CatalogName}, + result_code => $response->{result_code} || '', + result_subcode => $response->{decision} || '', + reason_code => $response->{reasonCode} || '', + response_msg => $response->{rc_msg} || '', + request_id => $response->{requestID} || '', + order_number => $response->{merchantReferenceCode} || $request->{merchantReferenceCode} || '', + request_duration => $self->duration, + request_date => $self->timestamp, + email => $request->{billTo_email} || '', + request => ::uneval($request) || '', + response => ::uneval($response) || '', + session_id => $::Session->{id}, + request_source => $self->source, + ); + + $fields{order_md5} = + Digest::MD5::md5_hex( + $request->{billTo_email}, + $self->{trans_type}, + $self->{origid}, + $request->{purchaseTotals_grandTotalAmount}, + $::Session->{id}, + map { ($_->{code}, $_->{quantity}) } @$Vend::Items + ) + ; + + $self->write(\%fields); +} + 1;