use vars qw($VERSION @ISA $DEBUG);
@ISA = qw(Business::OnlinePayment::HTTPS);
-$VERSION = '0.01';
+$VERSION = '0.02';
$DEBUG = 0;
+sub _info {
+ {
+ 'info_compat' => '0.01',
+ 'gateway_name' => 'USAePay',
+ 'gateway_url' => 'http://www.usaepay.com',
+ 'module_version' => $VERSION,
+ 'supported_types' => [ 'CC', 'ECHECK' ],
+ 'supported_actions' => {
+ CC => [
+ 'Normal Authorization',
+ 'Authorization Only',
+ 'Post Authorization',
+ 'Credit',
+ 'Void',
+ ],
+ ECHECK => [
+ 'Normal Authorization',
+ 'Credit',
+ ],
+ },
+ };
+}
+
my $default_path = '/gate.php';
my $default_cert_path = '/secure/gate.php';
$self->server('www.usaepay.com');
$self->port('443');
$self->path($default_path);
+ $self->build_subs(qw(avs_code cvv2_response));
- $self->build_subs(qw(order_number));
}
sub map_fields {
my %cc_actions = ('normal authorization' => 'sale',
'authorization only' => 'authonly',
'post authorization' => 'postauth',
+ 'credit' => 'credit',
+ 'void' => 'void',
);
my %ec_actions = ('normal authorization' => 'check',
'credit' => 'checkcredit',
}
$content{'action'} = $actions{lc($content{'action'})} || $content{'action'};
- $content{'expiration'} =~ s/\D//g;
+ $content{'expiration'} =~ s/\D//g if exists $content{'expiration'};
- $content{'md5hash'} = md5_hex(join(':', map "$content{$_}", qw(action password amount invoice_number md5key))) if defined $content{'password'};
+ $content{'md5hash'} =
+ md5_hex( join(':', map { defined($content{$_}) ? $content{$_} : '' }
+ qw(action password amount invoice_number md5key)))
+ if defined $content{'password'};
$self->content(%content);
}
routing_code => 'UMrouting',
account_number => 'UMaccount',
customer_ssn => 'UMssn',
+ action => 'UMcommand',
);
my %content = $self->content;
if ( $DEBUG ) {
my @required_fields = qw(type action login);
+ my $action = $self->{_content}->{action};
if ($self->transaction_type() eq 'CC' ) {
-# push @required_fields, qw/card_number expiration amount invoice_number name address zip/;
- push @required_fields, qw/card_number expiration amount name address zip/;
- if ($self->{_content}->{action} eq 'postauth') {
- push @required_fields, qw/authorization/;
- }
- if ( $self->{_content}->{action} eq 'void'
- || $self->{_content}->{action} eq 'capture') {
+ if ($action eq 'void' or $action eq 'capture') {
push @required_fields, qw/order_number/;
}
- }elsif ($self->transaction_type() eq 'ECHECK' ) {
-# push @required_fields, qw/routing_code account_number amount invoice_number name customer_ssn/;
+ else {
+ # sale, authonly, credit, postauth
+ push @required_fields, qw/card_number expiration amount address zip/;
+ if ($action eq 'postauth') {
+ push @required_fields, qw/authorization/;
+ }
+ }
+ }
+ elsif ($self->transaction_type() eq 'ECHECK' ) {
push @required_fields, qw/routing_code account_number amount name customer_ssn/;
} else {
croak("USAePay can't handle transaction type: ".
UMdlstate UMclerk UMterminal UMtable UMip UMsoftware UMredir
UMredirApproved UMredirDeclined UMechofields UMtestmode
) );
- $post_data{'UMtestmode'} = $self->test_transaction() ? 1 : 0;
+
+ # test_transaction(0): normal mode
+ # 1 : test mode (validates formatting only)
+ # 2 : use sandbox server
+ # 3 : test mode on sandbox server
+ my $test = $self->test_transaction || 0;
+ $self->server('sandbox.usaepay.com') if ( $test & 2 );
+ $post_data{'UMtestmode'} = ($test & 1) ? 1 : 0;
+
$post_data{'UMsoftware'} = __PACKAGE__. " $VERSION";
if ( $DEBUG ) {
warn "post_data:$_ => $post_data{$_}\n" foreach keys %post_data;
} else {
$self->is_success(0);
}
+ $self->order_number($response->{UMrefNum});
+ $self->avs_code($response->{UMavsResultCode});
+ $self->cvv2_response($response->{UMcvv2ResultCode});
$self->result_code($response->{UMresult});
$self->error_message($response->{UMerror});
$self->server_response($response);
my $tx = new Business::OnlinePayment("USAePay");
$tx->content(
- login => 'igztOatyqbpd1wsxijl4xnxjodldwdxR', #USA ePay source key
+ login => 'igztOatyqbpd1wsxijl4xnxjodldwdxR', #USAePay source key
+ password => 'abcdef', #USAePay PIN
action => 'Normal Authorization',
description => 'Business::OnlinePayment test',
amount => '49.95',
For detailed information see L<Business::OnlinePayment>.
-=head1 NOTE
-
=head1 COMPATIBILITY
-This module implements USAePay's CGI Gateway API v2.9.5. See
+This module was developed against USAePay's CGI Gateway API v2.9.5 and
+also tested against v2.17.1 without problems. See
http://www.usaepay.com/topics/api.html for details.
=head1 AUTHOR
-Jeff Finucane <jeff@cmh.net>
+Original author: Jeff Finucane <jeff@cmh.net>
+
+0.02 update and current maintainer: Ivan Kohler <ivan-bop-usaepay@freeside.biz>
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright (C) 2011 Freeside Internet Services, Inc. (http://freeside.biz/)
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ADVERTISEMENT
+
+Need a complete, open-source back-office and customer self-service solution?
+The Freeside software includes support for credit card and electronic check
+processing with USAePay and over 50 other gateways, invoicing, credit card and
+electronic check processing, integrated trouble ticketing, and customer signup
+and self-service web interfaces.
+
+http://freeside.biz/freeside/
=head1 SEE ALSO
perl(1). L<Business::OnlinePayment>.
=cut
-