#[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 请求失败");
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 请求失败");
response
.json::<PhoneNumberResponse>()
.await
.expect("微信小程序获取手机号---解析响应体为 PhoneNumberResponse 结构体 --失败")
}
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?;
if !response.status().is_success() {
return Err(format!("HTTP Error: {}", response.status()).into());
};
let bytes = response.bytes().await?.to_vec();
Ok(bytes)
}
}
}