/usr/local/CPAN/Business-OnlinePayment-Iridium/Business/OnlinePayment/Iridium/Action.pm
package Business::OnlinePayment::Iridium::Action;
use Moose::Role;
use Template;
use LWP::UserAgent ();
use HTTP::Request ();
use XML::Simple ();
sub SERVERS {
return ( 'https://gw1.iridiumcorp.net/', 'https://gw2.iridiumcorp.net/' );
}
has 'MerchantID' => (
isa => 'Str',
is => 'rw',
required => '1'
);
has 'Password' => (
isa => 'Str',
is => 'rw',
required => '1'
);
has 'CurrencyCode' => (
isa => 'Int',
is => 'rw',
default => '826' # GBP
);
has 'PassOutData' => (
isa => 'Str',
is => 'rw',
required => '0'
);
has '_user_agent' => (
isa => 'LWP::UserAgent',
is => 'ro',
default => sub {
return LWP::UserAgent->new( agent => 'Business::OnlinePayment::Iridium',
);
}
);
has '_type' => (
isa => 'Str',
is => 'ro',
lazy_build => '1'
);
requires '_build__type';
requires 'template';
sub _build_req_content {
my $self = shift;
my $vars = {
map {
my $attr_name = $_->name;
$attr_name => $self->$attr_name
} $self->meta->get_all_attributes
};
my ( $template, $output ) = ( $self->template, '' );
my $tt = Template->new();
$tt->process( \$template, $vars, \$output ) || confess $tt->error;
return $output;
}
sub request {
my $self = shift;
my $content = $self->_build_req_content;
my $action_url = 'https://www.thepaymentgateway.net/';
my $ua = $self->_user_agent;
my @SERVERS = $self->SERVERS;
my $req = HTTP::Request->new( POST => $SERVERS[0] );
$req->content_type('text/xml; charset=UTF-8');
$req->header( 'SOAPAction' => $action_url . $self->_type );
$req->content($content);
$req->content_length( length($content) );
my $res = $ua->request($req);
if ( $res->is_success ) {
return $self->parse_response( $res->content );
}
else {
$req->uri( $SERVERS[1] );
$res = $ua->request($req);
if ( $res->is_success && $res->content ) {
return $self->parse_response( $res->content );
}
else {
confess $res->status_line;
}
}
}
sub parse_response {
my ( $self, $content ) = @_;
my $parser = XML::Simple->new;
return $parser->XMLin($content);
}
1;