ztk_rust_sdk/pdd/
api.rs

1//! 拼多多平台 API 实现
2//!
3//! 提供拼多多平台相关的 API 调用功能,包括:
4//! - 商品转链
5//! - 商品详情 (简版/详版)
6//! - 订单查询
7//! - 授权备案
8
9use crate::client::ZtkClient;
10use crate::common::http::build_params_with_appkey;
11use crate::error::ZtkResult;
12
13use super::request::{
14    PddAuthorizeQueryRequest, PddAuthorizeRequest, PddConvertRequest, PddGoodsDetailFullRequest,
15    PddGoodsDetailSimpleRequest, PddOrderQueryRequest,
16};
17use super::response::{
18    PddAuthorizeQueryResponse, PddAuthorizeResponse, PddConvertResponse,
19    PddGoodsDetailFullResponse, PddGoodsDetailSimpleResponse, PddOrderResponse,
20};
21
22/// 拼多多平台 API
23///
24/// 提供拼多多平台相关的 API 调用方法
25///
26/// # Example
27///
28/// ```rust,ignore
29/// use ztk_rust_sdk::ZtkClient;
30/// use ztk_rust_sdk::pdd::PddConvertRequest;
31///
32/// #[tokio::main]
33/// async fn main() -> ztk_rust_sdk::ZtkResult<()> {
34///     let client = ZtkClient::new("your_appkey").build()?;
35///     
36///     let request = PddConvertRequest::new(
37///         "pdd_app_key",
38///         "pdd_app_secret",
39///         "pid",
40///         "453581732819"
41///     );
42///     
43///     let result = client.pdd().convert(request).await?;
44///     println!("转链结果: {:?}", result);
45///     
46///     Ok(())
47/// }
48/// ```
49pub struct PddApi<'a> {
50    /// 客户端引用
51    client: &'a ZtkClient,
52}
53
54impl<'a> PddApi<'a> {
55    /// 创建拼多多 API 实例
56    ///
57    /// # Arguments
58    ///
59    /// * `client` - ZtkClient 引用
60    pub fn new(client: &'a ZtkClient) -> Self {
61        Self { client }
62    }
63
64    /// 获取客户端引用
65    #[allow(dead_code)]
66    pub(crate) fn client(&self) -> &ZtkClient {
67        self.client
68    }
69
70    /// 拼多多转链
71    ///
72    /// 将商品 ID 或推广短链转换为推广链接
73    ///
74    /// # Arguments
75    ///
76    /// * `request` - 转链请求参数
77    ///
78    /// # Returns
79    ///
80    /// 返回转链结果,包含多种推广链接
81    ///
82    /// # Example
83    ///
84    /// ```rust,ignore
85    /// let request = PddConvertRequest::new("pdd_app_key", "pdd_app_secret", "pid", "453581732819")
86    ///     .custom_parameters(r#"{"uid":"user123"}"#);
87    /// let result = client.pdd().convert(request).await?;
88    /// ```
89    pub async fn convert(&self, request: PddConvertRequest) -> ZtkResult<PddConvertResponse> {
90        let params = build_params_with_appkey(self.client.appkey(), &request)?;
91        self.client
92            .http_client()
93            .get("/api/open_pdd_zhuanlian_new.ashx", &params)
94            .await
95    }
96
97    /// 商品详情 (简版)
98    ///
99    /// 获取拼多多商品的基本详情信息
100    ///
101    /// # Arguments
102    ///
103    /// * `request` - 商品详情请求参数
104    ///
105    /// # Returns
106    ///
107    /// 返回商品基本信息
108    ///
109    /// # Example
110    ///
111    /// ```rust,ignore
112    /// let request = PddGoodsDetailSimpleRequest::new("pdd_app_key", "pdd_app_secret", "pid", "453581732819");
113    /// let result = client.pdd().goods_detail_simple(request).await?;
114    /// ```
115    pub async fn goods_detail_simple(
116        &self,
117        request: PddGoodsDetailSimpleRequest,
118    ) -> ZtkResult<PddGoodsDetailSimpleResponse> {
119        let params = build_params_with_appkey(self.client.appkey(), &request)?;
120        self.client
121            .http_client()
122            .get("/api/open_pdd_goods_detail_get_new.ashx", &params)
123            .await
124    }
125
126    /// 商品详情 (详版)
127    ///
128    /// 获取拼多多商品的详细信息,支持多种筛选条件
129    ///
130    /// # Arguments
131    ///
132    /// * `request` - 商品详情请求参数
133    ///
134    /// # Returns
135    ///
136    /// 返回商品详细信息
137    ///
138    /// # Example
139    ///
140    /// ```rust,ignore
141    /// let request = PddGoodsDetailFullRequest::new("pdd_app_key", "pdd_app_secret", "pid", "453581732819")
142    ///     .sort_type(2)
143    ///     .with_coupon(true);
144    /// let result = client.pdd().goods_detail_full(request).await?;
145    /// ```
146    pub async fn goods_detail_full(
147        &self,
148        request: PddGoodsDetailFullRequest,
149    ) -> ZtkResult<PddGoodsDetailFullResponse> {
150        let params = build_params_with_appkey(self.client.appkey(), &request)?;
151        self.client
152            .http_client()
153            .get("/api/open_pdd_goods_detail_search_new.ashx", &params)
154            .await
155    }
156
157    /// 订单查询
158    ///
159    /// 查询拼多多推广订单
160    ///
161    /// # Arguments
162    ///
163    /// * `request` - 订单查询请求参数
164    ///
165    /// # Returns
166    ///
167    /// 返回订单列表数据
168    ///
169    /// # Example
170    ///
171    /// ```rust,ignore
172    /// let request = PddOrderQueryRequest::new("pdd_app_key", "pdd_app_secret", 1699200000, 1699286400)
173    ///     .page(1)
174    ///     .page_size(50);
175    /// let result = client.pdd().query_orders(request).await?;
176    /// ```
177    pub async fn query_orders(&self, request: PddOrderQueryRequest) -> ZtkResult<PddOrderResponse> {
178        let params = build_params_with_appkey(self.client.appkey(), &request)?;
179        self.client
180            .http_client()
181            .get("/api/open_pdd_dingdan_new.ashx", &params)
182            .await
183    }
184
185    /// 授权备案
186    ///
187    /// 获取授权备案 URL,用于在服务器上进行 PID 授权备案
188    ///
189    /// # Arguments
190    ///
191    /// * `request` - 授权备案请求参数
192    ///
193    /// # Returns
194    ///
195    /// 返回授权备案 URL
196    ///
197    /// # Example
198    ///
199    /// ```rust,ignore
200    /// let request = PddAuthorizeRequest::new("pdd_app_key", "pdd_app_secret", "pid");
201    /// let result = client.pdd().authorize(request).await?;
202    /// // 使用返回的 URL 在服务器浏览器中打开进行授权备案
203    /// ```
204    pub async fn authorize(&self, request: PddAuthorizeRequest) -> ZtkResult<PddAuthorizeResponse> {
205        let params = build_params_with_appkey(self.client.appkey(), &request)?;
206        self.client
207            .http_client()
208            .get("/api/open_pdd_shouquan_new.ashx", &params)
209            .await
210    }
211
212    /// 授权备案查询
213    ///
214    /// 查询 PID 授权备案状态
215    ///
216    /// # Arguments
217    ///
218    /// * `request` - 授权备案查询请求参数
219    ///
220    /// # Returns
221    ///
222    /// 返回授权备案状态
223    ///
224    /// # Example
225    ///
226    /// ```rust,ignore
227    /// let request = PddAuthorizeQueryRequest::new("pdd_app_key", "pdd_app_secret", "pid");
228    /// let result = client.pdd().authorize_query(request).await?;
229    /// if result.response.map(|r| r.bind == Some(1)).unwrap_or(false) {
230    ///     println!("授权备案成功");
231    /// }
232    /// ```
233    pub async fn authorize_query(
234        &self,
235        request: PddAuthorizeQueryRequest,
236    ) -> ZtkResult<PddAuthorizeQueryResponse> {
237        let params = build_params_with_appkey(self.client.appkey(), &request)?;
238        self.client
239            .http_client()
240            .get("/api/open_pdd_shouquan_query_new.ashx", &params)
241            .await
242    }
243}
244
245#[cfg(test)]
246mod tests {
247    use super::*;
248
249    #[test]
250    fn test_pdd_api_creation() {
251        let client = ZtkClient::new("test_appkey").build().unwrap();
252        let pdd = client.pdd();
253        assert_eq!(pdd.client().appkey(), "test_appkey");
254    }
255}