Hola @raulonline, la situación que describes es muy común y el cambio hacia el seguimiento server-side es una necesidad. En PrestaShop 1.7.7.2, actionValidateOrder es el hook idóneo para capturar el evento de compra. El problema que a veces encuentras con objetos nulos o incompletos suele deberse a cómo se accede a los datos o a la secuencia de eventos dentro de PaymentModule::validateOrder().
La clave es asegurarte de que, al momento de ejecutar tu lógica, el objeto Order ya esté completamente persistido y que obtengas los detalles de sus relaciones (cliente, productos) de forma robusta. Aquí te propongo una modificación a tu hookActionValidateOrder que debería ser más fiable:
public function hookActionValidateOrder($params)
{
if (!isset($params['order']) || !($params['order'] instanceof Order) || !Validate::isLoadedObject($params['order'])) {
return;
}
$order = $params['order'];
$customer = new Customer((int)$order->id_customer); // Cargar el cliente si no está en $params
$currency = new Currency((int)$order->id_currency);
$contents = [];
foreach ($order->getProducts() as $product) {
He añadido algunas verificaciones para order y he cargado el objeto Customer explícitamente usando el id_customer del pedido, que es más seguro. También he iterado sobre order->getProducts() y he construido un event_id más robusto. Recuerda que los datos de usuario como el email y el teléfono deben ser hasheados (SHA256) antes de enviarse a TikTok para cumplir con la privacidad. Esto debería darte una base mucho más sólida para tu integración.