From c6ae807930217ca7080317ccd9679b2fde3c6344 Mon Sep 17 00:00:00 2001 From: plobbes Date: Sat, 18 Oct 2008 18:12:46 +0000 Subject: [PATCH] =?utf8?q?-=20include=20most=20of=20the=20patches=20from?= =?utf8?q?=20Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re=20at=20fbriere.net=20-=20req?= =?utf8?q?uest=5Fid=20now=20only=20generates=20a=20new=20id=20when=20not?= =?utf8?q?=20set=20-=20cvv2=5Fcode=20brought=20back=20for=20backwards=20co?= =?utf8?q?mpatibility=20-=20client=5Fcertification=5Fid=20now=20defaults?= =?utf8?q?=20to=20=20=20"ClientCertificationIdNotSet"=20(value=20is=20reqd?= =?utf8?q?=20but=20unused=20per=20developer=20docs)=20-=20client=5Ftimeout?= =?utf8?q?=20set=20to=2045=20by=20defaults=20(as=20recommended=20by=20deve?= =?utf8?q?loper=20docs)=20-=20several=20doc=20updates=20and=20some=20reorg?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- PayflowPro.pm | 141 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 88 insertions(+), 53 deletions(-) diff --git a/PayflowPro.pm b/PayflowPro.pm index c7d31f3..b53c39c 100644 --- a/PayflowPro.pm +++ b/PayflowPro.pm @@ -9,12 +9,26 @@ use Business::OnlinePayment::HTTPS 0.06; use base qw(Business::OnlinePayment::HTTPS); -$VERSION = '0.07_05'; +$VERSION = '0.07_06'; $VERSION = eval $VERSION; $DEBUG = 0; +# return current request_id or generate a new one if not yet set sub request_id { my $self = shift; + if ( ref($self) ) { + $self->{"__request_id"} = shift if (@_); # allow value change/reset + $self->{"__request_id"} = $self->_new_request_id() + unless ( $self->{"__request_id"} ); + return $self->{"__request_id"}; + } + else { + return $self->_new_request_id(); + } +} + +sub _new_request_id { + my $self = shift; my $md5 = Digest::MD5->new(); $md5->add( $$, time(), rand(time) ); return $md5->hexdigest(); @@ -36,6 +50,9 @@ sub debug { return ref($self) ? ( $self->{"__DEBUG"} || $DEBUG ) : $DEBUG; } +# cvv2_code: support legacy code and but deprecate method +sub cvv2_code { shift->cvv2_response(@_); } + sub set_defaults { my $self = shift; my %opts = @_; @@ -47,7 +64,8 @@ sub set_defaults { $self->path("/transaction"); $self->build_subs(qw( - partner vendor client_certification_id + partner vendor + client_certification_id client_timeout headers test_server cert_path order_number avs_code cvv2_response @@ -60,8 +78,13 @@ sub set_defaults { delete $opts{debug}; } - $self->test_server( "pilot-payflowpro.verisign.com" ); + # HTTPS Interface Dev Guide: must be set but will be removed in future + $self->client_certification_id("ClientCertificationIdNotSet"); + + # required: 45 secs recommended by HTTPS Interface Dev Guide + $self->client_timeout(45); + $self->test_server( "pilot-payflowpro.verisign.com" ); } sub _map_fields { @@ -200,11 +223,14 @@ sub submit { ) ); - # get header data, get request_id from %content if defined for ease of use + # get header data my %req_headers = %{ $self->headers || {} }; + + # get request_id from %content if defined for ease of use if ( defined $content{"request_id"} ) { - $req_headers{"X-VPS-Request-ID"} = $content{"request_id"}; + $self->request_id( $content{"request_id"} ); } + unless ( defined( $req_headers{"X-VPS-Request-ID"} ) ) { $req_headers{"X-VPS-Request-ID"} = $self->request_id(); } @@ -214,6 +240,10 @@ sub submit { $self->client_certification_id; } + unless ( defined( $req_headers{"X-VPS-Client-Timeout"} ) ) { + $req_headers{"X-VPS-Client-Timeout"} = $self->client_timeout(); + } + my %options = ( "Content-Type" => "text/namevalue", "headers" => \%req_headers, @@ -280,9 +310,9 @@ Business::OnlinePayment::PayflowPro - Payflow Pro backend for Business::OnlinePa my $tx = new Business::OnlinePayment( 'PayflowPro', - 'vendor' => 'your_vendor', - 'partner' => 'your_partner', - 'client_certification_id' => 'assigned_certification_id', #see NOTE below + 'vendor' => 'your_vendor', + 'partner' => 'your_partner', + 'client_certification_id' => 'GuidUpTo32Chars', ); # See the module documentation for details of content() @@ -341,8 +371,8 @@ modules supports. =item set_defaults() -This method sets the 'server' attribute to 'payflowpro.verisign.com' and -the port attribute to '443'. This method also sets up the +This method sets the 'server' attribute to 'payflowpro.verisign.com' +and the port attribute to '443'. This method also sets up the L described below. =item submit() @@ -351,9 +381,10 @@ L described below. =head1 Unofficial methods -This module provides the following methods which are not officially part of the -standard Business::OnlinePayment interface (as of 3.00_06) but are nevertheless -supported by multiple gateways modules and expected to be standardized soon: +This module provides the following methods which are not officially +part of the standard Business::OnlinePayment interface (as of 3.00_06) +but are nevertheless supported by multiple gateways modules and +expected to be standardized soon: =over 4 @@ -370,23 +401,53 @@ supported by multiple gateways modules and expected to be standardized soon: This module provides the following methods which are not currently part of the standard Business::OnlinePayment interface: -=over 4 +=head2 client_certification_id() -=item L +This gets/sets the X-VPS-VITCLIENTCERTIFICATION-ID which is REQUIRED +and defaults to "ClientCertificationIdNotSet". This is described in +Website Payments Pro HTTPS Interface Developer's Guide as follows: -=item L +"A random globally unique identifier (GUID) that is currently +required. This requirement will be removed in the future. At this +time, you can send any alpha-numeric ID up to 32 characters in length. -=item L +NOTE: Once you have created this ID, do not change it. Use the same ID +for every transaction." -=back +=head2 client_timeout() + +Timeout value, in seconds, after which this transaction should be +aborted. Defaults to 45, the value recommended by the Website +Payments Pro HTTPS Interface Developer's Guide. + +=head2 debug() + +Enable or disble debugging. The value specified here will also set +$Business::OnlinePayment::HTTPS::DEBUG in submit() to aid in +troubleshooting problems. + +=head2 expdate_mmyy() + +The expdate_mmyy() method takes a single scalar argument (typically +the value in $content{expiration}) and attempts to parse and format +and put the date in MMYY format as required by PayflowPro +specification. If unable to parse the expiration date simply leave it +as is and let the PayflowPro system attempt to handle it as-is. + +=head2 request_id() + +It is recommended that you specify your own unique request_id for each +transaction in %content. A request_id is REQUIRED by the PayflowPro +processor. If a request_id is not set, then Digest::MD5 is used to +attempt to generate a request_id for a transaction. =head2 Deprecated methods The following methods are deprecated and may be removed in a future -release. Values for vendor and partner should now be set as arguments to -Business::OnlinePayment->new(). The value for cert_path was used to support -passing a path to PFProAPI.pm (a Perl module/SDK from Verisign/Paypal) which is -no longer used. +release. Values for vendor and partner should now be set as arguments +to Business::OnlinePayment->new(). The value for cert_path was used +to support passing a path to PFProAPI.pm (a Perl module/SDK from +Verisign/Paypal) which is no longer used. =over 4 @@ -396,6 +457,8 @@ no longer used. =item cert_path() +=item cvv2_code() + =back =head1 Settings @@ -537,39 +600,11 @@ follows: The cvv2_response() method returns the CVV2MATCH field, which is a response message returned with the transaction result. -=head2 expdate_mmyy() - -The expdate_mmyy() method takes a single scalar argument (typically -the value in $content{expiration}) and attempts to parse and format -and put the date in MMYY format as required by PayflowPro -specification. If unable to parse the expiration date simply leave it -as is and let the PayflowPro system attempt to handle it as-is. - -=head2 request_id() - -The request_id() method uses Digest::MD5 to attempt to generate a -request_id for a transaction. It is recommended that you specify your -own unique request_id for each transaction in %content. A request_id -is REQUIRED by the PayflowPro processor. - -=head2 debug() - -Enable or disble debugging. The value specified here will also set -$Business::OnlinePayment::HTTPS::DEBUG in submit() to aid in -troubleshooting problems. - =head1 COMPATIBILITY -As of 0.07, this module communicates with the Payflow gateway directly and no -longer requires the Payflow Pro SDK or other download. Thanks to Phil Lobbes -for this great work. - -=head1 NOTE ON CERTIFICATION ID - -The Payflow API that this module interfaces with is not yet an officially -supported service and is still subject to change. At this time, you need to -contact payflowintegrator@paypal.com for a certification ID to connect and run -transactions using this module. +As of 0.07, this module communicates with the Payflow gateway directly +and no longer requires the Payflow Pro SDK or other download. Thanks +to Phil Lobbes for this great work. =head1 AUTHORS -- 2.11.0