如何使用Python通过API向Shopware 6导入商品数据
字段是否满足Shopware 6导入要求说明
你现有的8个字段已经覆盖了商品导入的核心业务字段,但还需要补充3个系统必填的配置项才能完成正常导入:
- 税率ID:Shopware 6要求所有商品绑定提前在后台配置好的税率规则,导入时需要传入对应税率的唯一ID
- 库存数值:实物类商品默认需要填写库存数量,如果你开启了「无限库存」规则可跳过该项
- 商品启用状态:需明确传入商品是否在前端展示,未传的话系统默认会将商品设为禁用状态
现有字段和Shopware 6商品字段的对应关系如下,可直接映射使用:
- SKU →
productNumber(全局唯一,可作为后续更新商品的唯一标识) - 商品名称 →
name - 售价 →
price数组中的原价字段 - 优惠后价格 →
price数组中的促销价字段,如有时间限制可同步传入促销生效/失效时间 - 商品描述 →
description - 生产商 →
manufacturerId,可提前在后台创建生产商后拿到对应ID,也可在导入商品时同步创建生产商 - EAN码 →
ean - 商品图片 → 需先上传到Shopware媒体库,再将媒体ID关联到商品的
media字段中
Python调用API实现商品导入操作
前置准备
先在Shopware 6后台获取API权限:进入「设置>系统>集成」,新建一个集成,开启商品和媒体的写入权限,保存后拿到对应的API域名、Client ID、Client Secret。
依赖安装
执行命令安装网络请求库:pip install requests
完整代码示例
import requests import json # 配置项,替换为你自己的信息 SHOPWARE_API_URL = "https://你的店铺域名/api" CLIENT_ID = "你的Client ID" CLIENT_SECRET = "你的Client Secret" # 第一步:获取API访问凭证 def get_access_token(): url = f"{SHOPWARE_API_URL}/oauth/token" payload = { "grant_type": "client_credentials", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET } response = requests.post(url, json=payload) return response.json()["access_token"] # 第二步:创建商品 def create_product(access_token, product_data): url = f"{SHOPWARE_API_URL}/product" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } response = requests.post(url, headers=headers, json=product_data) return response.json() # 第三步:上传商品图片并关联到商品 def upload_and_associate_image(access_token, product_id, image_path, image_name): # 先上传图片到媒体库 upload_url = f"{SHOPWARE_API_URL}/_action/media/upload" headers = { "Authorization": f"Bearer {access_token}" } files = { "file": (image_name, open(image_path, "rb"), "image/jpeg") } params = { "extension": "jpg", "fileName": image_name } upload_response = requests.post(upload_url, headers=headers, files=files, params=params) media_id = upload_response.json()["data"]["id"] # 关联图片到商品 associate_url = f"{SHOPWARE_API_URL}/product-media" associate_payload = { "productId": product_id, "mediaId": media_id, "position": 1 } requests.post(associate_url, headers=headers, json=associate_payload) if __name__ == "__main__": token = get_access_token() # 替换为你自己的商品数据 test_product = { "name": "测试商品", "productNumber": "TEST001", "stock": 100, "active": True, "taxId": "你后台的税率ID", "price": [ { "currencyId": "你后台的货币ID,默认人民币对应ID可在后台查看", "gross": 199.99, # 售价 "net": 168.06, # 税前价格,可根据税率计算 "linked": True, "listPrice": { "currencyId": "你后台的货币ID", "gross": 159.99, # 优惠后价格 "net": 134.45, "linked": True } } ], "description": "这是商品描述内容", "ean": "1234567890123", "manufacturerId": "你后台的生产商ID" } product_result = create_product(token, test_product) product_id = product_result["data"]["id"] # 上传并关联图片,替换为你本地的图片路径 upload_and_associate_image(token, product_id, "./test_product.jpg", "test_product.jpg")
注意事项
- 批量导入时建议单次请求最多处理50个商品,避免触发API限流规则
- 可通过
productNumber(即SKU)作为唯一标识,后续更新商品时直接调用PUT接口即可,无需重复创建 - 导入前可先传入一条测试数据验证字段格式是否正确,避免批量写入脏数据
内容的提问来源于stack exchange,提问作者lanavargas2002
相关产品推荐
相关产品推荐

