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", ¶ms)
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", ¶ms)
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", ¶ms)
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", ¶ms)
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", ¶ms)
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", ¶ms)
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}