Skip to main content

wechat_mp_sdk/api/
soter.rs

1//! SOTER Biometric API
2
3use std::collections::HashMap;
4use std::sync::Arc;
5
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9use super::{WechatApi, WechatContext};
10use crate::error::WechatError;
11
12#[non_exhaustive]
13#[derive(Debug, Clone, Serialize)]
14pub struct VerifySignatureRequest {
15    #[serde(flatten)]
16    pub payload: HashMap<String, Value>,
17}
18
19#[non_exhaustive]
20#[derive(Debug, Clone, Deserialize, Serialize)]
21pub struct VerifySignatureResponse {
22    #[serde(default)]
23    pub(crate) errcode: i32,
24    #[serde(default)]
25    pub(crate) errmsg: String,
26    #[serde(flatten)]
27    pub extra: HashMap<String, Value>,
28}
29
30pub struct SoterApi {
31    context: Arc<WechatContext>,
32}
33
34impl SoterApi {
35    pub fn new(context: Arc<WechatContext>) -> Self {
36        Self { context }
37    }
38
39    pub async fn verify_signature(
40        &self,
41        request: &VerifySignatureRequest,
42    ) -> Result<VerifySignatureResponse, WechatError> {
43        let response: VerifySignatureResponse = self
44            .context
45            .authed_post("/cgi-bin/soter/verify_signature", request)
46            .await?;
47        WechatError::check_api(response.errcode, &response.errmsg)?;
48        Ok(response)
49    }
50}
51
52impl WechatApi for SoterApi {
53    fn context(&self) -> &WechatContext {
54        &self.context
55    }
56
57    fn api_name(&self) -> &'static str {
58        "soter"
59    }
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65
66    #[test]
67    fn verify_signature_response_deserializes() {
68        let json = r#"{"errcode":0,"errmsg":"ok","is_ok":1}"#;
69        let response: VerifySignatureResponse = serde_json::from_str(json).unwrap();
70        assert_eq!(response.errcode, 0);
71    }
72}