唯品会作为国内头部折扣电商,其品牌类目筛选接口是连接"品牌资源-类目体系-折扣促销"的核心枢纽,支撑选品分析、品牌监控、促销引流等关键业务场景。当前全网技术贴多停留在"基础参数调用+简单分页"层面,既忽视唯品会"品牌类目强绑定、折扣维度为核心、权限与风控严苛"的独有特性,也未解决生产环境中联动筛选失真、动态促销字段解析不全、接口限流断服等高频问题。本文基于唯品会开放平台(VOP)规范与实战经验,构建"品牌-类目联动引擎+折扣场景适配模块+分级防风控架构"全流程方案,所有代码可直接落地企业级项目,兼顾合规性与差异化价值。
一、核心认知:唯品会品牌类目筛选接口的差异化特性
唯品会品牌类目筛选接口(核心方法:com.vip.adp.api.open.service.goods.getGoodsList)与淘宝、京东等综合电商的筛选接口差异显著,其设计逻辑深度绑定折扣电商场景,三大核心特性直接决定开发思路,照搬通用电商经验必踩坑:
-
品牌-类目强关联且分级:唯品会类目体系分为四级(一级:服饰鞋包;二级:女装;三级:连衣裙;四级:碎花连衣裙),品牌仅对授权类目开放筛选,无授权类目无法返回对应商品,且品牌存在等级划分(自营品牌、POP品牌),筛选权限不同。
-
折扣维度为核心筛选条件:区别于常规电商的"价格区间"筛选,唯品会接口支持"折扣力度(如2-3折)、促销类型(限时秒杀/满减)、会员专享价"等折扣专属维度,且动态促销字段实时更新,需专项解析。
-
权限与风控双重严苛:接口权限按"基础查询/增值筛选/敏感数据"分级,品牌详情、会员价等字段需额外申请权限;风控采用"按AppKey分级限流+签名时效校验+IP白名单"机制,超量调用直接触发429错误,无缓冲期。
-
数据动态性强且字段复杂:商品库存、折扣价格、促销标签随时间动态变化,部分字段(如发货时效、售后政策)与品牌类目强关联,解析不完整易导致业务决策失误。
核心提醒:唯品会开放平台仅对企业开发者开放接口权限,个人开发者无法申请核心筛选权限;本文方案全程基于官方开放接口开发,规避爬虫违规风险,数据用途严格遵循《唯品会开放平台服务条款》。
二、差异化方案实现:三大核心模块
方案基于唯品会开放平台V2版本接口构建,核心包含"品牌-类目联动筛选引擎""折扣场景精准适配模块""分级防风控架构",技术栈以Python为主,兼顾权限适配与高可用需求。
1. 品牌-类目联动筛选引擎:解决关联失真与权限适配
常规方案仅单独传入品牌ID或类目ID,易出现"品牌无对应类目商品""无权限获取品牌数据"等问题。本引擎实现"类目下品牌枚举+品牌授权类目校验+多级联动筛选",同时适配权限分级,确保筛选结果精准且合规:
import requests import json import hashlib import time from typing import Dict, List, Optional class VipBrandCategoryLinkEngine: """唯品会品牌-类目联动筛选引擎:授权校验+联动筛选+权限适配""" def __init__(self, app_key: str, app_secret: str, access_token: Optional[str] = None): self.app_key = app_key self.app_secret = app_secret self.access_token = access_token # 部分接口需OAuth2.0令牌 self.base_url = "https://api.vip.com/rest" # 类目等级映射(官方标准体系) self.category_level_map = {1: "一级类目", 2: "二级类目", 3: "三级类目", 4: "四级类目"} def _generate_sign(self, params: Dict) -> str: """生成唯品会规范签名:首尾拼接AppSecret+MD5加密,适配V2版本接口""" # 排除sign字段,按参数名ASCII升序排序 sorted_params = sorted([(k, v) for k, v in params.items() if k != "sign"], key=lambda x: x[0]) # 拼接签名串:AppSecret + key1value1key2value2 + AppSecret sign_str = self.app_secret for k, v in sorted_params: sign_str += f"{k}{v}" sign_str += self.app_secret # MD5加密后转大写 return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper() def get_brands_by_category(self, category_id: str, level: int = 2) -> List[Dict]: """ 按类目枚举品牌:获取指定类目下所有授权品牌,避免无对应商品的筛选 :param category_id: 类目ID(支持1-4级) :param level: 类目等级,用于校验类目合法性 :return: 标准化品牌列表(含品牌ID、名称、类型、授权状态) """ # 公共参数 params = { "app_key": self.app_key, "method": "com.vip.adp.api.open.service.brand.getBrandsByCategory", "timestamp": str(int(time.time() * 1000)), # 毫秒级时间戳(V2版本要求) "format": "json", "v": "2.0", "sign_method": "md5", "categoryId": category_id, "categoryLevel": level } # 需令牌的接口添加access_token if self.access_token: params["access_token"] = self.access_token # 生成签名 params["sign"] = self._generate_sign(params) try: response = requests.get(self.base_url, params=params, timeout=5) response.raise_for_status() result = response.json() if result.get("code") == 0: brands = result.get("data", {}).get("brands", []) # 标准化品牌数据,过滤无授权品牌 return [ { "brand_id": brand.get("brandId", ""), "brand_name": brand.get("brandName", ""), "brand_type": "自营" if brand.get("isSelfOperated") else "POP", "is_authorized": brand.get("isAuthorized", False), "category_ids": brand.get("authorizedCategoryIds", []) # 品牌授权的所有类目ID } for brand in brands if brand.get("isAuthorized") ] else: print(f"获取类目下品牌失败:{result.get('msg', '未知错误')}") return [] except Exception as e: print(f"请求异常:{str(e)}") return [] def brand_category_filter(self, category_id: str, brand_ids: List[str], biz_filters: Dict) -> Dict: """ 品牌-类目联动筛选:校验品牌授权类目,执行精准筛选 :param category_id: 目标类目ID :param brand_ids: 待筛选品牌ID列表 :param biz_filters: 业务筛选条件(价格、折扣、分页等) :return: 筛选后的商品列表及分页信息 """ # 第一步:校验品牌是否授权当前类目 authorized_brands = self.get_brands_by_category(category_id) authorized_brand_ids = [b["brand_id"] for b in authorized_brands] valid_brand_ids = [bid for bid in brand_ids if bid in authorized_brand_ids] if not valid_brand_ids: return {"code": 1001, "msg": "无授权品牌可筛选", "data": {}} # 第二步:构造筛选参数 biz_content = { "categoryId": category_id, "brandIds": valid_brand_ids, "page": biz_filters.get("page", 1), "pageSize": biz_filters.get("pageSize", 20), "priceRange": { "startPrice": biz_filters.get("start_price", 0), "endPrice": biz_filters.get("end_price", 99999) } } # 公共参数 params = { "app_key": self.app_key, "method": "com.vip.adp.api.open.service.goods.getGoodsList", "timestamp": str(int(time.time() * 1000)), "format": "json", "v": "2.0", "sign_method": "md5", "biz_content": json.dumps(biz_content, ensure_ascii=False) } if self.access_token: params["access_token"] = self.access_token params["sign"] = self._generate_sign(params) # 第三步:执行筛选请求 try: response = requests.get(self.base_url, params=params, timeout=5) response.raise_for_status() return response.json() except Exception as e: return {"code": 500, "msg": f"筛选请求异常:{str(e)}", "data": {}} # 示例:联动筛选执行 if __name__ == "__main__": # 替换为开放平台申请的密钥与令牌 ENGINE = VipBrandCategoryLinkEngine( app_key="YOUR_APP_KEY", app_secret="YOUR_APP_SECRET", access_token="YOUR_ACCESS_TOKEN" ) # 按二级类目(女装,ID:1001)枚举授权品牌 authorized_brands = ENGINE.get_brands_by_category(category_id="1001", level=2) print("类目下授权品牌:", authorized_brands) # 联动筛选:女装类目下指定品牌,价格100-500元,第1页(20条/页) biz_filters = {"start_price": 100, "end_price": 500, "page": 1, "pageSize": 20} filter_result = ENGINE.brand_category_filter( category_id="1001", brand_ids=[b["brand_id"] for b in authorized_brands[:2]], # 取前2个品牌 biz_filters=biz_filters ) print("联动筛选结果:", filter_result)
2. 折扣场景精准适配模块:解析动态促销字段
唯品会筛选接口的核心价值在于折扣场景,常规方案仅提取基础价格,遗漏折扣力度、促销标签等关键信息。本模块针对性解析折扣专属字段,实现"促销类型分类+折扣力度核算+会员价适配",直接对接选品决策场景:
from typing import Dict, List class VipDiscountAdapter: """唯品会折扣场景适配模块:解析动态促销字段,标准化折扣信息""" def __init__(self): # 促销类型映射(对接接口promotionType字段) self.promotion_type_map = { "SECKILL": "限时秒杀", "FULL_REDUCE": "满减活动", "MEMBER_EXCLUSIVE": "会员专享", "PACKAGE": "组合套餐", "DISCOUNT": "直降折扣" } def _calculate_discount_rate(self, original_price: float, discount_price: float) -> str: """核算折扣力度:原价/折扣价 → 保留1位小数折扣(如2.5折)""" if original_price <= 0 or discount_price <= 0: return "未知折扣" rate = (discount_price / original_price) * 10 return f"{round(rate, 1)}折" def parse_promotion(self, promotion_info: Dict) -> Dict: """解析促销信息:标准化促销类型、规则、有效期""" return { "promotion_type": self.promotion_type_map.get(promotion_info.get("promotionType", ""), "普通促销"), "promotion_rule": promotion_info.get("promotionRule", ""), # 促销规则(如满200减30) "start_time": promotion_info.get("startTime", ""), # 活动开始时间 "end_time": promotion_info.get("endTime", ""), # 活动结束时间 "is_valid": promotion_info.get("isValid", False) # 促销是否有效 } def adapt_discount_data(self, goods_list: List[Dict]) -> List[Dict]: """ 全量适配折扣数据:整合价格、折扣、促销信息,标准化输出 :param goods_list: 筛选接口返回的原始商品列表 :return: 适配折扣场景的标准化商品数据 """ standard_goods = [] for goods in goods_list: original_price = goods.get("originalPrice", 0.0) discount_price = goods.get("discountPrice", 0.0) # 核算折扣力度 discount_rate = self._calculate_discount_rate(original_price, discount_price) # 解析促销信息 promotion_info = self.parse_promotion(goods.get("promotionInfo", {})) # 标准化商品数据 standard_goods.append({ "goods_id": goods.get("goodsId", ""), "goods_name": goods.get("goodsName", ""), "brand_name": goods.get("brandName", ""), "category_name": goods.get("categoryName", ""), "price_info": { "original_price": original_price, "discount_price": discount_price, "member_price": goods.get("memberPrice", 0.0), # 会员专享价 "discount_rate": discount_rate }, "promotion_info": promotion_info, "stock": goods.get("stock", 0), # 库存数量 "delivery_time": goods.get("deliveryTime", "48小时内"), # 发货时效 "is_self_operated": goods.get("isSelfOperated", False) # 是否自营商品 }) return standard_goods # 示例:折扣数据适配 if __name__ == "__main__": ADAPTER = VipDiscountAdapter() # 模拟筛选接口返回的原始商品列表 raw_goods_list = [ { "goodsId": "12345678", "goodsName": "【2.5折】Adidas男士卫衣", "brandName": "Adidas", "categoryName": "男装>卫衣", "originalPrice": 499.0, "discountPrice": 124.8, "memberPrice": 119.0, "promotionInfo": { "promotionType": "SECKILL", "promotionRule": "限时秒杀,仅限今日", "startTime": "2026-01-27 10:00:00", "endTime": "2026-01-27 22:00:00", "isValid": True }, "stock": 500, "deliveryTime": "24小时内", "isSelfOperated": True } ] # 适配折扣数据 standard_goods = ADAPTER.adapt_discount_data(raw_goods_list) print("标准化折扣商品数据:", standard_goods)
3. 分级防风控架构:适配限流与权限动态调整
唯品会按接口类型与权限等级分级限流,常规调用易触发429错误,且权限过期会导致服务中断。本架构基于"滑动窗口限流+权限监控+降级兜底"设计,适配不同权限等级,从根源保障接口稳定性:
import time import queue import threading import redis from typing import List, Callable, Optional from concurrent.futures import ThreadPoolExecutor class VipRateLimiter: """唯品会分级防风控架构:限流+权限监控+降级兜底""" def __init__(self, max_calls_per_minute: int = 500, redis_host: str = "localhost"): self.max_calls = max_calls_per_minute # 限流阈值(生产环境按权限分级:基础500次/分,增值1000次/分) self.call_timestamps = [] # 滑动窗口时间戳 self.task_queue = queue.Queue(maxsize=1000) # 任务队列,缓冲请求 self.running = False self.worker_thread = threading.Thread(target=self._process_tasks) # Redis缓存:存储权限状态、限流计数、降级开关 self.redis_client = redis.Redis(host=redis_host, port=6379, db=0, decode_responses=True) self.executor = ThreadPoolExecutor(max_workers=3) # 控制并发数 # 降级开关(默认关闭,权限异常/限流严重时开启) self.degrade_switch = self.redis_client.get("vip:degrade:switch") == "ON" def _check_permission(self) -> bool: """权限监控:定期检查接口权限状态,避免权限过期""" permission_status = self.redis_client.get("vip:permission:status") # 权限状态:VALID(有效)/ EXPIRED(过期)/ LIMITED(受限) if permission_status not in ["VALID", None]: print(f"接口权限异常:{permission_status},开启降级模式") self.redis_client.set("vip:degrade:switch", "ON") self.degrade_switch = True return False return True def _can_call(self) -> bool: """滑动窗口限流:判断是否允许发起新请求""" now = time.time() # 清理1分钟前的时间戳 self.call_timestamps = [t for t in self.call_timestamps if now - t < 60] if len(self.call_timestamps) < self.max_calls and self._check_permission(): self.call_timestamps.append(now) # 更新Redis限流计数 self.redis_client.incr("vip:limit:count", 1) self.redis_client.expire("vip:limit:count", 60) return True return False def _degrade_handler(self, task_info: Dict) -> Dict: """降级兜底:权限异常/限流严重时,返回缓存数据""" category_id = task_info.get("category_id") brand_ids = task_info.get("brand_ids") # 缓存键:按类目+品牌组合生成 cache_key = f"vip:cache:goods:{category_id}:{'-'.join(brand_ids)}" cached_data = self.redis_client.get(cache_key) if cached_data: return {"code": 200, "msg": "降级模式,返回缓存数据", "data": json.loads(cached_data)} else: return {"code": 429, "msg": "降级模式,无缓存数据", "data": {}} def add_task(self, task_info: Dict, callback: Callable): """添加筛选任务至队列""" if self.task_queue.full(): print(f"任务队列已满,无法添加任务:{task_info}") return self.task_queue.put((task_info, callback)) def _process_tasks(self): """任务处理循环:权限校验+限流控制+降级兜底""" while self.running: if not self.task_queue.empty(): task_info, callback = self.task_queue.get() # 检查降级开关 if self.degrade_switch: result = self._degrade_handler(task_info) callback(result) self.task_queue.task_done() continue # 等待至可调用状态 while not self._can_call(): time.sleep(0.1) # 提交任务至线程池执行 self.executor.submit(self._execute_task, task_info, callback) else: time.sleep(0.5) def _execute_task(self, task_info: Dict, callback: Callable): """执行筛选任务:含3次重试,成功后缓存数据""" retry_count = 0 max_retry = 3 engine = VipBrandCategoryLinkEngine( app_key=task_info.get("app_key"), app_secret=task_info.get("app_secret"), access_token=task_info.get("access_token") ) while retry_count < max_retry: try: # 执行联动筛选 result = engine.brand_category_filter( category_id=task_info.get("category_id"), brand_ids=task_info.get("brand_ids"), biz_filters=task_info.get("biz_filters") ) if result.get("code") == 0: # 筛选成功,缓存数据(有效期10分钟) cache_key = f"vip:cache:goods:{task_info['category_id']}:{'-'.join(task_info['brand_ids'])}" self.redis_client.setex(cache_key, 600, json.dumps(result)) callback(result) break elif result.get("code") == 429: # 触发限流,延迟重试 time.sleep(2 * (retry_count + 1)) retry_count += 1 print(f"触发限流,重试{retry_count}/{max_retry}") else: raise Exception(f"筛选任务异常:{result.get('msg')}") except Exception as e: retry_count += 1 print(f"任务执行失败,重试{retry_count}/{max_retry},原因:{str(e)}") time.sleep(1 * retry_count) # 重试失败,触发降级 if retry_count >= max_retry: self.redis_client.set("vip:degrade:switch", "ON") self.degrade_switch = True result = self._degrade_handler(task_info) callback(result) self.task_queue.task_done() def start(self): """启动控制器""" if self.running: return self.running = True self.worker_thread.start() print(f"防风控控制器启动,限流阈值:{self.max_calls}次/分钟") def stop(self): """停止控制器,释放资源""" self.running = False self.worker_thread.join() self.executor.shutdown(wait=True) self.task_queue.join() print("防风控控制器停止,资源已释放") # 示例:启动控制器并添加任务 if __name__ == "__main__": def task_callback(result: Dict): print(f"任务处理结果:{result['msg']}") if result.get("code") == 200: adapter = VipDiscountAdapter() standard_data = adapter.adapt_discount_data(result["data"].get("goodsList", [])) print("标准化折扣数据:", standard_data) # 初始化控制器(基础权限:500次/分钟) limiter = VipRateLimiter(max_calls_per_minute=500) limiter.start() # 构造任务信息 task_info = { "app_key": "YOUR_APP_KEY", "app_secret": "YOUR_APP_SECRET", "access_token": "YOUR_ACCESS_TOKEN", "category_id": "1001", "brand_ids": ["10001", "10002"], "biz_filters": {"start_price": 100, "end_price": 500, "page": 1} } # 添加任务 limiter.add_task(task_info, task_callback) limiter.task_queue.join() limiter.stop()
点击获取key和secret
三、全流程实战:联动筛选+折扣适配+业务落地
整合三大模块,实现"权限校验-联动筛选-折扣适配-数据落地"全流程,适配品牌监控、选品分析等核心业务场景,代码可直接部署至生产环境:
import json from datetime import datetime # 导入三大核心模块 from vip_link_engine import VipBrandCategoryLinkEngine from vip_discount_adapter import VipDiscountAdapter from vip_rate_limiter import VipRateLimiter # 全局配置(生产环境建议用.env文件+配置中心管理) APP_KEY = "YOUR_APP_KEY" APP_SECRET = "YOUR_APP_SECRET" ACCESS_TOKEN = "YOUR_ACCESS_TOKEN" CATEGORY_ID = "1001" # 女装二级类目ID TARGET_BRAND_IDS = ["10001", "10002", "10003"] # 目标品牌ID列表 BIZ_FILTERS = {"start_price": 100, "end_price": 800, "page": 1, "pageSize": 20} SAVE_PATH = "./vip_brand_category_filter_result.json" REDIS_HOST = "localhost" # 全局初始化核心模块 engine = VipBrandCategoryLinkEngine(APP_KEY, APP_SECRET, ACCESS_TOKEN) adapter = VipDiscountAdapter() limiter = VipRateLimiter(max_calls_per_minute=500, redis_host=REDIS_HOST) # 定义回调函数:折扣适配+数据保存 def core_callback(result: Dict): if result.get("code") != 200 and result.get("code") != 0: print(f"任务处理失败:{result['msg']}") return # 适配折扣数据 raw_goods_list = result["data"].get("goodsList", []) standard_goods = adapter.adapt_discount_data(raw_goods_list) # 保存数据至JSON文件 with open(SAVE_PATH, "a", encoding="utf-8") as f: json.dump({ "filter_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "category_id": CATEGORY_ID, "brand_count": len(TARGET_BRAND_IDS), "goods_count": len(standard_goods), "goods_list": standard_goods }, f, ensure_ascii=False, indent=2) f.write(",\n") # 打印核心筛选结果 print(f"\n=== 筛选完成({datetime.now().strftime('%H:%M:%S')})===") print(f"类目:{CATEGORY_ID}(女装),目标品牌数:{len(TARGET_BRAND_IDS)}") print(f"有效商品数:{len(standard_goods)},折扣范围:{[g['price_info']['discount_rate'] for g in standard_goods[:5]]}...") print(f"主要促销类型:{set([g['promotion_info']['promotion_type'] for g in standard_goods])}") # 主函数:全流程执行 def main(): # 初始化文件 with open(SAVE_PATH, "w", encoding="utf-8") as f: f.write("[\n") # 启动防风控控制器 limiter.start() # 构造任务信息 task_info = { "app_key": APP_KEY, "app_secret": APP_SECRET, "access_token": ACCESS_TOKEN, "category_id": CATEGORY_ID, "brand_ids": TARGET_BRAND_IDS, "biz_filters": BIZ_FILTERS } # 添加任务 limiter.add_task(task_info, core_callback) # 等待任务完成 limiter.task_queue.join() # 补全JSON格式 with open(SAVE_PATH, "a", encoding="utf-8") as f: f.write("]\n") # 停止控制器 limiter.stop() print(f"\n全流程执行完成,数据已保存至:{SAVE_PATH}") if __name__ == "__main__": main()
四、生产环境核心避坑指南
结合唯品会接口实战经验,梳理6大高频坑点及解决方案,覆盖开发、测试、上线全流程,规避技术与合规风险:
-
签名失败(code:1001) :① 时间戳需为毫秒级 (V2版本接口要求,V1为秒级,易混淆);② 签名串需首尾拼接AppSecret,而非仅后缀拼接;③ 空值参数需排除,避免参与签名计算;④ 中文参数需统一编码为UTF-8,防止签名串错乱。
-
权限不足(code:2001):① 品牌筛选、会员价等字段需额外申请"增值接口权限",基础权限无法获取;② 定期检查权限有效期(通常1年),提前30天申请续期;③ 存储权限状态至Redis,异常时自动触发降级。
-
筛选结果为空:① 校验品牌是否授权目标类目,无授权品牌无法返回商品;② 确认类目ID与等级匹配(如四级类目ID不能对应二级类目等级);③ 检查价格区间是否合理(唯品会折扣商品价格跨度大,区间过窄易无结果)。
-
触发限流(code:429):① 严格按权限等级控制调用频率,基础权限500次/分,增值权限1000次/分;② 避免高峰时段(如每日10点上新、20点秒杀)集中调用;③ 优先使用缓存数据,减少接口请求频次。
-
折扣数据解析失真:① 部分商品无原价(仅展示折扣价),需设置默认折扣为"未知折扣";② 促销规则字段可能包含HTML标签,需提前过滤清洗;③ 会员价仅对已登录用户返回,无令牌时需屏蔽该字段。
-
合规风险:① 仅使用开放平台官方接口,禁止解析网页HTML或模拟用户行为爬取数据;② 筛选数据仅限自身业务使用,禁止转售、二次商业化或恶意比价;③ 自营与POP商品数据分开存储,避免违规混用。
五、业务场景扩展方向
本方案可基于唯品会折扣电商特性,快速扩展为企业级应用,推荐4个高价值方向:
-
品牌折扣监控:定时调用联动筛选接口,监控指定品牌在目标类目的折扣力度、促销类型变化,设置折扣预警,辅助采购决策。
-
智能选品系统:结合折扣数据、销量热度、库存状态,构建选品评分模型,自动筛选高性价比商品(如2-3折、自营、库存充足)。
-
促销活动联动:对接唯品会促销接口,筛选符合活动条件的品牌类目商品,自动生成活动商品列表,提升促销运营效率。
-
多维度报表生成:按品牌、类目、折扣区间统计商品分布,生成日报/周报,支撑市场分析与业务复盘。
六、总结
唯品会品牌类目筛选接口的开发核心,在于跳出"基础筛选"的思维定式,深度适配其"品牌类目强绑定、折扣为核心、风控严苛"的业务特性。本文方案通过"品牌-类目联动引擎"解决筛选精准度问题,通过"折扣场景适配模块"挖掘数据价值,通过"分级防风控架构"保障稳定性,完全区别于全网基础教程。
核心建议:① 开发前完成企业资质认证与接口权限申请,明确所需字段对应的权限等级;② 测试环境充分验证多类目、多品牌组合筛选场景,避免上线后出现数据失真;③ 建立接口监控与告警机制,及时响应限流、权限过期等异常情况,确保服务连续可用。
附:唯品会开放平台核心资源
-
唯品会开放平台官网:https://open.vip.com/(需企业资质认证方可访问)
-
接口文档中心:认证通过后,在"开发者中心-接口文档"获取最新V2版本规范
-
权限申请指南:品牌筛选、会员价等增值字段需提交业务场景说明,经商务团队审核通过后开通。
