enforce field lengths in raw bytes
authorMark Wells <mark@freeside.biz>
Wed, 25 Mar 2015 18:20:35 +0000 (11:20 -0700)
committerMark Wells <mark@freeside.biz>
Wed, 25 Mar 2015 18:20:35 +0000 (11:20 -0700)
Paymentech.pm

index 19277cc..31a28ee 100644 (file)
@@ -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,11 +171,11 @@ 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),
+      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 )
         : ()
@@ -393,6 +397,19 @@ sub _info {
   }
 }
 
+# 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);
+} 
+
 =head1 AUTHOR
 
 Mark Wells, C<< <mark at freeside.biz> >>