Checkout-CyberSource-SOAP
view release on metacpan or search on metacpan
lib/Checkout/CyberSource/SOAP.pm view on Meta::CPAN
is => 'ro',
isa => 'SOAP::Lite',
lazy => 1,
builder => '_get_agent',
);
sub _get_agent {
my $self = shift;
return SOAP::Lite->uri( 'urn:schemas-cybersource-com:transaction-data-'
. $self->cybs_version )
->proxy( 'https://'
. ( $self->production ? $self->prod_server : $self->test_server )
. '/commerce/1.x/transactionProcessor' )->autotype(0);
}
sub _get_response {
my $self = shift;
return Checkout::CyberSource::SOAP::Response->new;
}
sub addField {
my ( $self, $parentRef, $name, $val ) = @_;
push( @$parentRef, SOAP::Data->name( $name => $val ) );
}
sub addComplexType {
my ( $self, $parentRef, $name, $complexTypeRef ) = @_;
$self->addField( $parentRef, $name,
\SOAP::Data->value(@$complexTypeRef) );
}
sub addItem {
my ( $self, $parentRef, $index, $itemRef ) = @_;
my %attr;
push( @$parentRef,
SOAP::Data->name( item => \SOAP::Data->value(@$itemRef) )
->attr( { ' id' => $index } ) );
}
sub addService {
my ( $self, $parentRef, $name, $serviceRef, $run ) = @_;
push( @$parentRef,
SOAP::Data->name( $name => \SOAP::Data->value(@$serviceRef) )
->attr( { run => $run } ) );
}
sub formSOAPHeader {
my $self = shift;
my %tokenHash;
$tokenHash{Username}
= SOAP::Data->type( '' => $self->id )->prefix( $self->wsse_prefix );
$tokenHash{Password}
= SOAP::Data->type( '' => $self->key )
->attr( { 'Type' => $self->password_text } )
->prefix( $self->wsse_prefix );
my $usernameToken = SOAP::Data->name( 'UsernameToken' => {%tokenHash} )
->prefix( $self->wsse_prefix );
my $header
= SOAP::Header->name( Security =>
{ UsernameToken => SOAP::Data->type( '' => $usernameToken ) } )
->uri( $self->wsse_nsuri )->prefix( $self->wsse_prefix );
return $header;
}
sub checkout {
my ( $self, $args ) = @_;
my $refcode = $self->refcode;
my $header = $self->formSOAPHeader();
my @request;
$self->addField( \@request, 'merchantID', $self->id );
$self->addField( \@request, 'merchantReferenceCode', $refcode );
$self->addField( \@request, 'clientLibrary', 'Perl' );
$self->addField( \@request, 'clientLibraryVersion', "$]" );
$self->addField( \@request, 'clientEnvironment', "$^O" );
my @billTo;
$self->addField( \@billTo, $_, $args->{ $self->column_map->{$_} } )
for
qw/firstName lastName street1 city state postalCode country email ipAddress/;
$self->addComplexType( \@request, 'billTo', \@billTo );
my @item;
$self->addField( \@item, $_, $args->{ $self->column_map->{$_} } )
for qw/unitPrice quantity/;
$self->addItem( \@request, '0', \@item );
my @purchaseTotals;
$self->addField( \@purchaseTotals, 'currency',
$args->{ $self->column_map->{currency} } );
$self->addComplexType( \@request, 'purchaseTotals', \@purchaseTotals );
my @card;
$self->addField( \@card, $_, $args->{ $self->column_map->{$_} } )
for qw/accountNumber expirationMonth expirationYear/;
$self->addComplexType( \@request, 'card', \@card );
my @ccAuthService;
$self->addService( \@request, 'ccAuthService', \@ccAuthService, 'true' );
my $reply = $self->agent->call( 'requestMessage' => @request, $header );
return $self->response->respond( $reply, { refcode => $refcode, %{$args} }, $self->column_map );
}
__PACKAGE__->meta->make_immutable;
1;
__END__
=head1 NAME
Checkout::CyberSource::SOAP
=head2 WHAT?
A Modern Perl interface to CyberSource's
SOAP API.
( run in 2.367 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )