use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use crate::{
core::{
common::{GrantType, LoginType},
request::RequestBuilder,
},
RPayResult,
};
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
#[builder(pattern = "mutable")]
pub struct Auth {
#[serde(rename = "appid")]
#[builder(setter(into))]
pub app_id: String,
#[serde(rename = "secret")]
#[builder(setter(into))]
pub secret: String,
#[serde(rename = "wx_code")]
#[builder(setter(into))]
pub wx_code: String,
#[serde(rename = "wx_code")]
#[builder(setter(into))]
pub grant_type: GrantType,
#[serde(rename = "wx_code")]
#[builder(setter(into))]
pub login_type: LoginType,
}
impl Auth {
pub async fn web_login(&self) -> RPayResult<WebLoginResponse> {
let url = format!("https://api.weixin.qq.com/sns/oauth2/access_token?appid={}&secret={}&code={}&grant_type=authorization_code", self.app_id,self.secret, self.wx_code);
let resp = RequestBuilder::default()
.url(url)
.build()?
.send::<WebLoginResponse>()
.await?;
Ok(resp)
}
pub async fn web_refresh_token(&self,refresh_token: &str) -> RPayResult<WebRefreshTokenResponse> {
let url = format!("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={}&grant_type=refresh_token&refresh_token={}", self.app_id,refresh_token);
let resp = RequestBuilder::default()
.url(url)
.build()?
.send::<WebRefreshTokenResponse>()
.await?;
Ok(resp)
}
pub async fn web_sn_sapi_user_info(&self,access_token: String, openid: &str) -> RPayResult<WeLoginUserResponse> {
let url = format!("https://api.weixin.qq.com/sns/userinfo?access_token={}&openid={}&lang=zh_CN", access_token, openid);
let resp = RequestBuilder::default()
.url(url)
.build()?
.send::<WeLoginUserResponse>()
.await?;
Ok(resp)
}
pub async fn mini_program_login(&self) -> RPayResult<MiniProgramResponse> {
let url = format!("https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code", self.app_id,self.secret, self.wx_code);
let resp = RequestBuilder::default()
.url(url)
.build()?
.send::<MiniProgramResponse>()
.await?;
Ok(resp)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct WeLoginUserResponse {
pub openid: Option<String>,
pub nickname: Option<String>,
pub sex: Option<i64>,
pub province: Option<String>,
pub city: Option<String>,
pub country: Option<String>,
pub headimgurl: Option<String>,
pub privilege: Option<Vec<String>>,
pub unionid: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct WebRefreshTokenResponse {
pub access_token: String,
pub expires_in: i64,
pub refresh_token: String,
pub openid: String,
pub scope: String,
pub errcode: Option<i32>,
pub errmsg: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct WebLoginResponse {
pub access_token: Option<String>,
pub expires_in: Option<i64>,
pub refresh_token: Option<String>,
pub openid: Option<String>,
pub scope: Option<String>,
pub is_snapshotuser: Option<i64>,
pub unionid: Option<String>,
pub errcode: Option<i32>,
pub errmsg: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct MiniProgramResponse {
pub session_key: Option<String>,
pub unionid: Option<String>,
pub errmsg: Option<String>,
pub openid: Option<String>,
pub errcode: Option<i32>,
}