tinkoff_acquiring/
webhook.rs

1use crate::token::{make_token, top_fields_from_value};
2use serde_json::Value;
3
4#[derive(Debug, thiserror::Error)]
5pub enum WebhookVerifyError {
6    #[error("no token in payload")]
7    NoToken,
8    #[error("token mismatch")]
9    Mismatch,
10}
11
12/// Валидация webhook: считаем токен по корневым простым полям (без Token и без вложенных).
13pub fn verify_webhook_token(
14    terminal_key: &str,
15    password: &str,
16    body: &Value,
17) -> std::result::Result<(), WebhookVerifyError> {
18    let got = body
19        .get("Token")
20        .and_then(|v| v.as_str())
21        .ok_or(WebhookVerifyError::NoToken)?;
22    let top = top_fields_from_value(body);
23    let expected = make_token(terminal_key, password, top);
24    if got == expected { Ok(()) } else { Err(WebhookVerifyError::Mismatch) }
25}