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 )