[freeside-commits] freeside/FS/bin freeside-paymentech-download, NONE, 1.1 freeside-paymentech-upload, NONE, 1.1

Ivan,,, ivan at wavetail.420.am
Tue Nov 3 10:54:21 PST 2009


Update of /home/cvs/cvsroot/freeside/FS/bin
In directory wavetail.420.am:/tmp/cvs-serv9827

Added Files:
	freeside-paymentech-download freeside-paymentech-upload 
Log Message:
moving paymentech-* to FS/bin, RT#5650

--- NEW FILE: freeside-paymentech-upload ---
#!/usr/bin/perl

use strict;
use Getopt::Std;
use Net::SFTP::Foreign;
use FS::UID qw(adminsuidsetup datasrc);
use FS::Record qw(qsearch qsearchs);
use FS::pay_batch;
use FS::cust_pay_batch;
use FS::Conf;

use Date::Format 'time2str';
use File::Temp;

use vars qw( $opt_a $opt_t $opt_v );
getopts('avt');

#$Net::SFTP::Foreign::debug = -1;

sub usage { '
  Usage:
    paymentech-upload [ -v ] [ -t ] user batchnum
    paymentech-upload -a [ -v ] [ -t ] user

'
}

my $user = shift or die &usage;
adminsuidsetup $user;

my @batches; 

if($opt_a) {
  @batches = qsearch('pay_batch', { status => 'O' } );
  die "No open batches found.\n" if !@batches;
}
else {
  my $batchnum = shift;
  die &usage if !$batchnum;
  @batches = qsearchs('pay_batch', { batchnum => $batchnum } );
  die "Can't find payment batch '$batchnum'\n" if !@batches;
}

my $conf = new FS::Conf;
my @batchconf = $conf->config('batchconfig-paymentech');
# BIN, terminalID, merchantID, username, password
my $username = $batchconf[3] or die "no Paymentech batch username configured\n";
my $password = $batchconf[4] or die "no Paymentech batch password configured\n";

my $tmpdir = File::Temp->newdir();

my @filenames;

foreach my $pay_batch (@batches) {
  my $batchnum = $pay_batch->batchnum;
  my $filename = sprintf('%06d',$batchnum) . '-' .time2str('%Y%m%d%H%M%S', time);
  print STDERR "Exporting batch $batchnum to $filename...\n" if $opt_v;
  my $text = $pay_batch->export_batch('paymentech');
  $text =~ s!<fileID>FILEID</fileID>!<fileID>$filename</fileID>! 
    or die "couldn't find FILEID tag\n";
  open OUT, ">$tmpdir/$filename.xml";
  print OUT $text;
  close OUT;

  system("zip -P $password -q -j $tmpdir/$filename.zip $tmpdir/$filename.xml");

  die "failed to create zip file\n" if (! -f "$tmpdir/$filename.zip" );
  push @filenames, $filename;
}

my $host = ($opt_t ? 'orbitalbatchvar.paymentech.net' : 
                     'orbitalbatch.paymentech.net');
print STDERR "Connecting to $username\@$host...\n" if $opt_v;

my $sftp = Net::SFTP::Foreign->new( host => $host,
                                    user => $username,
                                    password => $password,
                                    timeout => 30,
                                    );
die "failed to connect to '$username\@$host'\n(".$sftp->error.")\n" 
    if $sftp->error;

foreach my $filename (@filenames) {
  $sftp->put("$tmpdir/$filename.zip", "$filename.zip")
    or die "failed to upload file (".$sftp->error.")\n";
}

print STDERR "Finished!\n" if $opt_v;

=head1 NAME

paymentech-upload

paymentech-upload - Transmit a payment batch to Chase Paymentech via SFTP.

=head1 SYNOPSIS

  paymentech-upload [ -a ] [ -v ] [ -t ] user batchnum

=head1 DESCRIPTION

Command line tool to upload a payment batch to the Chase Paymentech gateway.
The batch will be exported to the Paymentech XML format, packaged in a ZIP 
file, and transmitted via SFTP.  Use L<paymentech-download> to retrieve the 
response file.

-a: Send all open batches, instead of specifying a batchnum.

-v: Be verbose.

-t: Send the transaction to the test server.

user: freeside username

batchnum: pay_batch primary key

=head1 BUGS

Passing the zip password on the command line is slightly risky.

=head1 SEE ALSO

