Тоже столкнулся с данной проблемой и не нашел решение на просторах интернета.
Удалось решить проблему с помощью сниппета.
$mainPage = $modx->makeUrl(1);
$resource = $modx->resource;
$orderPage = $modx->makeUrl($resource->get('id')) . $get;
switch ($step) {
case "clear":
setcookie ("myOrder", "");
break;
case "check":
if(!isset($_COOKIE["myOrder"])){
setcookie ("myOrder", $value);
$modx->sendRedirect($orderPage,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}
if($_COOKIE["myOrder"] != $value){
$modx->sendRedirect($mainPage,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}
break;
}
Вставил в tpl msOrder (с режимом "clear") и в tpl msGetOrder (с режимом "check").
&step - режим работы
&value - что писать в cookie / с чем сравнивать (генерируем маску с использованием данных заказа, например, {$order.id}{$order.num}%{$order.cost})
&get - GET параметр заказа (?msorder={$order.id})
Логика работы:
1. На странице оформления заказа чистим печеньки myOrder.
2. На странице благодарности проверяем нет ли чего в печеньках. Если печеньки myOrder пусты, то записываем в них наше секретное значение. Если не пусты - сравниваем и либо оставляем пользователя на странице, либо перенаправляем на главную.
Может решение и костыльное, но самое главное, что работает. Другое в голову пока не пришло.