Quickbooks/Intuit webhook API 返回 null 主體

描述問題/錯誤/問題

嗨!!
我們目前有與 QB 的整合,使用舊格式運作正常。從八月開始,他們將強制執行新綱要的更新…
我們在使用新 CloudEvents 承載格式 (綱要 v2.0) 時遇到問題 — Webhook 節點返回空白正文 ({}), 無論啟用或禁用 Raw Body 都是如此 :frowning:
設定的快速摘要:

  • Webhook 節點 (v2.1) 接收來自 Quic 的 POST 請求
  • 使用 Raw Body = false: 正文存在但為 null ({})
  • 使用 Raw Body = true: 正文完全不會出現在輸出中
    標題傳輸正常,所以請求確實到達了節點 — 只是 n8n 似乎無法正確解析正文內容類型。
    有人處理過 QuickBooks 的新 webhook 承載格式嗎? 有什麼解決方案可以讓正文正確解析嗎?
    相關 GitHub 問題參考: Quickbooks API returning null body · Issue #28750 · n8n-io/n8n · GitHub

錯誤訊息是什麼 (如果有的話)? N/A

請分享你的工作流程

{
“nodes”: [
{
“parameters”: {
“httpMethod”: “POST”,
“path”: “qb-invoice-created”,
“options”: {
“binaryPropertyName”: “data”,
“rawBody”: true
}
},
“type”: “n8n-nodes-base.webhook”,
“typeVersion”: 2.1,
“position”: [
-384,
96
],
“id”: “e4f54943-e131-42a2-99f5-43ec3e7cc314”,
“name”: “Webhook”,
“webhookId”: “9b2ef218-1f57-46b0-99ba-1d1929ccb5f4”
}
],
“connections”: {
“Webhook”: {
“main”: [

]
}
},
“pinData”: {},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “b45ee928b826ee03de7f50699776b5bbce13dfef5ed3d12709796e32a0102f85”
}
}

分享最後一個節點返回的輸出

{}

你的 n8n 設定的相關資訊

  • n8n 版本: 1.123.54
  • n8n 執行方式 (Docker、npm、n8n cloud、桌面應用): n8n cloud
1個讚

歡迎 @Mathias_Viscardi

根本原因是 n8n 的 webhook 節點不認識 application/cloudevents+json 作為它應該自動解析的內容類型,所以 body 會變成 null。將 Raw Body 設為 true 時,payload 應該會進到二進制輸出。試著在 webhook 後面添加一個 Code 節點,然後像這樣提取它:

const raw = $input.item.binary?.data
  ? Buffer.from($input.item.binary.data, 'base64').toString('utf8')
  : $input.item.json.rawBody;
return [{ json: JSON.parse(raw) }];

如果 binary.data 也是空的,檢查 $input.item.json — 某些 n8n 版本會在 rawBody 鍵下存儲原始字符串,即使 UI 顯示 null。這是一個已知的漏洞,在你連結的 GitHub issue 中有追蹤,所以在八月前最好先在那裡添加評論。

歡迎 @Mathias_Viscardi

這是 CloudEvents 內容類型的問題。QuickBooks 的 v2 schema 發送的請求將 application/cloudevents+json 作為 Content-Type 標頭,但 n8n 的 Webhook 節點不會將其解析為標準 JSON - 它要麼完全跳過正文,要麼為其返回 null。

設定 Raw Body = true(你已經設定過了),原始位元組會以 base64 編碼字串的形式進入 $binary.data。在 Webhook 之後添加一個 Code 節點並手動解析它:

const rawData = $input.first().binary.data;
const decoded = Buffer.from(rawData.data, 'base64').toString('utf8');
return [{ json: JSON.parse(decoded) }];

這會將完整的 CloudEvents 承載作為普通 JSON 物件提供給你。然後你可以透過 $json.data 存取 QuickBooks 事件資料(或者 QB 在新 schema 中使用的任何鍵)。

1個讚

@nguyenthieutoan

非常感謝你的建議 :smiley: 我必須稍微修改它為

const rawData = $input.first().binary.data;const decoded = Buffer.from(rawData.data, 'base64').toString('utf8');const parsed = JSON.parse(decoded);return [{ parsed }];

但這樣的話現在似乎可以正常運作了!!

再次感謝!!

1個讚

很高興它有效了!.binary.data 路徑對於 Intuit 的 webhook payload 是正確的,因為 n8n 在那裡儲存原始二進制資料。你的調整真是眼力好。