L<FS::pay_batch>

=cut

1;


--- NEW FILE: freeside-paymentech-download ---
#!/usr/bin/perl

use strict;
use Getopt::Std;
use Net::SFTP::Foreign;
use FS::UID qw(adminsuidsetup datasrc);
use FS::Record qw(qsearch qsearchs);
use FS::pay_batch;
use FS::cust_pay_batch;
use FS::Conf;

use Date::Format 'time2str';
use File::Temp;

use vars qw( $opt_t $opt_v $opt_a );
getopts('vta:');

#$Net::SFTP::Foreign::debug = -1;
sub usage { '
  Usage:
      paymentech-download [ -v ] [ -t ] [ -a archivedir ] user

'
}

my $user = shift or die &usage;
adminsuidsetup $user;

if ( $opt_a ) {
  die "no such directory: $opt_a\n"
    unless -d $opt_a;
  die "archive directory $opt_a is not writable by the freeside user\n"
    unless -w $opt_a;
}

my $tmpdir = File::Temp->newdir();

my $conf = new FS::Conf;
my @batchconf = $conf->config('batchconfig-paymentech');
# BIN, terminalID, merchantID, username, password
my $username = $batchconf[3] or die "no Paymentech batch username configured\n";
my $password = $batchconf[4] or die "no Paymentech batch password configured\n";

my $host = ($opt_t ? 'orbitalbatchvar.paymentech.net' : 'orbitalbatch.paymentech.net');
print STDERR "Connecting to $username\@$host...\n" if $opt_v;

my $sftp = Net::SFTP::Foreign->new( host => $host,
                                    user => $username,
                                    password => $password,
                                    timeout => 30,
                                    );
die "failed to connect to '$username\@$host'\n(".$sftp->error.")\n" if $sftp->error;

my @files = map { $_->{filename} } @{ $sftp->ls('.', wanted => qr/_resp\.zip$/) };
die "no response files found\n" if !@files;

BATCH: foreach my $filename (@files) {

  #get file
  $filename =~ s/_resp\.zip$//;
  print STDERR "Retrieving $filename\n" if $opt_v;
  $sftp->get("$filename\_resp.zip", "$tmpdir/${filename}_resp.zip");
  if($sftp->error) {
    warn "failed to download $filename\n";
    next BATCH;
  }

  #unzip file
  system("unzip -P $password -q $tmpdir/${filename}_resp.zip -d $tmpdir");
  if(! -f "$tmpdir/${filename}_resp.xml") {
    warn "failed to extract ${filename}_resp.xml\n";
    next BATCH;
  }

  #copy to archive dir
  if ( $opt_a ) {
    print STDERR "Copying $tmpdir/${filename}_resp.xml to archive dir $opt_a\n"
      if $opt_v;
    system 'cp', "$tmpdir/${filename}_resp.xml", $opt_a;
    warn "failed to copy $tmpdir/${filename}_resp.xml to $opt_a: $@" if $@;
  }

  #get batchnum & retrieve pending batch
  open my $fh, "<$tmpdir/${filename}_resp.xml";
  my ($batchnum) = split ('-', $filename); 
  $batchnum = sprintf("%d", $batchnum); # remove leading zeroes
  my $batch = qsearchs('pay_batch', { batchnum => $batchnum });
  if(! $batch) {
    warn "batch '$batchnum' not found\n";
    next BATCH;
  }

  #and import results
  print STDERR "Importing batch #$batchnum\n" if $opt_v;
  my $error = $batch->import_results( filehandle => $fh,
                                      format     => 'paymentech' );
  warn "error: $error\n" if $error;

}

print STDERR "Finished!\n" if $opt_v;

=head1 NAME

paymentech-download

paymentech-download - Retrieve payment batch responses from Chase Paymentech.

=head1 SYNOPSIS

  paymentech-download [ -v ] [ -t ] [ -a archivedir ] user

=head1 DESCRIPTION

Command line tool to download payment batch responses from the Chase Paymentech
gateway.  These are XML files packaged in ZIP files.  This script downloads them 
by SFTP, extracts the contents, and passes them to L<FS::pay_batch::import_result>.

-v: Be verbose.

-t: Use the test server.

-a directory: Archive response files in the provided directory.

user: freeside username

=head1 BUGS

=head1 SEE ALSO

L<FS::pay_batch>

=cut

1;




More information about the freeside-commits mailing list