Обратный вызов VK
const url = 'https://example.com/wp-json/wp2tutor-bot/vk/v1/callback/12';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"type":"message_new","secret":"callback-secret","object":{"message":{"peer_id":2000000001,"text":"Привет","out":0}}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/wp-json/wp2tutor-bot/vk/v1/callback/12 \ --header 'Content-Type: application/json' \ --data '{ "type": "message_new", "secret": "callback-secret", "object": { "message": { "peer_id": 2000000001, "text": "Привет", "out": 0 } } }'Callback API сообщества VK. Публичный URL. PHP сначала проверяет, что пост — wp2tutor_channel типа vk, затем token+group_id, затем JSON: поле secret должно совпасть с meta wp2tutor_bot_vk_secret. type=confirmation — строка confirmation из настроек канала; message_new с входящим текстом — AnswerService и messages.send.
Успех и часть ошибок — text/plain (VK ждёт raw ok / confirmation, не JSON). plain() ставит Content-Type: text/plain; charset=UTF-8. Ошибка messages.send логируется, клиенту всё равно 200 ok (чтобы VK не засыпал ретраями).
invalid_json / secret_required / forbidden из parseInbound уходят JSON {ok, error}: контроллер делает text/plain только если data ответа — строка.
Parameters
Заголовок раздела «Parameters»Path Parameters
Заголовок раздела «Path Parameters»ID поста CPT wp2tutor_channel, не VK group_id. Обязателен (path (?P<channel_id>\d+)). URL в метабоксе: rest_url( wp2tutor-bot/vk/v1/callback/{post_id} ). <= 0, не wp2tutor_channel или тип канала не vk — 404, тело not_found (text/plain).
Example
12Request Body
Заголовок раздела «Request Body»object
Тип события Callback API. confirmation — вернуть строку confirmation. message_new — разобрать входящее. Любое другое значение (и пустой type) — 200 ok после проверки secret.
Секрет Callback API. Сверяется с meta канала. Пустой в настройках канала — 403 secret_required. Не совпал — 403 forbidden.
Для message_new: object.message (или сам object) с text, peer_id или from_id. out=1 (исходящее сообщества) и пустой текст — 200 ok без ответа пользователю.
object
Example
{ "type": "message_new", "secret": "callback-secret", "object": { "message": { "peer_id": 2000000001, "text": "Привет", "out": 0 } }}Responses
Заголовок раздела «Responses»text/plain: ok (сообщение обработано, другой type, канал выключен, нет текста) или строка confirmation из meta канала. Не JSON.
Example
okconfig_missing — нет VK token или group_id (text/plain, код ошибки как тело). invalid_json — body не JSON-объект (application/json {ok: false, error: invalid_json}).
Example
config_missingobject
True — вебхук/callback принят (в том числе тихий ack). false — смотри error.
Машинный код при ok: false. Telegram/контроллер: bot_not_found, token_missing, secret_required, forbidden, invalid_json, telegram_api_error. VK JSON: invalid_json, secret_required, forbidden. Не человеческое сообщение и не объект WP_Error.
Example
{ "ok": false, "error": "invalid_json"}secret_required — секрет канала пустой. forbidden — JSON secret пустой или не совпал. Оба — JSON {ok: false, error}, не text/plain.
object
True — вебхук/callback принят (в том числе тихий ack). false — смотри error.
Машинный код при ok: false. Telegram/контроллер: bot_not_found, token_missing, secret_required, forbidden, invalid_json, telegram_api_error. VK JSON: invalid_json, secret_required, forbidden. Не человеческое сообщение и не объект WP_Error.
Example
{ "ok": false, "error": "forbidden"}not_found — нет поста wp2tutor_channel или тип не vk. Тело — эта строка, text/plain.
Example
not_found