🆕 #3850 【视频号】小店 SDK 添加类目权限管理接口和商品 SPU 信息扩展(by cchengg)

This commit is contained in:
Binary Wang
2026-01-14 13:56:50 +08:00
committed by Binary Wang
parent 5947f24805
commit 3b5ead664c
13 changed files with 212 additions and 18 deletions

View File

@@ -6,11 +6,7 @@ import me.chanjar.weixin.channel.bean.audit.AuditApplyResponse;
import me.chanjar.weixin.channel.bean.audit.AuditResponse;
import me.chanjar.weixin.channel.bean.audit.CategoryAuditInfo;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
import me.chanjar.weixin.channel.bean.category.CategoryDetailResult;
import me.chanjar.weixin.channel.bean.category.CategoryQualificationResponse;
import me.chanjar.weixin.channel.bean.category.PassCategoryResponse;
import me.chanjar.weixin.channel.bean.category.ShopCategory;
import me.chanjar.weixin.channel.bean.category.ShopCategoryResponse;
import me.chanjar.weixin.channel.bean.category.*;
import me.chanjar.weixin.common.error.WxErrorException;
/**
@@ -121,4 +117,16 @@ public interface WxChannelCategoryService {
* @throws WxErrorException 异常
*/
PassCategoryResponse listPassCategory() throws WxErrorException;
/**
* 获取店铺的类目权限列表
*
* @param isFilterStatus 是否按状态筛选
* @param status 类目状态(当 isFilterStatus 为 true 时有效)
* @return 类目权限列表
*
* @throws WxErrorException 异常
*/
RelationCategoryResponse listRelationCategory(Boolean isFilterStatus, Integer status) throws WxErrorException;
}

View File

@@ -1,13 +1,5 @@
package me.chanjar.weixin.channel.api.impl;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.ADD_CATEGORY_URL;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.AVAILABLE_CATEGORY_URL;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.CANCEL_CATEGORY_AUDIT_URL;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.GET_CATEGORY_AUDIT_URL;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.GET_CATEGORY_DETAIL_URL;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.LIST_ALL_CATEGORY_URL;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.LIST_PASS_CATEGORY_URL;
import java.util.Collections;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
@@ -17,17 +9,15 @@ import me.chanjar.weixin.channel.bean.audit.AuditResponse;
import me.chanjar.weixin.channel.bean.audit.CategoryAuditInfo;
import me.chanjar.weixin.channel.bean.audit.CategoryAuditRequest;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
import me.chanjar.weixin.channel.bean.category.CategoryDetailResult;
import me.chanjar.weixin.channel.bean.category.CategoryQualificationResponse;
import me.chanjar.weixin.channel.bean.category.PassCategoryResponse;
import me.chanjar.weixin.channel.bean.category.ShopCategory;
import me.chanjar.weixin.channel.bean.category.ShopCategoryResponse;
import me.chanjar.weixin.channel.bean.category.*;
import me.chanjar.weixin.channel.util.JsonUtils;
import me.chanjar.weixin.channel.util.ResponseUtils;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Category.*;
/**
* 视频号小店 商品类目相关接口
*
@@ -135,4 +125,15 @@ public class WxChannelCategoryServiceImpl implements WxChannelCategoryService {
return ResponseUtils.decode(resJson, PassCategoryResponse.class);
}
@Override
public RelationCategoryResponse listRelationCategory(Boolean isFilterStatus, Integer status) throws WxErrorException {
RelationCategoryRequest request = new RelationCategoryRequest(
isFilterStatus != null ? isFilterStatus : false,
status != null ? status : 0
);
String reqJson = JsonUtils.encode(request);
String resJson = shopService.post(LIST_RELATION_CATEGORY_URL, reqJson);
return ResponseUtils.decode(resJson, RelationCategoryResponse.class);
}
}

View File

@@ -22,6 +22,9 @@ public class CategoryDetailResult extends WxChannelBaseResponse {
@JsonProperty("attr")
private Attr attr;
@JsonProperty("product_qua_list")
private List<QualificationInfo> productQuaList;
@Data
@NoArgsConstructor

View File

@@ -0,0 +1,41 @@
package me.chanjar.weixin.channel.bean.category;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 店铺类目权限列表项
*
* @author <a href="https://gitee.com/cchengg">chucheng</a>
*/
@Data
@NoArgsConstructor
public class RelationCategoryItem implements Serializable {
/** 类目id */
@JsonProperty("id")
private Long id;
/** 类目状态, 1生效中2已失效 */
@JsonProperty("status")
private Integer status;
/** 失效原因 */
@JsonProperty("uneffective_reason")
private String uneffectiveReason;
/** 生效时间 */
@JsonProperty("effective_time")
private Long effectiveTime;
/** 失效时间 */
@JsonProperty("uneffective_time")
private Long uneffectiveTime;
/** 类目资质id */
@JsonProperty("qua_id")
private Long quaId;
}

