From 880dfb1acc5767ef66d62f07936c6a369b70742f Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 3 Sep 2004 23:20:25 +0000 Subject: [PATCH] first changes for 3.00_01 test release --- Changes | 3 + MANIFEST | 4 +- META.yml | 5 +- Makefile.PL | 13 +++- OnlinePayment.pm | 37 ++++++---- OnlinePayment/HTTPS.pm | 171 +++++++++++++++++++++++++++++++++++++++++++++++ README | 16 +++-- notes_for_module_writers | 6 +- t/bop.t | 9 +++ t/bop_https.t | 9 +++ 10 files changed, 247 insertions(+), 26 deletions(-) create mode 100644 OnlinePayment/HTTPS.pm create mode 100644 t/bop.t create mode 100644 t/bop_https.t diff --git a/Changes b/Changes index 8a01eab..635b2b4 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,8 @@ Revision history for Perl extension Business::OnlinePayment. +3.00_01 Thu Aug 26 04:49:26 2004 + - first of the v3 dev releases + 0.01 Sun Jul 25 13:59:10 1999 - original version; created by h2xs 1.19 diff --git a/MANIFEST b/MANIFEST index c59ac4a..78026b8 100644 --- a/MANIFEST +++ b/MANIFEST @@ -3,6 +3,8 @@ Changes MANIFEST Makefile.PL OnlinePayment.pm -test.pl +OnlinePayment/HTTPS.pm +t/bop.t +t/bop_https.t notes_for_module_writers META.yml Module meta-data (added by MakeMaker) diff --git a/META.yml b/META.yml index 631a86d..7e0edd2 100644 --- a/META.yml +++ b/META.yml @@ -1,11 +1,12 @@ # http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Business-OnlinePayment -version: 2.01 +version: 3.00_01 version_from: OnlinePayment.pm installdirs: site requires: - Net::SSLeay: 0 + URI::Escape: 0 + Tie::IxHash: 0 distribution_type: module generated_by: ExtUtils::MakeMaker version 6.17 diff --git a/Makefile.PL b/Makefile.PL index b3115c2..93a5ebd 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -4,8 +4,17 @@ use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => 'Business::OnlinePayment', 'VERSION_FROM' => 'OnlinePayment.pm', # finds $VERSION - 'AUTHOR' => 'Jason Kohles ', + 'AUTHOR' => 'Ivan Kohler ', 'NORECURS' => 1, # dont descend into subdirectories - 'PREREQ_PM' => {'Net::SSLeay' => 0}, + 'PREREQ_PM' => { + # for HTTPS (maybe it should be a separate dist?) + 'URI::Escape' => 0, + 'Tie::IxHash' => 0, + + # 'Net::SSLeay' => 0, + # or 'Crypt::SSLeay' => 0, + # 'URI + + }, #'dist' => {CI => 'ci -l'}, ); diff --git a/OnlinePayment.pm b/OnlinePayment.pm index 3262436..c34ad8f 100644 --- a/OnlinePayment.pm +++ b/OnlinePayment.pm @@ -1,18 +1,21 @@ package Business::OnlinePayment; use strict; -use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD); +use vars qw($VERSION); # @ISA @EXPORT @EXPORT_OK $AUTOLOAD); +use Carp; require 5.004; -require Exporter; +#require Exporter; -@ISA = qw(Exporter AutoLoader); -@EXPORT = qw(); -@EXPORT_OK = qw(); +#@ISA = (); #qw(Exporter AutoLoader); +#@EXPORT = qw(); +#@EXPORT_OK = qw(); -$VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g);sprintf "%d."."%02d"x$#r,@r}; - -use Carp(); +$VERSION = '3.00_01'; +sub VERSION { #Argument "3.00_01" isn't numeric in subroutine entry + local($^W)=0; + UNIVERSAL::VERSION(@_); +} my %fields = ( is_success => undef, @@ -78,19 +81,21 @@ sub required_fields { } sub get_fields { - my($self,@fields) = @_; + my($self, @fields) = @_; my %content = $self->content(); - my %new = (); - foreach(@fields) { $new{$_} = $content{$_}; } - return %new; + + #my %new = (); + #foreach(@fields) { $new{$_} = $content{$_}; } + #return %new; + map { $_ => $content{$_} } grep defined $content{$_}, @fields; } sub remap_fields { my($self,%map) = @_; my %content = $self->content(); - foreach(%map) { + foreach( keys %map ) { $content{$map{$_}} = $content{$_}; } $self->content(%content); @@ -302,10 +307,12 @@ Retrieve or change the processor submission port (CHANGE AT YOUR OWN RISK). Retrieve or change the processor submission path (CHANGE AT YOUR OWN RISK). -=head1 AUTHOR +=head1 AUTHORS Jason Kohles, email@jasonkohles.com +(v3 rewrite) Ivan Kohler + =head1 DISCLAIMER THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED @@ -315,6 +322,8 @@ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. =head1 SEE ALSO +http://420.am/business-onlinepayment/ + For verification of credit card checksums, see L. =cut diff --git a/OnlinePayment/HTTPS.pm b/OnlinePayment/HTTPS.pm new file mode 100644 index 0000000..0ba897d --- /dev/null +++ b/OnlinePayment/HTTPS.pm @@ -0,0 +1,171 @@ +package Business::OnlinePayment::HTTPS; + +use strict; +use vars qw($VERSION @ISA $ssl_module $skip_NetSSLeay); +#use URI; +#use URI::QueryParam; +use URI::Escape; +use Tie::IxHash; + +@ISA = qw( Business::OnlinePayment ); + +$VERSION = '0.01'; + +BEGIN { + + $ssl_module = ''; + + eval { + die if defined($skip_NetSSLeay) && $skip_NetSSLeay; + require Net::SSLeay; + #import Net::SSLeay + # qw(get_https post_https make_form make_headers); + $ssl_module = 'Net::SSLeay'; + }; + + if ($@) { + eval { + require LWP::UserAgent; + require HTTP::Request::Common; + require Crypt::SSLeay; + #import HTTP::Request::Common qw(GET POST); + $ssl_module = 'Crypt::SSLeay'; + }; + } + + unless ( $ssl_module ) { + die "Net::SSLeay (+URI) or Crypt::SSLeay (+LWP) is required"; + } + +} + +=head1 NAME + +Business::OnlinePayment::HTTPS - Base class for HTTPS payment APIs + +=head1 SYNOPSIS + + package Business::OnlinePayment::MyProcessor + @ISA = qw( Business::OnlinePayment::HTTPS ); + + sub submit { + my $self = shift; + + #... + + # pass a list (order is preserved, if your gateway needs that) + ($page, $response, %reply_headers) + = $self->https_get( field => 'value', ... ); + + #or a hashref + my %hash = ( field => 'value', ... ); + ($page, $response_code, %reply_headers) + = $self->https_get( $hashref ); + + #... + } + +=head1 DESCRIPTION + +This is a base class for HTTPS based gateways, providing useful code for +implementors of HTTPS payment APIs. + +It depends on Net::SSLeay _or_ ( Crypt::SSLeay and LWP::UserAgent ). + +=head1 METHODS + +=over 4 + +=item https_get HASHREF | FIELD => VALUE, ... + +Accepts parameters as either a hashref or a list of fields and values. In the +latter case, ordering is preserved (see L to do so when passing a +hashref). + +Returns a list consisting of the page content as a string, the HTTP response +code, and a list of key/value pairs representing the HTTP response headers. + +=cut + +sub https_get { + my $self = shift; + + #accept a hashref or a list (keep it ordered) + my $post_data; + if ( ref($_[0]) ) { + $post_data = shift; + } else { + tie my %hash, 'Tie::IxHash', @_; + $post_data = \%hash; + } + + my $path = $self->path; + if ( keys %$post_data ) { + + #my $u = URI->new("", "https"); + #$u->query_param(%$post_data); + #$path .= '?'. $u->query; + + $path .= '?'. join('&', + map { uri_escape($_).'='. uri_escape($post_data->{$_}) } + keys %$post_data + ); + #warn $path; + + } + + my $referer = ''; ### XXX referer!!! + my %headers; + $headers{'Referer'} = $referer if length($referer); + + if ( $ssl_module eq 'Net::SSLeay' ) { + + import Net::SSLeay qw(get_https make_headers); + my $headers = make_headers(%headers); + get_https( $self->server, $self->port, $path, $referer, $headers ); + + } elsif ( $ssl_module eq 'Crypt::SSLeay' ) { + + import HTTP::Request::Common qw(GET); + + my $ua = new LWP::UserAgent; + my $res = $ua->request( + GET( 'https://'. $self->server. ':'. $self->port. '/'. $path ) + ); + + #( $res->as_string, # wtf? + ( $res->content, + $res->code, + map { $_ => $res->header($_) } $res->header_field_names + ); + + } else { + + die "unknown SSL module $ssl_module"; + + } + +} + +=item https_post + +Not yet implemented + +=cut + +sub https_post { + my $self = shift; + + die "not yet implemented"; +} + +=back + +=head1 SEE ALSO + +L + +=cut + +1; + diff --git a/README b/README index 0a35167..80b59d3 100644 --- a/README +++ b/README @@ -1,7 +1,8 @@ ***************************************************************************** -* Copyright (c) 1999-2004 Jason Kohles. All rights reserved. This program * -* is free software; you can redistribute it and/or modify it under the same * -* terms as Perl itself. * +* Copyright (c) 1999-2004 Jason Kohles. * +* Copyright (c) 2004 Ivan Kohler * +* All rights reserved. This program is free software; you can redistribute * +* it and/or modify it under the same terms as Perl itself. * ***************************************************************************** Business::OnlinePayment is a generic interface for processing payments through @@ -11,8 +12,11 @@ solution"). IMPORTANT: Business::OnlinePayment only defines the frontend interface to the system, in order to use it you also need to have at least one backend -processing module installed, there used to be a list here, but so many people -have contributed backends now that it is easier to search CPAN to find them. +processing module installed. -http://search.cpan.org/search?m=all&q=Business::OnlinePayment:: +Homepage: + http://420.am/business-onlinepayment/ + +Search CPAN for backends: + http://search.cpan.org/search?m=all&q=Business::OnlinePayment:: diff --git a/notes_for_module_writers b/notes_for_module_writers index 9d6d0c2..bead4e8 100644 --- a/notes_for_module_writers +++ b/notes_for_module_writers @@ -1,4 +1,8 @@ -$Id: notes_for_module_writers,v 1.1 2004-09-03 23:10:51 ivan Exp $ +These are the old v2 notes. Business::OnlinePayment::OpenECHO is the first +"v3-ish" module, if you're writing an HTTPS-interface module, try starting +from there until there's better v3 module writer's docs. + +$Id: notes_for_module_writers,v 1.2 2004-09-03 23:20:25 ivan Exp $ Information on creating a new processor backend to go with Business::OnlinePayment. diff --git a/t/bop.t b/t/bop.t new file mode 100644 index 0000000..78526b6 --- /dev/null +++ b/t/bop.t @@ -0,0 +1,9 @@ +# test 1 +BEGIN { $| = 1; print "1..1\n"; } +END {print "not ok 1\n" unless $loaded;} + +use Business::OnlinePayment; +$loaded = 1; +print "ok 1\n"; + + diff --git a/t/bop_https.t b/t/bop_https.t new file mode 100644 index 0000000..533e496 --- /dev/null +++ b/t/bop_https.t @@ -0,0 +1,9 @@ +# test 1 +BEGIN { $| = 1; print "1..1\n"; } +END {print "not ok 1\n" unless $loaded;} + +use Business::OnlinePayment::HTTPS; +$loaded = 1; +print "ok 1\n"; + + -- 2.11.0