OneShopAPI.pm
From Developer's API
package OneShopAPI;
use LWP::UserAgent;
use strict;
sub new
{
my ($self,$current_merchant_id,$current_merchant_key,$current_api_uri) = @_;
my $class = ref($self) || $self;
my $self =
{
_merchant_id => $current_merchant_id, # constructor parameter one, optional, merchant identification number
_merchant_key => $current_merchant_key, # constructor parameter two, optional, merchant api access key
_api_uri => $current_api_uri, # constructor parameter three, optional, api uri
_api_parameters => {Key => $current_merchant_key},
_ua => undef,
_api_request => undef,
_api_response => undef
};
$self->{_ua} = LWP::UserAgent->new();
return(bless($self, $class));
}
sub api_parameter_add
{
my ($self,$current_key,$current_value) = @_;
# add parameter
$self->{_api_parameters}->{$current_key} = $current_value;
}
sub api_parameter_delete
{
my ($self,$current_key) = @_;
delete($self->{_api_parameters}->{$current_key});
}
sub api_parameter_clear
{
my ($self) = @_;
$self->{_api_parameters} = ();
$self->{_api_parameters}->{Key} = $self->{_merchant_key};
}
sub api_parameter_build
{
my ($self,$current_response_body) = @_;
my @current_results = ();
# locate <NextRecordSet> within response body
if(@current_results = ($current_response_body =~ /\s*<NextRecordSet>(?:\s*<\w+>[^<>]*<\/\w+>\s*)*<\/NextRecordSet>/g))
{
$self->api_parameter_clear();
my $current_buffer = @current_results[0];
# strip <[\/]?NextRecordSet> from buffer
$current_buffer =~ s/\s*<[\/]?NextRecordSet>\s*//g;
# retrieve child keys and values
if(@current_results = ($current_buffer =~ /\s*<(\w+)>\s*([^<>]*)<\/\1>\s*/g))
{
# for each result
for(my $current_index = 0;$current_index < scalar(@current_results);$current_index += 2)
{
# trim trailing whitespace from value
@current_results[$current_index + 1] =~ s/\s+$//g;
# add parameter key and value pair
$self->api_parameter_add(@current_results[$current_index],@current_results[$current_index + 1]);
}
}
}
}
sub send_https_request
{
my ($self, $current_uri, $current_request_body) = @_;
$self->{_api_request} = HTTP::Request->new(POST => $current_uri);
$self->{_api_request}->header("Content-Type" => "text/xml");
$self->{_api_request}->content($current_request_body);
$self->{_api_response} = $self->{_ua}->request($self->{_api_request});
return($self->{_api_response}->content());
}
sub api_request
{
my ($self, $current_method) = @_;
my $current_uri = $self->{_api_uri} . '/API/' . $self->{_merchant_id} . $current_method;
my $current_request_body = $self->create_request_xml($self->{_api_parameters});
my $current_response = $self->send_https_request($current_uri,$current_request_body);
return($current_response);
}
sub create_request_xml
{
my ($self, $current_parameters) = @_;
my $current_request_body = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Request>\n" . $self->parse_api_parameters($current_parameters) . "</Request>";
return($current_request_body);
}
sub parse_api_parameters
{
my ($self,$current_parameters) = @_;
my $current_xml_parameters = "\t";
while(my ($current_key,$current_value) = each(%{$current_parameters}))
{
$current_xml_parameters .= "<" . $current_key . ">" . $current_value . "</" . $current_key . ">\n\t"
}
$current_xml_parameters = substr($current_xml_parameters,0,-1);
return($current_xml_parameters);
}
sub xlink_api_request
{
my ($self,$current_xlink,$current_parameters) = @_;
my $current_request_body = $self->create_request_xml($current_parameters);
my $current_response = $self->send_https_request($current_xlink,$current_request_body);
return($current_response);
}
sub get_orders_list
{
my ($self) = @_;
return($self->api_request("/ORDERS/LIST"));
}
sub get_order_by_id
{
my ($self,$current_order_id) = @_;
return($self->api_request("/ORDERS/" . $current_order_id . "/READ"));
}
sub get_products_list
{
my ($self) = @_;
return($self->api_request("/PRODUCTS/LIST"));
}
sub get_product_by_id
{
my ($self,$current_product_id) = @_;
return($self->api_request("/PRODUCTS/" . $current_product_id . "/READ"));
}
sub get_clients_list
{
my ($self) = @_;
return($self->api_request("/CLIENTS/LIST"));
}
sub get_client_by_id
{
my ($self,$current_client_id) = @_;
return($self->api_request("/CLIENTS/" . $current_client_id . "/READ"));
}
sub get_errors_list
{
my ($self) = @_;
return($self->api_request("/ERRORS/LIST"));
}
sub get_available_api_methods
{
my ($self) = @_;
return($self->api_request(""));
}
my $VALID_PERL_MODULE = 1;
return $VALID_PERL_MODULE;