微店(Weidian)作为国内知名的社交电商平台,其开放平台提供了商品查询、订单管理等 API 接口。获取商品到手价(含店铺优惠、优惠券等)需调用商品详情接口,结合优惠信息计算最终价格。以下是基于微店开放平台 API 的实现方案。
一、核心接口与认证机制
1. 相关 API 接口
获取商品到手价主要依赖微店的商品详情接口:
weidian.item.get
:获取商品基础信息、原价、促销活动、优惠券等,支持返回优惠后实际价格(需店铺授权)。2. 认证机制
微店 API 采用appkey + appsecret + 签名
的认证体系:- 开发者需在微店开发平台注册应用,获取
appkey
和appsecret
; - 所有请求需包含
sign
参数(通过appsecret
对请求参数加密生成); - 店铺级接口需通过
access_token
(店铺授权令牌,有效期 2 小时)访问,需用户授权流程。二、Python 脚本实现
以下脚本实现通过微店 API 获取商品到手价,包含签名生成、接口调用和价格解析逻辑。
import requests
import json
import time
import hashlib
import logging
from requests.exceptions import RequestException
from typing import Dict, Optional
配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
class WeidianAPI:
def init(self, appkey: str, appsecret: str, access_token: Optional[str] = None):
"""
初始化微店API客户端
:param appkey: 应用appkey
:param appsecret: 应用appsecret
:param access_token: 店铺授权令牌(店铺级接口必需)
"""
self.appkey = appkey
self.appsecret = appsecret
self.access_token = access_token
self.base_url = "https://api.weidian.com" # 微店API网关
self.format = "json"
self.version = "1.0"
def _generate_sign(self, params: Dict[str, str]) -> str:
"""生成签名(微店API签名规则)"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接为key=value&key=value格式
sign_str = "&".join([f"{k}={v}" for k, v in sorted_params])
# 3. 拼接appsecret并MD5加密
sign_str += self.appsecret
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
def call(self, method: str, params: Optional[Dict] = None) -> Optional[Dict]:
"""
通用API调用方法
:param method: 接口方法名(如weidian.item.get)
:param params: 接口参数
:return: 接口返回的业务数据
"""
# 1. 构建公共参数
common_params = {
"appkey": self.appkey,
"method": method,
"timestamp": str(int(time.time())), # 秒级时间戳
"format": self.format,
"version": self.version
}
if self.access_token:
common_params["access_token"] = self.access_token
# 2. 合并参数
all_params = {**common_params,** (params or {})}
# 3. 生成签名
sign = self._generate_sign(all_params)
all_params["sign"] = sign
# 4. 发送请求(微店API支持GET/POST,推荐POST)
try:
response = requests.post(
self.base_url,
data=all_params,
headers={"Content-Type": "application/x-www-form-urlencoded"},
timeout=15
)
response.raise_for_status()
# 5. 解析响应
result = response.json()
logging.info(f"API调用成功:{method},响应:{json.dumps(result, ensure_ascii=False)[:200]}...")
# 6. 处理错误(微店API错误码在errno字段,0为成功)
if result.get("errno") != 0:
logging.error(f"业务错误:{result.get('errmsg')}(错误码:{result.get('errno')})")
return None
return result.get("data", {})
except RequestException as e:
logging.error(f"请求异常:{str(e)},接口:{method}")
return None
except json.JSONDecodeError:
logging.error(f"响应格式错误:{response.text[:200]}...,接口:{method}")
return None
def get_item_final_price(self, item_id: str) -> Optional[Dict]:
"""
获取商品到手价(包含店铺优惠、优惠券等)
:param item_id: 商品ID(微店商品唯一标识)
:return: 价格信息字典(含原价、到手价、优惠信息等)
"""
method = "weidian.item.get"
params = {
"item_id": item_id,
"fields": "item_id,title,price,final_price,promotion_info,coupon_info,stock"
}
# 调用接口
result = self.call(method, params)
if not result:
return None
# 解析价格信息
# final_price为优惠后到手价(单位:分,需转换为元)
final_price = result.get("final_price") / 100 if result.get("final_price") else None
original_price = result.get("price") / 100 if result.get("price") else None
# 解析优惠信息
promotion_info = result.get("promotion_info", {}) # 促销活动(如满减)
coupon_info = result.get("coupon_info", []) # 优惠券列表
return {
"item_id": item_id,
"title": result.get("title"), # 商品标题
"original_price": original_price, # 原价(元)
"final_price": final_price, # 到手价(元)
"promotion": promotion_info.get("desc") or "无促销", # 促销描述
"coupons": [
{
"denomination": c.get("denomination") / 100, # 优惠券金额(分→元)
"min_charge": c.get("min_charge") / 100, # 使用门槛(分→元)
"valid_time": f"{c.get('start_time')}至{c.get('end_time')}" # 有效期
} for c in coupon_info
],
"stock": result.get("stock"), # 库存数量
"main_image": result.get("main_img") # 商品主图
}
示例调用
if name == "main":
# 替换为你的实际参数(从微店开放平台获取)
APPKEY = "your_appkey"
APPSECRET = "your_appsecret"
ACCESS_TOKEN = "your_access_token" # 店铺授权令牌(必需)
# 初始化客户端
weidian_api = WeidianAPI(appkey=APPKEY, appsecret=APPSECRET, access_token=ACCESS_TOKEN)
# 获取商品到手价(替换为实际商品ID)
item_id = "12345678" # 示例商品ID
price_info = weidian_api.get_item_final_price(item_id)
if price_info:
print(f"商品标题:{price_info['title']}")
print(f"原价:{price_info['original_price']:.2f} 元")
print(f"到手价:{price_info['final_price']:.2f} 元")
print(f"促销活动:{price_info['promotion']}")
print(f"库存:{price_info['stock']}件")
print("可用优惠券:")
for coupon in price_info["coupons"]:
print(f"- 满{coupon['min_charge']}元减{coupon['denomination']}元 "
f"(有效期:{coupon['valid_time']})")
关键说明
- 接口与参数解析
核心接口:weidian.item.get是获取商品详情的核心接口,需指定fields参数明确返回字段(如final_price为到手价);
item_id:商品唯一标识,可从微店商品页 URL 提取;
access_token:店铺授权令牌,通过 OAuth 2.0 流程获取(需店铺主授权),用于访问店铺私有数据。 - 价格单位与计算
微店 API 返回的价格单位为 “分”,需转换为 “元”(除以 100):
price:商品原价(分);
final_price:优惠后到手价(分),已包含店铺折扣、优惠券、满减等所有优惠;
优惠券金额(denomination)和门槛(min_charge)同样以 “分” 为单位。 - 签名规则
微店 API 签名生成步骤:
收集所有请求参数(含公共参数和业务参数);
按参数名 ASCII 码升序排序;
拼接为key=value&key=value格式;
末尾拼接appsecret,通过 MD5 加密并转为大写,即为sign参数。 - 权限与限流
权限申请:weidian.item.get接口需申请 “商品管理” 权限,个人开发者需完成实名认证;
限流策略:默认 QPS 为 5,超限返回429错误,建议添加请求间隔(如 1 秒 / 次)。
扩展建议
批量查询:通过weidian.item.batchget接口批量获取多个商品价格(需传入item_ids列表);
优惠详情:解析promotion_info字段,展示 “第二件半价”“满 300 减 50” 等促销规则;
库存监控:结合final_price和stock字段,实现低价商品库存预警功能。
通过上述脚本,可实现微店商品到手价的精准获取,适用于社交电商比价工具、导购小程序、店铺运营分析系统等场景。实际使用时需参考微店开放平台文档调整参数和字段。