Всем привет,
Я искал функцию API, которая для заданного адреса электронной почты добавляла бы пользователя в одну или две группы и приглашала его на форум, если у него ещё нет учётной записи. Я не нашёл такой функции, но заметил, что именно это делает функция приглашения «массовая загрузка». Это не задокументировано в API, но именно так работает браузер.
Поэтому я поступил так же, используя следующий PHP-код для отправки CSV-файла через POST:
Это отлично работало несколько месяцев, но недавно перестало работать, и в логах Discourse появилась следующая ошибка: Can't verify CSRF token authenticity.
Это ошибка, раз я должен быть аутентифицирован через ключ API? Или я пытаюсь использовать недокументированные части API, что обречено на провал?
Просто хотел уточнить, сможет ли кто-нибудь подтвердить, является ли это багом, который, вероятно, будет исправлен, или нет? В любом случае я начну искать альтернативное решение.
Привет, спасибо за внимание. Мне удалось кое-что собрать на скорую руку с использованием документированного API (с акцентом на «на скорую руку», но, возможно, это будет полезно кому-то ещё):
function tidal_process_order( $order_id ){
$order = new WC_Order($order_id);
$order_email = $order->get_billing_email();
$group_names_arr = [];
// получаем SKU как названия групп
foreach ( $order->get_items() as $item ) {
if ( $item['product_id'] > 0 ) {
$_product = $item->get_product();
$sku = $_product->get_sku();
array_push($group_names_arr, $sku);
}
}
$group_names = join(",",$group_names_arr);
// проверяем, существует ли уже пользователь Discourse с этим email
$r=wp_remote_get( "https://club.tidalcycles.org/admin/users/list/all.json?email=$order_email", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted')
)
);
$matches = json_decode($r['body']);
if (count($matches) > 0) {
// пользователь существует, добавляем его в группы
$user_id = $matches[0]->id;
foreach($group_names_arr as $group) {
// получаем ID группы по её названию
$r=wp_remote_get( "https://club.tidalcycles.org/groups/$group.json", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted')
)
);
$group = json_decode($r['body']);
$body = json_encode(array('group_id' => $group->group->id));
// добавляем пользователя в группу
$r=wp_remote_post( "https://club.tidalcycles.org/admin/users/$user_id/groups", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted',
'Content-Type' => 'application/json',
),
'body' => $body
));
}
}
else {
// пользователя нет, отправляем приглашение с названиями групп
$body = json_encode(array('email' => $order_email, 'group_names' => $group_names, "custom_message" => "Добро пожаловать!"));
$r=wp_remote_post( "https://club.tidalcycles.org/invites", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted',
'Content-Type' => 'application/json',
),
'body' => $body
));
};
}
add_action( 'woocommerce_order_status_processing', 'tidal_process_order' );