Business-OnlinePayment-DLocal

 view release on metacpan or  search on metacpan

lib/Business/OnlinePayment/DLocal.pm  view on Meta::CPAN

    my $config = {
        url => 'https://'.$self->server.'/api_curl/cc/capture',
        control => ['x_invoice','x_auth_id','x_amount','x_currency'],
        post_data => ['x_login','x_trans_key','x_version','x_invoice','x_amount','x_currency','x_auth_id','control','type'],
    };

    my $res = $self->_send_request($config,$content);
    $self->error_message( $res->{'desc'} );
    $self->result_code( $res->{'error_code'} );
    $self->is_success( defined $res->{'result'} && $res->{'result'} =~ /^9|11$/ ? 1 : 0 );
    $self->order_number( $res->{'x_document'} // $res->{'x_auth_id'} ); # sale vs auth
    $res;
}


sub _tokenize {
    my ($self,$content) = @_;

    my $config = {
        url => 'https://'.$self->server.'/api_curl/cc/save',
        control => ['x_email','cc_number','cc_exp_month','cc_cvv','cc_exp_year','x_cpf','x_country'],
        post_data => ['x_login','x_trans_key','x_version','x_country','x_cpf','x_name','x_email','cc_number','cc_exp_month','cc_exp_year','cc_cvv','control','type'],
    };

    my $res = $self->_send_request($config,$content);
    $self->error_message( $res->{'desc'} );
    $self->result_code( $res->{'error_code'} );
    $self->is_success( $res->{'cc_token'} ? 1 : 0 );
    $self->card_token( $res->{'cc_token'} );
    $res;
}


sub _credit {
    my ($self,$content) = @_;

    my $config = {
        url => 'https://'.$self->server.'/api_curl/cc/refund',
        control => ['x_document','x_invoice','x_amount','x_currency'],
        post_data => ['x_login','x_trans_key','x_version','x_invoice','x_document','x_amount','x_currency','control','type'],
    };

    my $res = $self->_send_request($config,$content);
    $self->error_message( $res->{'desc'} );
    $self->result_code( $res->{'error_code'} );
    $self->is_success( defined $res->{'result'} && $res->{'result'} eq '1' ? 1 : 0 );
    $self->order_number( $res->{'x_document'} );
    $res;
}


sub _paystatus {
    my ($self,$content) = @_;

    my $config = {
        url => 'https://'.$self->server.'/api_curl/query/paystatus',
        control => [], # not used
        post_data => ['x_login','x_trans_key','x_version','x_invoice','x_document','type'],
    };

    # query api uses different credentials
    local $content->{'login'} = $content->{'reports_login'};
    local $content->{'password'} = $content->{'reports_key'};

    my $res = $self->_send_request($config,$content);
    $self->error_message( $res->{'desc'} );
    $self->result_code( $res->{'error_code'} );
    $self->is_success( defined $res->{'result'} ); # any result is a positive think for a query call
    $self->order_number( $res->{'x_document'} );
    $res;
}


sub _refundstatus {
    my ($self,$content) = @_;

    my $config = {
        url => 'https://'.$self->server.'/api_curl/query/refundstatus',
        control => [], # not used
        post_data => ['x_login','x_trans_key','x_version','x_refund','type'],
    };

    # query api uses different credentials
    local $content->{'login'} = $content->{'reports_login'};
    local $content->{'password'} = $content->{'reports_key'};

    my $res = $self->_send_request($config,$content);
    $self->error_message( $res->{'desc'} );
    $self->result_code( $res->{'error_code'} );
    $self->is_success( defined $res->{'result'} ); # any result is a positive think for a query call
    $self->order_number( $res->{'x_document'} );
    $res;
}


sub _currencyexchange {
    my ($self,$content) = @_;

    my $config = {
        url => 'https://'.$self->server.'/api_curl/query/currencyexchange',
        control => [], # not used
        post_data => ['x_login','x_trans_key','x_country','type'],
    };

    # query api uses different credentials
    local $content->{'login'} = $content->{'reports_login'};
    local $content->{'password'} = $content->{'reports_key'};

    my $res = $self->_send_request($config,$content);
    if ($res =~ /^\d+(:?\.\d+)$/ && $res > 0 ) {
        $self->is_success( 1 );
        $self->order_number( $res );
    } else {
        $self->is_success( 0 );
        $self->order_number( undef );
    }
    $res;
}


sub _send_request {
    my ($self,$config,$content) = @_;
    my %content = %$content;
    my %remap_fields = $self->field_map();

    $self->_dlocal_scrubber_add_card($content{'card_number'});
    scrubber_add_scrubber({'cc_cvv='.$content{'cvv2'}=>'cc_cvv=DELETED'}) if defined $content{'cvv2'};

    my $message = '';
    foreach my $key ( @{$config->{'control'}} ) { $message .= $content{$remap_fields{$key}}//''; }
    local $content{'control'} = uc(hmac_sha256_hex(pack('A*',$message), pack('A*',$content{'password2'})));

    my $post_data;
    foreach my $key ( @{$config->{'post_data'}} ) {
        $post_data .= uri_escape($key).'='.uri_escape($content{$remap_fields{$key}}).'&' if $content{$remap_fields{$key}};
    }
    my $url = $config->{'url'};
    $self->server_request( $url.'?'.$post_data ); # yeah it's in GET, but it's easy to read that way
    my $verify_ssl = 1;

    my $response;
    if (ref $self->{'mocked'} eq 'ARRAY' && scalar @{$self->{'mocked'}}) {
        my $mock = shift @{$self->{'mocked'}};
        die "Unexpected mock action" unless lc($mock->{'action'}) eq lc($content->{'action'});
        die "Unexpected mock login" unless $mock->{'login'} eq $content{'login'};
        $response->{'content'} = $mock->{'resp'};
    } else {
        $response = HTTP::Tiny->new( verify_SSL=>$verify_ssl )->request('POST', $url, {
            headers => {
                'Content-Length' => length($post_data),
                'Content-Type' => 'application/x-www-form-urlencoded',
                'Accept' => 'application/json',
            },
            content => $post_data,
        } );
    }
    $self->server_response( $response->{'content'} );
    my $c = substr($response->{'content'},0,1);
    my $res = $c eq '{' ? decode_json( $response->{'content'} )
        : $c eq '<' ? $self->_parse_xml_response( $response->{'content'}, $response->{'status'} ) # just in case
        : $response->{'content'}; # return raw (for currencyexchange)
    $res;
}




( run in 1.069 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )