use axum::{ extract::Query, routing::get, Router, }; use serde::Deserialize; use sha1::{Digest, Sha1}; #[derive(Deserialize)] pub struct WecomVerify { pub msg_signature: String, pub timestamp: String, pub nonce: String, pub echostr: String, } const WECOM_TOKEN: &str = "mytoken123456"; #[tokio::main] async fn main() { let app = Router::new() .route("/wecom", get(wecom_verify)); println!("服务器启动:127.0.0.1:8000"); axum::serve( tokio::net::TcpListener::bind("127.0.0.1:8000").await.unwrap(), app, ) .await .unwrap(); } async fn wecom_verify(Query(query): Query) -> String { let mut arr = [ WECOM_TOKEN, &query.timestamp, &query.nonce, &query.echostr, ]; arr.sort(); let mut hasher = Sha1::new(); hasher.update(arr.join("").as_bytes()); let sig = format!("{:x}", hasher.finalize()); if sig == query.msg_signature { query.echostr } else { "invalid".into() } }