ztk_rust_sdk/jd/
api.rs

1//! 京东平台 API 实现
2//!
3//! 提供京东平台相关的 API 调用功能,包括:
4//! - 商品转链
5//! - 京粉精选商品
6//! - 订单查询
7//! - 商品详情
8//! - 朋友圈火爆商品
9
10use crate::client::ZtkClient;
11use crate::common::http::{build_params_with_appkey, url_encode};
12use crate::error::ZtkResult;
13
14use super::request::{
15    JdConvertRequest, JdGoodsDetailRequest, JdHotGoodsRequest, JdOrderQueryRequest,
16    JingfenGoodsRequest,
17};
18use super::response::{
19    JdConvertResponse, JdGoodsDetailResponse, JdHotGoodsResponse, JdOrderResponse,
20    JingfenGoodsResponse,
21};
22
23/// 京东平台 API
24///
25/// 提供京东平台相关的 API 调用方法
26///
27/// # Example
28///
29/// ```rust,ignore
30/// use ztk_rust_sdk::ZtkClient;
31/// use ztk_rust_sdk::jd::{JdConvertRequest, JdChainType};
32///
33/// #[tokio::main]
34/// async fn main() -> ztk_rust_sdk::ZtkResult<()> {
35///     let client = ZtkClient::new("your_appkey").build()?;
36///     
37///     let request = JdConvertRequest::new("https://item.jd.com/123456.html", "your_union_id")
38///         .chain_type(JdChainType::Short);
39///     
40///     let result = client.jd().convert(request).await?;
41///     println!("转链结果: {:?}", result);
42///     
43///     Ok(())
44/// }
45/// ```
46pub struct JdApi<'a> {
47    /// 客户端引用
48    client: &'a ZtkClient,
49}
50
51impl<'a> JdApi<'a> {
52    /// 创建京东 API 实例
53    ///
54    /// # Arguments
55    ///
56    /// * `client` - ZtkClient 引用
57    pub fn new(client: &'a ZtkClient) -> Self {
58        Self { client }
59    }
60
61    /// 获取客户端引用
62    #[allow(dead_code)]
63    pub(crate) fn client(&self) -> &ZtkClient {
64        self.client
65    }
66
67    /// 京东转链
68    ///
69    /// 将商品链接或 SKU ID 转换为推广链接
70    ///
71    /// # Arguments
72    ///
73    /// * `request` - 转链请求参数
74    ///
75    /// # Returns
76    ///
77    /// 返回转链结果,包含推广链接
78    ///
79    /// # Example
80    ///
81    /// ```rust,ignore
82    /// let request = JdConvertRequest::new("https://item.jd.com/123456.html", "your_union_id")
83    ///     .position_id("12345")
84    ///     .chain_type(JdChainType::Short);
85    /// let result = client.jd().convert(request).await?;
86    /// ```
87    pub async fn convert(&self, request: JdConvertRequest) -> ZtkResult<JdConvertResponse> {
88        // 对 material_id 进行 URL 编码
89        let mut encoded_request = request.clone();
90        encoded_request.material_id = url_encode(&request.material_id);
91
92        // 如果有 coupon_url,也需要编码
93        if let Some(ref coupon_url) = request.coupon_url {
94            encoded_request.coupon_url = Some(url_encode(coupon_url));
95        }
96
97        let params = build_params_with_appkey(self.client.appkey(), &encoded_request)?;
98        self.client
99            .http_client()
100            .get(
101                "/api/open_jing_union_open_promotion_byunionid_get.ashx",
102                &params,
103            )
104            .await
105    }
106
107    /// 京粉精选商品
108    ///
109    /// 获取京粉精选商品列表
110    ///
111    /// # Arguments
112    ///
113    /// * `request` - 京粉精选商品请求参数
114    ///
115    /// # Returns
116    ///
117    /// 返回京粉精选商品列表
118    ///
119    /// # Example
120    ///
121    /// ```rust,ignore
122    /// let request = JingfenGoodsRequest::new(JdEliteId::HotSale)
123    ///     .page_index(1)
124    ///     .page_size(20);
125    /// let result = client.jd().jingfen_goods(request).await?;
126    /// ```
127    pub async fn jingfen_goods(
128        &self,
129        request: JingfenGoodsRequest,
130    ) -> ZtkResult<JingfenGoodsResponse> {
131        let params = build_params_with_appkey(self.client.appkey(), &request)?;
132        self.client
133            .http_client()
134            .get(
135                "/api/open_jing_union_open_goods_jingfen_query.ashx",
136                &params,
137            )
138            .await
139    }
140
141    /// 订单查询
142    ///
143    /// 查询京东联盟订单
144    ///
145    /// # Arguments
146    ///
147    /// * `request` - 订单查询请求参数
148    ///
149    /// # Returns
150    ///
151    /// 返回订单列表数据
152    ///
153    /// # Example
154    ///
155    /// ```rust,ignore
156    /// let request = JdOrderQueryRequest::new("2024-01-01 00:00:00")
157    ///     .end_time("2024-01-31 23:59:59")
158    ///     .query_type(JdOrderQueryType::OrderTime)
159    ///     .page_no(1);
160    /// let result = client.jd().query_orders(request).await?;
161    /// ```
162    pub async fn query_orders(&self, request: JdOrderQueryRequest) -> ZtkResult<JdOrderResponse> {
163        let params = build_params_with_appkey(self.client.appkey(), &request)?;
164        self.client
165            .http_client()
166            .get("/api/open_jing_union_open_order_query.ashx", &params)
167            .await
168    }
169
170    /// 商品详情
171    ///
172    /// 获取京东商品详情信息
173    ///
174    /// # Arguments
175    ///
176    /// * `request` - 商品详情请求参数
177    ///
178    /// # Returns
179    ///
180    /// 返回商品详情信息
181    ///
182    /// # Example
183    ///
184    /// ```rust,ignore
185    /// let request = JdGoodsDetailRequest::new("10025768652616");
186    /// let result = client.jd().goods_detail(request).await?;
187    /// ```
188    pub async fn goods_detail(
189        &self,
190        request: JdGoodsDetailRequest,
191    ) -> ZtkResult<JdGoodsDetailResponse> {
192        let params = build_params_with_appkey(self.client.appkey(), &request)?;
193        self.client
194            .http_client()
195            .get("/api/open_jing_union_open_goods_query.ashx", &params)
196            .await
197    }
198
199    /// 朋友圈火爆商品
200    ///
201    /// 获取京东朋友圈火爆商品列表,包含精编社群推广文案
202    ///
203    /// # Arguments
204    ///
205    /// * `request` - 朋友圈火爆商品请求参数
206    ///
207    /// # Returns
208    ///
209    /// 返回朋友圈火爆商品列表
210    ///
211    /// # Example
212    ///
213    /// ```rust,ignore
214    /// let request = JdHotGoodsRequest::new()
215    ///     .page_index(1)
216    ///     .page_size(20)
217    ///     .keyword("手机");
218    /// let result = client.jd().hot_goods(request).await?;
219    /// ```
220    pub async fn hot_goods(&self, request: JdHotGoodsRequest) -> ZtkResult<JdHotGoodsResponse> {
221        let params = build_params_with_appkey(self.client.appkey(), &request)?;
222        self.client
223            .http_client()
224            .get("/api/open_jing_goods_list.ashx", &params)
225            .await
226    }
227}
228
229#[cfg(test)]
230mod tests {
231    use super::*;
232
233    #[test]
234    fn test_jd_api_creation() {
235        let client = ZtkClient::new("test_appkey").build().unwrap();
236        let jd = client.jd();
237        assert_eq!(jd.client().appkey(), "test_appkey");
238    }
239}