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 )