
shopware 6 使用 patch 请求更新商品价格时出现 “the json payload is malformed” 错误,通常因未正确序列化请求体或认证头格式错误所致;关键在于使用 `json=` 参数而非 `data=`,并确保 `authorization` 头为 `bearer
在 Shopware 6 的 REST API 中,更新商品(如价格)需严格遵循其数据结构与传输规范。你当前代码中的主要问题有两处:
requests.patch(..., data=payload) → 序列化缺失
data= 参数接收原始字节或字符串,若传入 Python 字典,requests 不会自动将其 JSON 序列化,也不会自动设置 Content-Type: application/json(即使你手动加了 header),导致后端解析失败,抛出 The JSON payload is malformed。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 更新商品价格。










