gruene-seele/dev/dhl-for-woocommerce/includes/pr-dhl-api/class-pr-dhl-api-rest-finder.php
Kevin Adametz 0f641ef33a Housekeeping: offene Dev-Dateien eingecheckt + Sidebar „Bestellungen"→„Versand"
- Sidebar-Menü „Bestellungen" in „Versand" umbenannt (layout-sidenav), sonst nur
  Blade-Formatierung.
- Entwicklungspläne in ISO-Datumsformat umbenannt (entwicklungsplan-aktualisiert-*).
- dev/dhl-for-woocommerce/ (DHL-Plugin) + dev/partnercenter-api.zip + PastedGraphic
  hinzugefügt.
- .claude/ bewusst NICHT eingecheckt (lokale Claude-Code-Konfiguration).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-28 12:04:41 +00:00

194 lines
6.1 KiB
PHP

<?php
if (! defined('ABSPATH')) {
exit;
} // Exit if accessed directly
class PR_DHL_API_REST_Finder extends PR_DHL_API_REST
{
/**
* Request arguments.
*/
private array $args = [];
/**
* The URL to the API.
*
* @since [*next-version*]
*/
public function __construct() {}
public function get_parcel_location($args)
{
try {
$this->set_arguments($args);
$this->set_endpoint('location-finder/v1/find-by-address');
$this->set_query_string();
// PR_DHL()->log_msg( '"get_parcel_location" called with: ' . print_r( $args , true ) );
$response_body = $this->get_request();
// PR_DHL()->log_msg( 'Response: Successful');
return $response_body;
} catch (Exception $e) {
PR_DHL()->log_msg('Response Error: '.$e->getMessage());
throw $e;
}
}
protected function set_arguments($args)
{
// Validate set args
if (empty($args['shipping_address']['city']) && empty($args['shipping_address']['postcode'])) {
throw new Exception(esc_html__('Shipping "City" and "Postcode" are empty!', 'dhl-for-woocommerce'));
}
if (empty($args['shipping_address']['country'])) {
throw new Exception(esc_html__('Shipping "Country" is empty!', 'dhl-for-woocommerce'));
}
$this->args = $args;
}
protected function set_query_string()
{
$packstation = ($this->args['dhl_packstation_filter'] == 'true');
$branch = ($this->args['dhl_branch_filter'] == 'true');
$country = $this->args['shipping_address']['country'];
if ($packstation && $branch) {
$serviceType = 'parcel:pick-up-all';
} elseif ($branch) {
$serviceType = 'parcel:pick-up';
} elseif ($packstation) {
$serviceType = ($country == 'DE') ? 'parcel:pick-up-registered' : 'parcel:pick-up-unregistered';
}
if (! isset($serviceType)) {
throw new Exception(esc_html__('No service type selected', 'dhl-for-woocommerce'));
}
$finder_query_string = [
'radius' => 2000, // in meters
'limit' => ($this->args['dhl_parcel_limit']) ? $this->args['dhl_parcel_limit'] : 10,
'serviceType' => $serviceType,
'streetAddress' => $this->args['shipping_address']['address'],
'zipCode' => $this->args['shipping_address']['postcode'],
'addressLocality' => $this->args['shipping_address']['city'],
'countryCode' => $this->args['shipping_address']['country'],
];
$this->query_string = http_build_query($finder_query_string);
}
protected function set_header($authorization = '')
{
$dhl_header['Accept'] = 'application/json';
$dhl_header['DHL-API-Key'] = $this->get_api_key();
if (! empty($authorization)) {
$dhl_header['Authorization'] = $authorization;
}
$this->remote_header = $dhl_header;
}
public function get_request()
{
$rest_auth = '';
$api_url = $this->get_api_url();
$api_url = trailingslashit($api_url);
$this->set_header();
$wp_request_url = $api_url.$this->get_endpoint().'?'.$this->get_query_string();
$wp_request_headers = $this->get_header();
PR_DHL()->log_msg('GET URL: '.$wp_request_url);
$wp_dhl_rest_response = wp_remote_get(
$wp_request_url,
[
'headers' => $wp_request_headers,
'timeout' => self::WP_POST_TIMEOUT,
]
);
// PR_DHL()->log_msg( 'GET Request Headers: ' . print_r( $wp_request_headers, true ) );
$response_code = wp_remote_retrieve_response_code($wp_dhl_rest_response);
$response_body = json_decode(wp_remote_retrieve_body($wp_dhl_rest_response));
PR_DHL()->log_msg('GET Response Code: '.$response_code);
// PR_DHL()->log_msg( 'GET Response Body: ' . print_r( $response_body, true ) );
switch ($response_code) {
case '200':
case '201':
break;
case '400':
$error_message = ($response_body->detail) ? $response_body->detail : '';
throw new Exception(esc_html__('400 - ', 'dhl-for-woocommerce').esc_html($error_message));
break;
case '401':
throw new Exception(esc_html__('401 - Unauthorized Access - Invalid token or Authentication Header parameter', 'dhl-for-woocommerce'));
break;
case '408':
throw new Exception(esc_html__('408 - Request Timeout', 'dhl-for-woocommerce'));
break;
case '429':
throw new Exception(esc_html__('429 - Too many requests in given amount of time', 'dhl-for-woocommerce'));
break;
case '503':
throw new Exception(esc_html__('503 - Service Unavailable', 'dhl-for-woocommerce'));
break;
default:
if (empty($response_body->detail)) {
$error_message = esc_html__('GET error or timeout occured. Please try again later.', 'dhl-for-woocommerce');
} else {
$error_message = str_replace('/', ' / ', $response_body->detail);
}
PR_DHL()->log_msg('GET Error: '.$response_code.' - '.$error_message);
throw new Exception(esc_html($response_code).' - '.esc_html($error_message));
break;
}
return $response_body;
}
/**
* Retrieves the API URL.
*
* @since [*next-version*]
*
* @return string
*/
public function get_api_url()
{
$api_url = defined('PR_DHL_GLOBAL_URL') ? PR_DHL_GLOBAL_URL : '';
return $api_url;
}
/**
* Retrieves the API KEY.
*
* @since [*next-version*]
*
* @return string
*/
public function get_api_key()
{
$api_key = defined('PR_DHL_GLOBAL_API') ? PR_DHL_GLOBAL_API : '';
return $api_key;
}
}