use Business::OnlinePayment 3;
use Business::OnlinePayment::HTTPS;
use XML::Simple;
+use MIME::Base64;
use Date::Format 'time2str';
use Date::Parse 'str2time';
use vars qw($VERSION @ISA $me $DEBUG);
# get_returns puts its results here
my $tid = $reply->{Response}->{TransactionID};
if($self->{_content}->{command} eq 'get_returns') {
- $self->{_content}->{returns} = [ map { $_->{value} } @$tid ];
+ if(ref($tid) eq 'ARRAY') {
+ $self->{_content}->{returns} = [ map { $_->{value} } @$tid ];
+ }
+ else {
+ $self->{_content}->{returns} = [ $tid->{value} ];
+ }
}
else { # It's not get_returns
$self->authorization($tid->{value});
if(exists($content->{'command'})) {
croak 'get_returns: command is already set on this transaction';
}
- $content->{'command'} = 'get_returns';
- $self->submit;
- if($self->is_success) {
- if(exists($content->{'returns'})) {
- return @{$content->{'returns'}};
+ if ($content->{'returns_method'} eq 'transret') {
+ $Business::OnlinePayment::HTTPS::DEBUG = $DEBUG;
+ if (defined($content->{'login'}) and defined($content->{'password'})) {
+ # date range doesn't work quite right with transret
+ my $path = ('transret.php?style=csv&sort=id&date=');
+ my $starttime = str2time($self->_start);
+ my $endtime = str2time($self->_end) - 1;
+ $DB::single=1;
+ my @months = map { s/^(....)(..)$/$1-$2-01/; $_ } (
+ time2str('%Y%m', $starttime)..time2str('%Y%m', $endtime)
+ );
+ my $headers = {
+ Authorization => 'Basic ' . MIME::Base64::encode($content->{'login'} . ':' . $content->{'password'})
+ };
+ my @tids;
+ foreach my $m (@months) {
+ $self->path($path . $m);
+ my ($page, $reply, %headers) =
+ $self->https_get(
+ { headers => $headers },
+ {},
+ );
+ if ($reply =~ /^200/) {
+ $self->is_success(1);
+ }
+ else {
+ $self->error_message($reply);
+ carp $page if $DEBUG > 1;
+ $self->is_success(0);
+ return;
+ }
+ foreach my $trans (split("\cJ", $page)) {
+ my @fields = split(',', $trans);
+ # fields:
+ # id, Date Returned, Type, Amount, Name, Customer ID Number, Email Address, Invoice Number, Status Code, SEC
+ # we only care about id and date.
+ next if scalar(@fields) < 10;
+ next if not($fields[0] =~ /^\d+$/);
+ my $rettime = str2time($fields[1]);
+ next if (!$rettime or $rettime < $starttime or $rettime > $endtime);
+ carp $trans if $DEBUG > 1;
+ push @tids, $fields[0];
+ }
+ }
+ return @tids;
}
else {
- return ();
+ croak 'login and password required';
}
- }
+ }
else {
+ $content->{'command'} = 'get_returns';
+ $self->submit;
+ if($self->is_success) {
+ if(exists($content->{'returns'})) {
+ return @{$content->{'returns'}};
+ }
+ else {
+ return ();
+ }
+ } else {
# you need to check error_message() for details.
return ();
+ }
}
}
sub _start {
my $self = shift;
- my $start = time2str('%Y-%m-%d', str2time($self->{_content}->{start}));
- croak "Invalid start date: '".$self->{_content}->{start} if !$start;
- return $start;
+ if($self->{_content}->{start}) {
+ my $start = time2str('%Y-%m-%d', str2time($self->{_content}->{start}));
+ croak "Invalid start date: '".$self->{_content}->{start} if !$start;
+ return $start;
+ }
+ else {
+ return time2str('%Y-%m-%d', time - 86400);
+ }
}
sub _end {