1 package Business::OnlinePayment::HTTPS;
4 use vars qw($VERSION @ISA $DEBUG $ssl_module $skip_NetSSLeay);
10 @ISA = qw( Business::OnlinePayment );
21 die if defined($skip_NetSSLeay) && $skip_NetSSLeay;
23 Net::SSLeay->VERSION(1.30);
25 # qw(get_https post_https make_form make_headers);
26 $ssl_module = 'Net::SSLeay';
31 require LWP::UserAgent;
32 require HTTP::Request::Common;
33 require Crypt::SSLeay;
34 #import HTTP::Request::Common qw(GET POST);
35 $ssl_module = 'Crypt::SSLeay';
39 unless ( $ssl_module ) {
40 die "One of Net::SSLeay (v1.30 or later)".
41 " or Crypt::SSLeay (+LWP) is required";
48 Business::OnlinePayment::HTTPS - Base class for HTTPS payment APIs
52 package Business::OnlinePayment::MyProcessor
53 @ISA = qw( Business::OnlinePayment::HTTPS );
60 # pass a list (order is preserved, if your gateway needs that)
61 ($page, $response, %reply_headers)
62 = $self->https_get( field => 'value', ... );
65 my %hash = ( field => 'value', ... );
66 ($page, $response_code, %reply_headers)
67 = $self->https_get( \%hash );
74 This is a base class for HTTPS based gateways, providing useful code for
75 implementors of HTTPS payment APIs.
77 It depends on Net::SSLeay _or_ ( Crypt::SSLeay and LWP::UserAgent ).
83 =item https_get HASHREF | FIELD => VALUE, ...
85 Accepts parameters as either a hashref or a list of fields and values. In the
86 latter case, ordering is preserved (see L<Tie::IxHash> to do so when passing a
89 Returns a list consisting of the page content as a string, the HTTP response
90 code, and a list of key/value pairs representing the HTTP response headers.
97 #accept a hashref or a list (keep it ordered)
102 tie my %hash, 'Tie::IxHash', @_;
106 my $path = $self->path;
107 if ( keys %$post_data ) {
109 #my $u = URI->new("", "https");
110 #$u->query_param(%$post_data);
111 #$path .= '?'. $u->query;
113 $path .= '?'. join('&',
114 map { uri_escape($_).'='. uri_escape($post_data->{$_}) }
121 my $referer = ''; ### XXX referer!!!
123 $headers{'Referer'} = $referer if length($referer);
125 if ( $ssl_module eq 'Net::SSLeay' ) {
127 import Net::SSLeay qw(get_https make_headers);
128 my $headers = make_headers(%headers);
129 get_https( $self->server, $self->port, $path, $referer, $headers );
131 } elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
133 import HTTP::Request::Common qw(GET);
135 my $url = 'https://'. $self->server;
136 $url .= ':'. $self->port
137 unless $self->port == 443;
140 my $ua = new LWP::UserAgent;
141 my $res = $ua->request( GET( $url ) );
143 #( $res->as_string, # wtf?
146 map { $_ => $res->header($_) } $res->header_field_names
151 die "unknown SSL module $ssl_module";
157 =item https_post SCALAR | HASHREF | FIELD => VALUE, ...
159 Accepts form fields and values as either a hashref or a list. In the latter
160 case, ordering is preserved (see L<Tie::IxHash> to do so when passing a
163 Also accepts instead a simple scalar containing the raw content.
165 Returns a list consisting of the page content as a string, the HTTP response
166 code, and a list of key/value pairs representing the HTTP response headers.
173 #accept a hashref or a list (keep it ordered)
175 if ( ref($_[0]) eq 'HASH' ) {
177 } elsif ( scalar(@_) > 1 ) {
178 tie my %hash, 'Tie::IxHash', @_;
180 } elsif ( scalar(@_) == 1 ) {
183 die "https_post called with no params\n";
186 my $referer = ''; ### XXX referer!!!
188 $headers{'Referer'} = $referer if length($referer);
189 $headers{'Host'} = $self->server;
191 if ( $DEBUG && ref($post_data) ) {
192 warn join('', map { " $_ => ". $post_data->{$_}. "\n" } keys %$post_data );
195 if ( $ssl_module eq 'Net::SSLeay' ) {
197 import Net::SSLeay qw(post_https make_headers make_form);
198 my $headers = make_headers(%headers);
201 warn $self->server. ':'. $self->port. $self->path. "\n";
202 $Net::SSLeay::trace = 2;
204 #post_https( $self->server, $self->port, $self->path,
205 # $headers, make_form(%$post_data) );
207 my $raw_data = ref($post_data) ? make_form(%$post_data) : $post_data;
208 post_https( $self->server, $self->port, $self->path,
209 $headers, $raw_data );
211 } elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
213 import HTTP::Request::Common qw(POST);
215 my $url = 'https://'. $self->server;
216 $url .= ':'. $self->port
217 unless $self->port == 443;
224 my $ua = new LWP::UserAgent;
227 if ( ref($post_data) ) {
228 $res = $ua->request( POST( $url, [ %$post_data ] ) );
230 my $req =new HTTP::Request( 'POST' => $url );
231 $req->content_type('application/x-www-form-urlencoded');
232 $req->content($post_data);
233 $res = $ua->request($req);
236 #( $res->as_string, # wtf?
239 map { $_ => $res->header($_) } $res->header_field_names
244 die "unknown SSL module $ssl_module";
254 L<Business::OnlinePayment>