API webhook Quickbooks/Intuit renvoyant un corps vide

Décrivez le problème/l’erreur/la question

Salut !!
Nous avons actuellement une intégration avec QB qui fonctionne correctement, avec l’ancien format. À partir d’août, ils vont imposer un changement vers leur nouveau schéma…
Nous rencontrons un problème avec le nouveau format de charge CloudEvents (schéma v2.0) — le nœud Webhook retourne un corps vide ({}), à la fois avec Raw Body activé et désactivé :frowning:
Résumé rapide de la configuration :

  • Nœud Webhook (v2.1) recevant des requêtes POST de Quic
  • Avec Raw Body = false : le corps est présent mais null ({})
  • Avec Raw Body = true : le corps est complètement absent de la sortie
    Les en-têtes passent correctement, donc la requête atteint définitivement le nœud — il semble juste que n8n ne parse pas correctement le type de contenu du corps.
    Quelqu’un d’autre a-t-il eu affaire au nouveau format de charge webhook de QuickBooks ? Des solutions pour que le corps soit parsé correctement ?
    Problème GitHub associé pour référence : Quickbooks API returning null body · Issue #28750 · n8n-io/n8n · GitHub

Quel est le message d’erreur (le cas échéant) ? N/A

Veuillez partager votre workflow

{
“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”
}
}

Partagez la sortie retournée par le dernier nœud

{}

Informations sur votre configuration n8n

  • version n8n : 1.123.54
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) : n8n cloud
1 « J'aime »

Bienvenue @Mathias_Viscardi !

La cause racine est que le nœud webhook de n8n ne reconnaît pas application/cloudevents+json comme un type de contenu qu’il devrait analyser automatiquement, donc le corps arrive en tant que null. Avec Raw Body = true, la charge utile devrait arriver dans la sortie binaire. Essayez d’ajouter un nœud Code juste après le webhook et extrayez-le comme ceci :

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

Si binary.data est aussi vide, vérifiez $input.item.json - certaines versions de n8n stockent la chaîne brute sous une clé rawBody même quand l’interface utilisateur affiche null. C’est une lacune connue signalée dans le problème GitHub que vous avez lié, donc ça vaut le coup d’ajouter un commentaire là-bas aussi avant août.

Bienvenue @Mathias_Viscardi!

C’est le problème de type de contenu CloudEvents. Le schéma v2 de QuickBooks envoie des requêtes avec application/cloudevents+json comme en-tête Content-Type, que le nœud Webhook de n8n ne parse pas en tant que JSON standard - il ignore complètement le corps ou retourne null.

Avec Raw Body = true (ce que vous avez déjà configuré), les bytes bruts se retrouvent dans $binary.data sous forme de chaîne encodée en base64. Ajoutez un nœud Code juste après le Webhook et parsez-le manuellement:

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

Cela vous donne la charge utile CloudEvents complète sous forme d’objet JSON normal. Vous pouvez ensuite accéder aux données d’événement de QuickBooks via $json.data (ou quelle que soit la clé utilisée par QB dans le nouveau schéma).

1 « J'aime »

Salut @nguyenthieutoan !

Merci beaucoup pour votre suggestion :smiley: J’ai dû la modifier légèrement en

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

mais avec ça, ça semble fonctionner maintenant !!

Merci encore !!

1 « J'aime »

Heureux que ça ait fonctionné ! Le chemin .binary.data est le bon pour la charge utile du webhook d’Intuit puisque n8n stocke les données binaires brutes là. Bonne observation sur l’ajustement.