package Business::OnlinePayment::PayflowPro;
use strict;
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+use vars qw($VERSION);
use Carp qw(croak);
-use AutoLoader;
-use Business::OnlinePayment;
+use base qw(Business::OnlinePayment);
-#PayflowPRO SDK from Verisign
+# PayflowPRO SDK from PayPal/Verisign
use PFProAPI qw( pfpro );
-require Exporter;
-
-@ISA = qw(Exporter AutoLoader Business::OnlinePayment);
-@EXPORT = qw();
-@EXPORT_OK = qw();
-$VERSION = '0.04';
+$VERSION = '0.05';
+$VERSION = eval $VERSION;
sub set_defaults {
my $self = shift;
$self->build_subs(qw(
vendor partner order_number cert_path avs_code cvv2_code
));
-
}
sub map_fields {
$self->content(%content);
}
-sub build_subs {
- my $self = shift;
- foreach(@_) {
- #no warnings; #not 5.005
- local($^W)=0;
- eval "sub $_ { my \$self = shift; if(\@_) { \$self->{$_} = shift; } return \$self->{$_}; }";
- }
-}
-
sub remap_fields {
my($self,%map) = @_;
$self->content(%content);
}
-sub get_fields {
- my($self,@fields) = @_;
-
- my %content = $self->content();
- my %new = ();
- foreach( grep defined $content{$_}, @fields) { $new{$_} = $content{$_}; }
- return %new;
-}
-
sub submit {
my($self) = @_;
my($month, $year, $zip);
- #unless ( $content{action} eq 'BillOrders' ) {
-
- if ( $self->transaction_type() eq 'C' ) {
- } else {
- Carp::croak("PayflowPro can't (yet?) handle transaction type: ".
- $self->transaction_type());
- }
+ if ( $self->transaction_type() ne 'C' ) {
+ croak("PayflowPro can't (yet?) handle transaction type: " .
+ $self->transaction_type());
+ }
- if ( exists($content{'expiration'}) && defined($content{'expiration'})
- && length($content{'expiration'}) ) {
+ if ( defined($content{'expiration'}) && length($content{'expiration'}) ) {
$content{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/
- or croak "unparsable expiration $content{expiration}";
+ or croak "unparsable expiration $content{expiration}";
( $month, $year ) = ( $1, $2 );
$month = '0'. $month if $month =~ /^\d$/;
- }
-
- ( $zip = $content{'zip'} ) =~ s/\D//g;
- #}
+ }
- #$content{'address'} =~ /^(\S+)\s/;
- #my $addrnum = $1;
+ ( $zip = $content{'zip'} ) =~ s/\D//g;
$self->server('test-payflow.verisign.com') if $self->test_transaction;
$self->revmap_fields(
- ACCT => 'card_number',
+ ACCT => 'card_number',
EXPDATE => \( $month.$year ),
AMT => 'amount',
USER => 'login',
- #VENDOR => \( $self->vendor ),
- VENDOR => 'login',
+ # (BUG?) VENDOR B::OP:PayflowPro < 0.05 backward compatibility. If
+ # vendor not set use login (although test indicate undef vendor is ok)
+ VENDOR => $self->vendor ? \( $self->vendor ) : 'login',
PARTNER => \( $self->partner ),
PWD => 'password',
TRXTYPE => 'action',
my @required = qw( TRXTYPE TENDER PARTNER VENDOR USER PWD );
if ( $self->transaction_type() eq 'C' ) { #credit card
- if ( $content{'action'} =~ /^[CDV]$/ && exists($content{'ORIGID'})
- && defined($content{'ORIGID'}) && length($content{'ORIGID'}) ) {
+ if ( $content{'action'} =~ /^[CDV]$/
+ && defined($content{'ORIGID'})
+ && length($content{'ORIGID'})
+ )
+ {
push @required, qw(ORIGID);
} else {
push @required, qw(AMT ACCT EXPDATE);
my %params = $self->get_fields(qw(
ACCT EXPDATE AMT USER VENDOR PARTNER PWD TRXTYPE TENDER
- STREET ZIP
- CITY COMMENT1 COMMENT2 COMPANYNAME COUNTRY FIRSTNAME LASTNAME NAME EMAIL
- STATE
+ STREET ZIP CITY COMMENT1 COMMENT2 COMPANYNAME COUNTRY
+ FIRSTNAME LASTNAME NAME EMAIL STATE
CVV2 ORIGID
));
- #print "$_ => $params{$_}\n" foreach keys %params;
-
$ENV{'PFPRO_CERT_PATH'} = $self->cert_path;
my( $response, $resultstr ) = pfpro( \%params, $self->server, $self->port );
+ # PNREF (aka transaction id) is set on success and failure
+ $self->order_number( $response->{'PNREF'} );
- #if ( $response->{'RESULT'} == 0 ) {
if ( $response->{'RESULT'} eq '0' ) { #want an explicit zero, not just
#numerically equal
$self->is_success(1);
$self->result_code( $response->{'RESULT'} );
$self->error_message( $response->{'RESPMSG'} );
$self->authorization( $response->{'AUTHCODE'} );
- $self->order_number( $response->{'PNREF'} );
my $avs_code = '';
if ( exists $response->{AVSADDR} || exists $response->{AVSZIP} ) {
if ( $response->{AVSADDR} eq 'Y' && $response->{AVSZIP} eq 'Y' ) {
}
1;
+
__END__
=head1 NAME
$tx->submit();
if($tx->is_success()) {
- print "Card processed successfully: ".$tx->authorization."\n";
- print "order number: ". $tx->order_number. "\n";
- print "AVS code: ". $tx->avs_code. "\n"; # Y - Address and ZIP match
+ print "Card processed successfully: ", $tx->authorization, "\n";
+ print "order number: ", $tx->order_number, "\n";
+ print "AVS code: ", $tx->avs_code, "\n"; # Y - Address and ZIP match
# A - Address matches but not ZIP
# Z - ZIP matches bu tnot address
# N - no match
# E - AVS error or unsupported
# (null) - AVS error
- print "CVV2 code: ". $tx->cvv2_code. "\n";
+ print "CVV2 code: ", $tx->cvv2_code, "\n";
} else {
- print "Card was rejected: ".$tx->error_message;
+ print "Card was rejected: ", $tx->error_message;
print " (CVV2 mismatch)" if $tx->result_code == 114;
print "\n";
}
=head1 COMPATIBILITY
-This module implements an interface to the PayflowPro Perl API, which can
-be downloaded at https://manager.verisign.com/ with a valid login.
+This module implements an interface to the PayflowPro Perl API, which
+can be downloaded at https://manager.verisign.com/ with a valid login.
=head1 BUGS
perl(1), L<Business::OnlinePayment>.
=cut
-