Shopware 6 REST API 商品价格更新失败的常见原因与正确实践  第1张

shopware 6 使用 patch 请求更新商品价格时出现 “the json payload is malformed” 错误,通常因未正确序列化请求体或认证头格式错误所致;关键在于使用 `json=` 参数而非 `data=`,并确保 `authorization` 头为 `bearer ` 格式。

在 Shopware 6 的 REST API 中,更新商品(如价格)需严格遵循其数据结构与传输规范。你当前代码中的主要问题有两处:

  1. requests.patch(..., data=payload) → 序列化缺失
    data= 参数接收原始字节或字符串,若传入 Python 字典,requests 不会自动将其 JSON 序列化,也不会自动设置 Content-Type: application/json(即使你手动加了 header),导致后端解析失败,抛出 The JSON payload is malformed。

  2. Authorization 头格式错误
    Shopware 6 要求 Bearer Token 必须以 Bearer 形式传递,而你的代码直接使用了裸 token(如 "abc123"),缺少 Bearer 前缀,将被拒绝认证(尽管此时错误可能被 JSON 解析失败掩盖)。

✅ 正确做法是:使用 json= 参数 —— 它会自动:

  • 将字典序列化为 JSON 字符串;
  • 设置 Content-Type: application/json;
  • 处理编码与字符转义。

同时,务必补全 Bearer 前缀,并推荐使用 requests.Session() 统一管理认证头,提升可维护性。

以下是修正后的完整示例(含错误处理):

import requests

# 假设 response_token 是已获取 access_token 的 requests.Response 对象
token = response_token.json()["access_token"]

session = requests.Session()
session.headers.update({
    "Authorization": f"Bearer {token}",
    "Accept": "application/json"
})

url = "http://dev.bagger-ersatzteile.eu/api/v1/product/018d7da4eaec70fe9ebe4c0c3be1cba6"

payload = {
    "price": [
        {
            "currencyId": "b7d2554b0ce847cd82f3ac9bd1c0dfca",  # EUR ID(需确认是否准确)
            "gross": 121.0,   # 注意:Shopware 推荐使用 float 类型(如 121.0),避免整数引发类型校验失败
            "net": 100.0,
            "linked": False
        }
    ]
}

try:
    response = session.patch(url, json=payload)
    response.raise_for_status()  # 抛出 HTTPError(如 400/401/404)
    print("✅ 商品价格更新成功")
    print(response.json())
except requests.exceptions.HTTPError as e:
    print(f"❌ API 请求失败: {e}")
    print("响应内容:", response.text)
except requests.exceptions.RequestException as e:
    print(f"❌ 网络请求异常: {e}")

? 额外注意事项:

  • ✅ currencyId 必须是 Shopware 系统中真实存在的货币 ID(可通过 /api/v1/currency 获取);
  • ✅ gross 和 net 建议显式使用 float(如 121.0),Shopware 6 内部对数值类型较敏感,整数可能触发 Schema 验证失败;
  • ✅ 确保目标商品 ID(018d7da4eaec70fe9ebe4c0c3be1cba6)存在且未被软删除;
  • ✅ 若需批量更新或多字段修改(如同时改价格+库存),PATCH 请求体应包含所有待更新字段,未提供的字段保持不变。

遵循以上规范,即可稳定、安全地通过 Shopware 6 REST API 更新商品价格。