use crate::{access_token::AccessTokenProvider, error::CommonResponse};
use crate::{wechat::WxApiRequestBuilder, SdkResult, WxSdk};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
pub mod ad;
pub mod cloudbase;
pub mod content_security;
pub mod customer_message;
pub mod datacube;
pub mod img;
pub mod immediate_delivery;
pub mod internet;
pub mod live_broadcast;
pub mod logistics;
pub mod nearby_poi;
pub mod ocr;
pub mod operation;
pub mod phone_number;
pub mod plugin_manage;
pub mod qrcode;
pub mod redpacket_cover;
pub mod risk_control;
pub mod search;
pub mod service_market;
pub mod short_link;
pub mod soter;
pub mod subscribe_message;
pub mod uniform_message;
pub mod updatable_message;
pub mod url_link;
pub mod url_scheme;
#[derive(Debug, Serialize, Deserialize)]
pub struct DateRange {
pub begin_date: String,
pub end_date: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct TimestampRange {
pub begin_timestamp: String,
pub end_timestamp: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ListRes<T> {
pub list: Vec<T>,
}
pub struct Part {
pub name: String,
pub filename: String,
pub content_type: String,
pub data: Vec<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct LoginResult {
pub openid: String,
#[serde(skip_serializing)]
pub session_key: String,
pub unionid: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CheckEncryptedResult {
pub vaild: bool,
pub create_time: i64,
}
#[derive(Debug, Serialize)]
pub struct QueryPaidUnionId {
pub openid: String,
#[serde(default)]
pub transaction_id: Option<String>,
#[serde(default)]
pub mch_id: Option<String>,
#[serde(default)]
pub out_trade_no: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UnionId {
pub unionid: String,
}
async fn get_send<'a, A: WxApiRequestBuilder, R: DeserializeOwned, P: Serialize>(
api_builder: &'a A,
url: &'static str,
param: &'a P,
) -> SdkResult<R> {
let builder = api_builder.wx_get(url).await?.query(param);
let res = builder.send().await?.json::<R>().await?;
Ok(res)
}
async fn post_send<'a, A: WxApiRequestBuilder, R: DeserializeOwned, D: Serialize>(
api_builder: &'a A,
url: &'static str,
post_data: &'a D,
) -> SdkResult<R> {
let builder = api_builder.wx_post(url).await?.json(post_data);
let res = builder.send().await?.json::<CommonResponse<R>>().await?;
res.into()
}
#[derive(Clone)]
pub struct WxaSdk<T: AccessTokenProvider> {
pub(crate) sdk: crate::WxSdk<T>,
}
impl<T: AccessTokenProvider> WxaSdk<T> {
pub async fn code_to_session(&self, js_code: &str) -> SdkResult<LoginResult> {
let url = "https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code";
let query = &serde_json::json!({
"js_code": js_code,
"appid": &self.sdk.app_id,
"secret": &self.sdk.app_secret,
});
get_send(&self.sdk, url, query).await
}
pub async fn check_encrypted_data(
&self,
encrypted_msg_hash: &str,
) -> SdkResult<CheckEncryptedResult> {
let url = "https://api.weixin.qq.com/wxa/business/checkencryptedmsg";
let post_data = &serde_json::json!({ "encrypted_msg_hash": encrypted_msg_hash });
post_send(&self.sdk, url, post_data).await
}
pub async fn get_paid_unionid(&self, query: &QueryPaidUnionId) -> SdkResult<UnionId> {
let url = "https://api.weixin.qq.com/wxa/getpaidunionid";
post_send(&self.sdk, url, &query).await
}
pub fn datacube(&self) -> datacube::DataCubeModule<WxSdk<T>> {
datacube::DataCubeModule(&self.sdk)
}
pub fn customer_message(&self) -> customer_message::CustomerMessageModule<WxSdk<T>> {
customer_message::CustomerMessageModule(&self.sdk)
}
pub fn uniform_message(&self) -> uniform_message::UniformMessageModule<WxSdk<T>> {
uniform_message::UniformMessageModule(&self.sdk)
}
pub fn updatable_message(&self) -> updatable_message::UpdatableMessageModule<WxSdk<T>> {
updatable_message::UpdatableMessageModule(&self.sdk)
}
pub fn plugin_mangage(&self) -> plugin_manage::PluginManageModule<WxSdk<T>> {
plugin_manage::PluginManageModule(&self.sdk)
}
pub fn nearby_poi(&self) -> nearby_poi::NearbyPoiModule<WxSdk<T>> {
nearby_poi::NearbyPoiModule(&self.sdk)
}
pub fn qrcode(&self) -> qrcode::QrcodeModule<WxSdk<T>> {
qrcode::QrcodeModule(&self.sdk)
}
pub fn url_scheme(&self) -> url_scheme::UrlSchemeModule<WxSdk<T>> {
url_scheme::UrlSchemeModule(&self.sdk)
}
pub fn url_link(&self) -> url_link::UrlLinkModule<WxSdk<T>> {
url_link::UrlLinkModule(&self.sdk)
}
pub fn content_security(&self) -> content_security::ContentSecurityModule<WxSdk<T>> {
content_security::ContentSecurityModule(&self.sdk)
}
pub fn redpacket_cover(&self) -> redpacket_cover::RedpacketCoverModule<WxSdk<T>> {
redpacket_cover::RedpacketCoverModule(&self.sdk)
}
pub fn cloudbase(&self) -> cloudbase::CloudbaseModule<WxSdk<T>> {
cloudbase::CloudbaseModule(&self.sdk)
}
pub fn img(&self) -> img::ImgModule<WxSdk<T>> {
img::ImgModule(&self.sdk)
}
pub fn immediate_delivery(&self) -> immediate_delivery::ImmediateDeliveryModule<WxSdk<T>> {
immediate_delivery::ImmediateDeliveryModule(&self.sdk)
}
pub fn internet(&self) -> internet::InternetModule<WxSdk<T>> {
internet::InternetModule(&self.sdk)
}
pub fn live_broadcast(&self) -> live_broadcast::LiveBroadcastModule<WxSdk<T>> {
live_broadcast::LiveBroadcastModule(&self.sdk)
}
pub fn logistics(&self) -> logistics::LogisticsModule<WxSdk<T>> {
logistics::LogisticsModule(&self.sdk)
}
pub fn ocr(&self) -> ocr::OcrModule<WxSdk<T>> {
ocr::OcrModule(&self.sdk)
}
pub fn operation(&self) -> operation::OperationModule<WxSdk<T>> {
operation::OperationModule(&self.sdk)
}
pub fn phone_number(&self) -> phone_number::PhoneNumberModule<WxSdk<T>> {
phone_number::PhoneNumberModule(&self.sdk)
}
pub fn risk_control(&self) -> risk_control::RiskControlModule<WxSdk<T>> {
risk_control::RiskControlModule(&self.sdk)
}
pub fn search(&self) -> search::SearchModule<WxSdk<T>> {
search::SearchModule(&self.sdk)
}
pub fn service_market(&self) -> service_market::ServiceMarketModule<WxSdk<T>> {
service_market::ServiceMarketModule(&self.sdk)
}
pub fn short_link(&self) -> short_link::ShortLinkModule<WxSdk<T>> {
short_link::ShortLinkModule(&self.sdk)
}
pub fn soter(&self) -> soter::SoterModule<WxSdk<T>> {
soter::SoterModule(&self.sdk)
}
pub fn subscribe_message(&self) -> subscribe_message::SubscribeMessageModule<WxSdk<T>> {
subscribe_message::SubscribeMessageModule(&self.sdk)
}
}