tinkoff_acquiring/
webhook.rs1use 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
12pub 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}