From: ivan Date: Thu, 14 Aug 2003 09:35:39 +0000 (+0000) Subject: - cvv2 support X-Git-Tag: BUSINESS_ONLINEPAYMENT_PAYFLOW_PRO_0_02_01~2 X-Git-Url: http://git.freeside.biz/gitweb/?p=Business-OnlinePayment-PayflowPro.git;a=commitdiff_plain;h=3e008dffa689f34d42dd2e5c358f2cbf1b233819 - cvv2 support - authorization only, post authorization, void and credit support - sponsored by Pro Softnet Corp. / ibackup.com --- diff --git a/Changes b/Changes index 899b9ed..4e75a24 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,10 @@ Revision history for Perl extension Business::OnlinePayment::PayflowPro. +0.02 unreleased + - cvv2 support + - authorization only, post authorization, void and credit support + - this release sponsored by Pro Softnet Corp. / ibackup.com + 0.01 Wed Jan 22 02:47:25 PST 2003 - original version; created by ivan 1.0 diff --git a/PayflowPro.pm b/PayflowPro.pm index 16e499b..c63b13e 100644 --- a/PayflowPro.pm +++ b/PayflowPro.pm @@ -14,7 +14,7 @@ require Exporter; @ISA = qw(Exporter AutoLoader Business::OnlinePayment); @EXPORT = qw(); @EXPORT_OK = qw(); -$VERSION = '0.01'; +$VERSION = '0.02'; sub set_defaults { my $self = shift; @@ -43,6 +43,7 @@ sub map_fields { 'authorization only' => 'A', #Authorization 'credit' => 'C', #Credit (refund) 'post authorization' => 'D', #Delayed Capture + 'void' => 'V', ); $content{'action'} = $actions{lc($content{'action'})} || $content{'action'}; @@ -106,9 +107,6 @@ sub get_fields { sub submit { my($self) = @_; - - - $self->map_fields(); my %content = $self->content; @@ -123,11 +121,14 @@ sub submit { $self->transaction_type()); } - $content{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/ - or croak "unparsable expiration $content{expiration}"; + if ( exists($content{'expiration'}) && defined($content{'expiration'}) + && length($content{'expiration'}) ) { + $content{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/ + or croak "unparsable expiration $content{expiration}"; - ( $month, $year ) = ( $1, $2 ); - $month = '0'. $month if $month =~ /^\d$/; + ( $month, $year ) = ( $1, $2 ); + $month = '0'. $month if $month =~ /^\d$/; + } $zip = $content{'zip'} =~ s/\D//; #} @@ -163,16 +164,28 @@ sub submit { EMAIL => 'email', STATE => 'state', + CVV2 => 'cvv2', + ORIGID => 'order_number' + ); - $self->required_fields(qw( - ACCT EXPDATE AMT USER VENDOR PARTNER PWD TRXTYPE TENDER )); + my @required = qw( TRXTYPE TENDER PARTNER VENDOR USER PWD ); + if ( $self->transaction_type() eq 'C' ) { #credit card + if ( $self->action() =~ /^[CDV]$/ && exists($content{'ORIGID'}) + && defined($content{'ORIGID'}) && length($content{'ORIGID'}) ) { + push @required, qw(ORIGID); + } else { + push @required, qw(AMT ACCT EXPDATE); + } + } + $self->required_fields(@required); 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 + CVV2 ORIGID )); #print "$_ => $params{$_}\n" foreach keys %params; @@ -188,6 +201,17 @@ sub submit { $self->error_message( $response->{'RESPMSG'} ); $self->authorization( $response->{'AUTHCODE'} ); $self->order_number( $response->{'PNREF'} ); + my $avs_code = ''; + if ( $response->{AVSADDR} eq 'Y' && $response->{AVSZIP} eq 'Y' ) { + $avs_code = 'Y'; + } elsif ( $response->{AVSADDR} eq 'Y' ) { + $avs_code = 'A'; + } elsif ( $response->{AVSZIP} eq 'Y' ) { + $avs_code = 'Z'; + } elsif ( $response->{AVSADDR} eq 'N' || $response->{AVSZIP} eq 'N' ) { + $avs_code = 'N'; + } + $self->avs_code( $avs_code ); } else { $self->is_success(0); $self->result_code( $response->{'RESULT'} ); @@ -210,6 +234,7 @@ Business::OnlinePayment::PayflowPro - Verisign PayflowPro backend for Business:: my $tx = new Business::OnlinePayment( 'PayflowPro', 'vendor' => 'your_vendor', 'partner' => 'your_partner', + 'cert_path' => '/path/to/your/certificate/file/', #just the dir ); $tx->content( @@ -227,18 +252,39 @@ Business::OnlinePayment::PayflowPro - Verisign PayflowPro backend for Business:: email => 'ivan-payflowpro@420.am', card_number => '4007000000027', expiration => '09/04', + + #advanced params + cvv2 => '420', + order_number => 'string', # returned by $tx->order_number() from an + # "authorization only" or + # "normal authorization" action, used by a + # "credit", "void", or "post authorization" ); $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 + # A - Address matches but not ZIP + # Z - ZIP matches bu tnot address + # N - no match + # E - AVS error or unsupported + # (null) - AVS error + } else { - print "Card was rejected: ".$tx->error_message."\n"; + print "Card was rejected: ".$tx->error_message; + print " (CVV2 mismatch)" if $tx->result_code == 114; + print "\n"; } =head1 SUPPORTED TRANSACTION TYPES -=head2 Visa, MasterCard, American Express, JCB, Discover/Novus, Carte blanche/Diners Club +=head2 Visa, MasterCard, American Express, JCB, Discover/Novus, Carte blanche/Diners Club, CC + +=head1 SUPPORTED ACTIONS + +=head2 Normal Authorization, Authorization Only, Post Authorization, Credit, Void =head1 DESCRIPTION