package Business::OnlinePayment::HTTPS; use strict; use base qw(Business::OnlinePayment); use vars qw($VERSION $DEBUG); use Tie::IxHash; use Net::HTTPS::Any 0.10; $VERSION = '0.10'; $DEBUG = 0; =head1 NAME Business::OnlinePayment::HTTPS - Base class for HTTPS payment APIs =head1 SYNOPSIS package Business::OnlinePayment::MyProcessor; use base 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( \%hash ); #... } =head1 DESCRIPTION This is a base class for HTTPS based gateways, providing useful code for implementors of HTTPS payment APIs. It depends on Net::HTTPS::Any, which in turn depends on Net::SSLeay _or_ ( Crypt::SSLeay and LWP::UserAgent ). =head1 METHODS =over 4 =item https_get [ \%options ] 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 message (i.e. "200 OK" or "404 Not Found"), and a list of key/value pairs representing the HTTP response headers. The options hashref supports setting headers: { headers => { 'X-Header1' => 'value', ... }, } =cut # Content-Type => 'text/namevalue', sub https_get { my $self = shift; # handle optional options hashref my $opts = {}; if ( scalar(@_) > 1 and ref( $_[0] ) eq "HASH" ) { $opts = shift; } # accept a hashref or a list (keep it ordered) my $post_data; if ( ref( $_[0] ) eq 'HASH' ) { $post_data = shift; } elsif ( scalar(@_) > 1 ) { tie my %hash, 'Tie::IxHash', @_; $post_data = \%hash; } elsif ( scalar(@_) == 1 ) { $post_data = shift; } else { die "https_get called with no params\n"; } $self->build_subs(qw( response_page response_code response_headers )); my( $res_page, $res_code, @res_headers) = Net::HTTPS::Any::https_get( 'host' => $self->server, 'path' => $self->path, 'headers' => $opts->{headers}, 'args' => $post_data, 'debug' => $DEBUG, ); $self->response_page( $res_page ); $self->response_code( $res_code ); $self->response_headers( { @res_headers } ); ( $res_page, $res_code, @res_headers ); } =item https_post [ \%options ] SCALAR | HASHREF | FIELD => VALUE, ... Accepts form fields and values as either a hashref or a list. In the latter case, ordering is preserved (see L to do so when passing a hashref). Also accepts instead a simple scalar containing the raw content. Returns a list consisting of the page content as a string, the HTTP response code and message (i.e. "200 OK" or "404 Not Found"), and a list of key/value pairs representing the HTTP response headers. The options hashref supports setting headers and Content-Type: { headers => { 'X-Header1' => 'value', ... }, Content-Type => 'text/namevalue', } =cut sub https_post { my $self = shift; # handle optional options hashref my $opts = {}; if ( scalar(@_) > 1 and ref( $_[0] ) eq "HASH" ) { $opts = shift; } my %post = ( 'host' => $self->server, 'path' => $self->path, 'headers' => $opts->{headers}, 'Content-Type' => $opts->{'Content-Type'}, 'debug' => $DEBUG, ); # accept a hashref or a list (keep it ordered) my $post_data = ''; my $content = undef; if ( ref( $_[0] ) eq 'HASH' ) { $post{'args'} = shift; } elsif ( scalar(@_) > 1 ) { tie my %hash, 'Tie::IxHash', @_; $post{'args'} = \%hash; } elsif ( scalar(@_) == 1 ) { $post{'content'} = shift; } else { die "https_post called with no params\n"; } $self->build_subs(qw( response_page response_code response_headers )); my( $res_page, $res_code, @res_headers)= Net::HTTPS::Any::https_post(%post); $self->response_page( $res_page ); $self->response_code( $res_code ); $self->response_headers( { @res_headers } ); ( $res_page, $res_code, @res_headers ); } =back =head1 SEE ALSO L, L =cut 1;