View File

@@ -0,0 +1,28 @@
package me.chanjar.weixin.channel.bean.category;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 类目权限列表请求参数
*
* @author <a href="https://github.com/lixize">Zeyes</a>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RelationCategoryRequest implements Serializable {
private static final long serialVersionUID = -8765432109876543210L;
/** 是否按状态筛选 */
@JsonProperty("is_filter_status")
private Boolean isFilterStatus;
/** 类目状态(当 isFilterStatus 为 true 时有效) */
@JsonProperty("status")
private Integer status;
}

View File

@@ -0,0 +1,25 @@
package me.chanjar.weixin.channel.bean.category;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse;
/**
* 店铺的类目权限列表响应
*
* @author <a href="https://gitee.com/cchengg">chucheng</a>
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RelationCategoryResponse extends WxChannelBaseResponse {
private static final long serialVersionUID = -8473920857463918245L;
@JsonProperty("list")
private List<RelationCategoryItem> list;
}

View File

@@ -35,6 +35,14 @@ public class SkuFastInfo implements Serializable {
@JsonProperty("is_delete")
private Boolean delete;
/** 商品sku编码 */
@JsonProperty("sku_code")
private String skuCode;
/** 更新sku状态 0-默认值5-上架11-下架 */
@JsonProperty("status")
private Integer status;
@Data
@NoArgsConstructor

View File

@@ -56,6 +56,10 @@ public class SkuInfo implements Serializable {
@JsonProperty("sku_id")
private String skuId;
/** sku条形码 */
@JsonProperty("bar_code")
private String barCode;
public SkuInfo() {
}

View File

@@ -25,4 +25,28 @@ public class SpuFastInfo implements Serializable {
@JsonProperty("skus")
protected List<SkuFastInfo> skus;
/** 商品编码 */
@JsonProperty("spu_code")
protected String spuCode;
/** 限购信息 */
@JsonProperty("limit_info")
protected LimitInfo limitInfo;
/** 运费信息 */
@JsonProperty("express_info")
protected ExpressInfo expressInfo;
/** 额外服务 */
@JsonProperty("extra_service")
protected ExtraServiceInfo extraService;
/** 发货方式0-快递发货1-无需快递手机号发货3-无需快递可选发货账号类型默认为0若为无需快递则无需填写运费模版id */
@JsonProperty("deliver_method")
private Integer deliverMethod;
/** 商品待开售信息 */
@JsonProperty("timing_onsale_info")
private TimingOnSaleInfo timingOnSaleInfo;
}

View File

@@ -151,4 +151,8 @@ public class SpuInfo extends SpuSimpleInfo {
/** 发布模式0: 普通模式1: 极简模式 */
@JsonProperty("release_mode")
private Integer releaseMode;
/** 商品待开售信息 */
@JsonProperty("timing_onsale_info")
private TimingOnSaleInfo timingOnSaleInfo;
}

View File

@@ -0,0 +1,36 @@
package me.chanjar.weixin.channel.bean.product;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 商品待开售信息
*
* @author <a href="https://gitee.com/cchengg">chu</a>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TimingOnSaleInfo implements Serializable {
/** 状态枚举 0-没有待开售1-待开售 */
@JsonProperty("status")
private Integer status;
/** 开售时间秒级时间戳0为未配置时间 */
@JsonProperty("onsale_time")
private Long onSaleTime;
/** 是否隐藏价格 0-不隐藏1-隐藏 */
@JsonProperty("is_hide_price")
private Integer isHidePrice;
/** 待开售任务ID可用于请求立即开售 */
@JsonProperty("task_id")
private Integer taskId;
}

View File

@@ -53,6 +53,8 @@ public class WxChannelApiUrlConstants {
String CANCEL_CATEGORY_AUDIT_URL = "https://api.weixin.qq.com/channels/ec/category/audit/cancel";
/** 获取账号申请通过的类目和资质信息 */
String LIST_PASS_CATEGORY_URL = "https://api.weixin.qq.com/channels/ec/category/list/get";
/** 获取店铺的类目权限列表 */
String LIST_RELATION_CATEGORY_URL = "https://api.weixin.qq.com/shop/ec/category/get_category_relation_list";
}
/** 主页管理相关接口 */

View File

@@ -158,4 +158,14 @@ public class WxChannelCategoryServiceImplTest {
assertTrue(response.isSuccess());
System.out.println(response);
}
@Test
public void testListRelationCategory() throws WxErrorException {
WxChannelCategoryService categoryService = channelService.getCategoryService();
me.chanjar.weixin.channel.bean.category.RelationCategoryResponse response =
categoryService.listRelationCategory(true, 1);
assertNotNull(response);
assertTrue(response.isSuccess());
System.out.println(response);
}
}