X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=Paymentech.pm;h=9eec93503c27007e5499606d1c6d812611d4317e;hb=1667d469317704ae542a9b1f6fdc8e498e0eff59;hp=d1fe2c695da044fdeb240f7e5261239dbcaf3fb2;hpb=bacd29721a27f99471a74623bdc3b626f46568a0;p=Business-BatchPayment-Paymentech.git diff --git a/Paymentech.pm b/Paymentech.pm index d1fe2c6..9eec935 100644 --- a/Paymentech.pm +++ b/Paymentech.pm @@ -65,6 +65,8 @@ use Moose; with 'Business::BatchPayment::Processor'; with 'Business::BatchPayment::TestMode'; +use Encode; + # could have some validation on all of these has [ qw(merchantID terminalID bin industryType login password) ] => ( is => 'ro', @@ -108,6 +110,7 @@ sub format_request { OUTPUT => \$output, DATA_MODE => 1, DATA_INDENT => 2, + ENCODING => 'utf-8', ); $self->format_header($batch, $xml); my $count = 1; @@ -127,6 +130,7 @@ sub format_header { my ($self, $batch, $xml) = @_; my $num_items = $batch->count; + $xml->xmlDecl(); $xml->startTag('transRequest', RequestCount => $num_items + 1); $xml->startTag('batchFileID'); $xml->dataElement(userID => $self->login); @@ -167,15 +171,15 @@ sub format_item { } push @order, ( avsZip => $item->zip, - avsAddress1 => substr($item->address, 0, 30), - avsAddress2 => substr($item->address2, 0, 30), - avsCity => substr($item->city, 0, 20), - avsState => substr($item->state, 0, 2), - avsName => substr($item->first_name. ' '. $item->last_name, 0, 30), - avsCountryCode => ( $paymentech_countries{ $item->country } - ? $_->country - : '' - ), + avsAddress1 => bytes_substr($item->address, 0, 30), + avsAddress2 => bytes_substr($item->address2, 0, 30), + avsCity => bytes_substr($item->city, 0, 20), + avsState => bytes_substr($item->state, 0, 2), + avsName => bytes_substr($item->first_name. ' '. $item->last_name, 0, 30), + ( $paymentech_countries{ $item->country } + ? ( avsCountryCode => $item->country ) + : () + ), orderID => $item->tid, amount => int( $item->amount * 100 ), ); @@ -240,17 +244,65 @@ sub parse_item { second => $sec, ); + my %failure_status = ( + # API version 2.6, April 2013 + '00' => undef, # Approved + '04' => 'pickup', + '33' => 'expired', + '41' => 'stolen', + '42' => 'inactive', + '43' => 'stolen', + '44' => 'inactive', + 'B7' => 'blacklisted', # Fraud + 'B9' => 'blacklisted', # On Negative File + 'BB' => 'stolen', # Possible Compromise + 'BG' => 'blacklisted', # Blocked Account + 'BQ' => 'blacklisted', # Issuer has Flagged Account as Suspected Fraud + 'C4' => 'nsf', # Over Credit Limit + 'D5' => 'blacklisted', # On Negative File + 'D7' => 'nsf', # Insufficient Funds + 'F3' => 'inactive', # Account Closed + 'K6' => 'nsf', # NSF + ); # all others are "decline" + + my $failure_status = undef; + my $error_message; + + if ( $resp->{procStatus} ) { + $error_message = $resp->{procStatusMessage}; + } elsif ( $resp->{respCode} ) { + $error_message = $resp->{respCodeMessage}; + $failure_status = $failure_status{ $resp->{respCode} } || 'decline'; + } else { + $error_message = ''; + } + my $item = Business::BatchPayment->create(Item => tid => $resp->{orderID}, process_date => $dt, authorization => $resp->{authorizationCode}, order_number => $resp->{txRefNum}, approved => ($resp->{approvalStatus} == 1), - error_message => $resp->{procStatusMessage}, + error_message => $error_message, + failure_status => $failure_status, ); $item; } +# internal use + +sub bytes_substr { + my ($string, $offset, $length, $repl) = @_; + my $bytes = substr( + Encode::encode('utf8', $string), + $offset, + $length, + Encode::encode('utf8', $repl) + ); + return Encode::decode('utf8', $bytes, Encode::FB_QUIET); +} + + package Business::BatchPayment::Paymentech::Transport; use File::Temp qw( tempdir );