use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use crate::{core::request::Request, model::{Amount, Detail, SettleInfo, StoreInfo}, RPayResult};
use super::config::WechatV3PayConfig;
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
#[builder(pattern = "mutable")]
pub struct H5Pay {
#[serde(rename = "appid")]
#[builder(setter(into))]
pub app_id: String,
#[serde(rename = "mchid")]
#[builder(setter(into))]
pub mch_id: String,
#[builder(setter(into))]
pub description: String,
#[builder(setter(into))]
pub out_trade_no: String,
#[builder(default,setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub time_expire: Option<String>,
#[builder(default,setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub attach: Option<String>,
#[builder(setter(into))]
pub notify_url: String,
#[builder(default,setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub goods_tag: Option<String>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub support_fapiao: Option<bool>,
pub amount: Amount,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub detail: Option<Detail>,
#[builder(setter(into))]
pub scene_info: H5ReqSceneInfo,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub settle_info: Option<SettleInfo>,
}
impl H5Pay {
pub async fn pay(&mut self, wechat_sdk: WechatV3PayConfig) -> RPayResult<H5Response> {
self.app_id = wechat_sdk.app_id.clone();
self.mch_id = wechat_sdk.mch_id.clone();
self.notify_url = wechat_sdk.notify_url.clone().unwrap_or_default();
let json_body = serde_json::to_string(self).unwrap();
Request::build_pay_request::<H5Response>(wechat_sdk,crate::common::HttpMethod::POST, "/v3/pay/transactions/h5", json_body).await
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct H5ReqSceneInfo {
pub payer_client_ip: String,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub device_id: Option<String>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub store_info: Option<StoreInfo>,
pub h5_info: H5Info,
}
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct H5Info {
#[serde(rename = "type")]
pub h5_type: String,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub app_name: Option<String>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub app_url: Option<String>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub bundle_id: Option<String>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub package_name: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct H5Response {
pub code: Option<String>,
pub message: Option<String>,
pub h5_url: Option<String>,
}