fache 0.1.351

发车工具箱
Documentation
#[cfg(feature = "wxmini")]
#[allow(dead_code)]
pub mod wxmini {
    use crate::{
        all::wxmini::{ResMiniUserInfo, WxMiniAccessTokenReData, WxMiniQrCodeData},
        wxmini::open::{GetPhoneNumber, PhoneNumberResponse, WxMiniLoginResponse},
    };
    use reqwest::Client;
    use serde::{Deserialize, Serialize};
    use std::error::Error;
    #[derive(PartialEq, Serialize, Deserialize, Debug, Clone)]
    pub struct WxMini {
        pub appid: String,
        pub secret: String,
        pub code: String,
        pub grant_type: Option<String>,
    }
    impl WxMini {
        pub async fn login(&self) -> WxMiniLoginResponse {
            let url = format!(
                "https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code&js_code={}&appid={}&secret={}",
                self.code, self.appid, self.secret,
            );
            let response = Client::new()
                .get(url)
                .send()
                .await
                .expect("微信小程序登录发起 WxMiniCodeToLogin 请求失败");
            // 解析响应体为 WxMiniLoginResponse 结构体
            response
                .json::<WxMiniLoginResponse>()
                .await
                .expect("微信小程序登录解析响应体为 WxMiniLoginResponse 结构体 --失败")
        }
        pub async fn get_wxmini_access_token(&self) -> WxMiniAccessTokenReData {
            let url = format!(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}",
                self.appid, self.secret,
            );
            let response = Client::new().get(url).send().await.unwrap_or_else(|_| {
                panic!(
                    "微信小程序{}发起 WxMiniAppidAppsecret 获取 access_token 请求失败",
                    self.appid
                )
            });
            response
            .json::<WxMiniAccessTokenReData>()
            .await
            .expect("微信小程序发起 WxMiniAppidAppsecret获取 access_token解析响应体为 WxMiniAccessTokenReData 结构体 --失败")
        }
        pub async fn get_mini_user_info(&self) -> ResMiniUserInfo {
            let url = format!(
                "https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type={}",
                self.appid.clone(),
                self.secret,
                self.code,
                self.grant_type.as_deref().unwrap_or("authorization_code")
            );
            let response = Client::new()
                .get(url)
                .header("Content-Type", "application/json")
                .send()
                .await
                .unwrap_or_else(|_| panic!("请求{}微信用户信息失败", self.appid));
            response
                .json::<ResMiniUserInfo>()
                .await
                .expect("解析用户信息失败")
        }
    }
    #[derive(PartialEq, Serialize, Deserialize, Debug, Clone)]
    pub struct AccessToken {
        pub access_token: String,
    }
    impl AccessToken {
        pub async fn get_phone_number(&self, e: GetPhoneNumber) -> PhoneNumberResponse {
            let url = format!(
                "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={}",
                self.access_token
            );
            let response = Client::new()
                .post(url)
                .header("Content-Type", "application/json")
                .json(&e)
                .send()
                .await
                .expect("微信小程序获取手机号发起 WxMiniGetPhoneNumberResponse 请求失败");
            // 解析响应体为 PhoneNumberResponse 结构体
            response
                .json::<PhoneNumberResponse>()
                .await
                .expect("微信小程序获取手机号---解析响应体为 PhoneNumberResponse 结构体 --失败")
        }
        // 请求微信服务器获取小程序码的 Buffer 数据
        pub async fn get_qrcode_buffer(
            &self,
            e: WxMiniQrCodeData,
        ) -> Result<Vec<u8>, Box<dyn Error>> {
            let url = format!(
                "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={}",
                self.access_token
            );
            let response = Client::new().post(&url).json(&e).send().await?;
            // 检查 HTTP 状态码
            if !response.status().is_success() {
                return Err(format!("HTTP Error: {}", response.status()).into());
            };
            // 读取二进制响应内容
            let bytes = response.bytes().await?.to_vec();
            Ok(bytes)
        }
    }
}