Mailing List Archive

[interchange/gateway_log: 2/11] Add gateway_log to AuthorizeNet.pm
commit 11ad20bce4d9d4b4e26d86f7dc2f050d62113292
Author: Mark Johnson <mark@endpoint.com>
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;

_______________________________________________
interchange-cvs mailing list
interchange-cvs@icdevgroup.org
http://www.icdevgroup.org/mailman/listinfo/interchange-cvs