get_header( 'x-inteltele-token' ); if ( null === $token || '' === $token ) { $query = $request->get_query_params(); $token = $query['inteltele_token'] ?? ''; } if ( ! is_string( $expected ) || '' === $expected || ! is_string( $token ) || ! hash_equals( $expected, $token ) ) { return new \WP_Error( 'inteltele_invalid_webhook_token', __( 'Security check failed. Please reload the page and try again.', 'inteltele' ), array( 'status' => 403 ) ); } return true; } /** * Message log repository. * * @var MessageLogRepository */ private $log_repository; /** * Constructor. */ public function __construct() { $this->log_repository = new MessageLogRepository(); } /** * Handle webhook payload. * * @param mixed $payload Webhook payload. * @return array */ public function handle( $payload ): array { $items = $this->normalize_payload( $payload ); $result = array( 'received' => count( $items ), 'updated' => 0, 'not_found' => 0, 'skipped' => 0, 'errors' => array(), ); foreach ( $items as $index => $item ) { $message_id = isset( $item['msgid'] ) ? sanitize_text_field( (string) $item['msgid'] ) : ''; $api_status = isset( $item['status'] ) ? strtolower( sanitize_key( (string) $item['status'] ) ) : ''; $date = isset( $item['dlr_timestamp'] ) ? sanitize_text_field( (string) $item['dlr_timestamp'] ) : ''; if ( '' === $message_id || '' === $api_status ) { $result['skipped']++; $result['errors'][] = array( 'index' => $index, 'error' => 'msgid_or_status_missing', ); continue; } $updated = $this->log_repository->update_delivery_status_by_api_message_id( $message_id, $api_status, StatusMapper::to_internal( $api_status ), $date ); if ( $updated > 0 ) { $result['updated'] += $updated; } else { $result['not_found']++; } } PluginLogger::log( 'info', 'delivery_status_webhook_received', __( 'Delivery status webhook was processed.', 'inteltele' ), $result, 'DeliveryStatusWebhook' ); return $result; } /** * Normalize payload to item list. * * @param mixed $payload Payload. * @return array> */ private function normalize_payload( $payload ): array { if ( ! is_array( $payload ) ) { return array(); } if ( isset( $payload['msgid'] ) || isset( $payload['status'] ) ) { return array( $payload ); } return array_values( array_filter( $payload, static function ( $item ): bool { return is_array( $item ); } ) ); } }