use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use crate::{core::request::Request, model::{Amount, Detail, Payer, SceneInfo, SettleInfo, SignData}, RPayResult};
use super::config::WechatV3PayConfig;
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
#[builder(pattern = "mutable")]
pub struct NativePay {
#[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,
pub payer: Payer,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub detail: Option<Detail>,
#[builder(default,setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub scene_info: Option<SceneInfo>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub settle_info: Option<SettleInfo>,
}
impl NativePay {
pub async fn pay(&mut self, wechat_sdk: WechatV3PayConfig) -> RPayResult<NativeResponse> {
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::<NativeResponse>(wechat_sdk,crate::common::HttpMethod::POST, "/v3/pay/transactions/native", json_body).await
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct NativeResponse {
pub code: Option<String>,
pub message: Option<String>,
pub prepay_id: Option<String>,
pub sign_data: Option<SignData>,
}