1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#!/usr/bin/perl
use strict;
use Getopt::Std;
use Date::Format qw(time2str);
use File::Temp qw(tempdir); #0.19 for ->newdir() interface, not in 5.10.0
use Net::SFTP::Foreign;
use Expect;
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 vars qw( $opt_t $opt_v $opt_a );
getopts('vta:');
#$Net::SFTP::Foreign::debug = -1;
sub usage { "
Usage:
freeside-paymentech-download [ -v ] [ -t ] [ -a archivedir ] user\n
" }
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 $unzip_check = `which unzip` or die "can't find unzip executable\n";
#my $tmpdir = File::Temp->newdir();
my $tmpdir = tempdir( CLEANUP => 1 ); #DIR=>somewhere?
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 from ${filename}_resp.zip\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
freeside-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;
|