Les webhooks sont des appels HTTP qui sont déclenchés par GHS vers une URL lors d’un événement particulier. Cela peut être une signature électronique qui a été faite, ou un salarié qui a été déclaré chez l’ursaf.

Lorsque un de ces événements se produit, un POST HTTP est effectué sur l’adresse qui a été configuré, contenant un json. Le système attend une réponse HTTP 200 pour considérer que l’appel a bien été reçu, sinon le système ressayera plus tard (TODO, PARLER DU BACKOFF)

Contenu du Webhook

Tous les POST se font avec un object de base.

{
    "event_id": "48d4491f-6791-4608-8928-194a5da8375a",
    "event_type": "dpae.salarie.ok",
    "event_date": "2022-11-02T13:39:03.139Z",
    "data": payload
}
AttributDescription
event_idUUID unique de l’évènement
event_typeLe nom de l’évènement
event_dateLa date a laquelle l’évènement a été effectué. /!\ Nous ne garentissons par l’ordre d’arriver des évènements.
datales données de l’évènement

Header du Webhook

HeaderValeur
Content-Typeapplication/json
x-ghs-signature-256Signature de la requête qui permet de s’assurer que la requete vient bien de chez GHS

Signature du Webhook

La signature vous permet de vous assurer que la contenu vient bien de chez GHS;

Pour cela, il faut comparer la signature que GHS vous donne dans les headers, avec la valeur que vous allez pouvoir calculer.

Pour la calculer, il faut faire un hachage HMAC SHA-256 de l'ensemble du contenu du webhook et concatener à la secret

En javascript / express

const payload = req.body
const secret = la_clef_prive
const computed_signature = CryptoJS.HmacSHA256(payload, secret).toString();

if (signature == req.get(x-ghs-signature-256) {
    console.log(ok)
}

En php

$signature = $_REQUEST[x-yousign-signature-256];
$payload = stream_get_contents(STDIN);
$secret = la_clef_prive;
$computed_signature = hash_hmac(sha256, utf8_encode($payload), utf8_encode($secret));

if ($computed_signature == $signature) {
    echo "ok"
}

Events Webhook

dpae.salarie.ok

Ces événements sont déclenchés lorsque la déclaration a été correctement effectué pour le salarié.

{
    "event_id": "48d4491f-6791-4608-8928-194a5da8375a",
    "event_type": "dpae.salarie.ok",
    "event_date": "2022-11-02T13:39:03.139Z",
    "data": {
        "dpae": {
            "id": "636270a36e3bf4eb030474e3",
            "statut": false,
            "meta": {
                "code_societe": "AB",
                "a": "b"
            }
        },
        "salarie": {
            "id": "coquart_vincent_5kcafudj0i",
            "identifiants": {
                "ab": "b",
                "code_contrat": "ABC",
                "matricule": "A"
            },
            "reference": "4YSNM",
            "etat": {
                "date": "2022-11-02T13:39:03.139Z",
                "statut": "declaration_ok"
            }
        }
    }
}

dpae.salarie.ko

Ces événements sont déclenchés lorsqu’il y a une erreur dans la déclaration d’un employé

{
    "event_id": "ab38d94d-f0c5-4d4d-b592-b39a86acf256",
    "event_type": "dpae.salarie.ok",
    "event_date": "2022-11-02T13:29:08.477Z",
    "data": {
        "dpae": {
            "id": "636270a36e3bf4eb030474e3",
            "statut": false,
            "meta": {
                "code_societe": "AB",
                "a": "b"
            }
        },
        "salarie": {
            "id": "coquart_vincent_nigedoajsp",
            "identifiants": {
                "ab": "b",
                "code_contrat": "ABC",
                "matricule": "A"
            },
            "etat": {
                "date": "2022-11-02T13:29:08.477Z",
                "statut": "refus"
                "raison": "Date et/ou Heure dembauche invalide - invraisemblable ou non renseignee"
                "categorie_probleme": "bloquant"
            }
        }
    }
}

dpae.ok

Ces événements sont déclenchés lorsque les retours de DPAE ont été tous fait.

{
    "event_id": "4ebd4df6-9ee4-4aef-b497-3738bb15edc9",
    "event_type": "dpae.ok",
    "event_date": "2022-11-02T13:39:03.141Z",
    "data": {
        "dpae": {
            "id": "636270a36e3bf4eb030474e3",
            "statut": true,
            "meta": {
                "code_societe": "AB",
                "a": "b"
            }
            "date_cree": "2022-11-02T13:28:38.810Z",
            "date_maj": "2022-11-02T13:29:08.791Z",
            "date_terminee": "2022-11-02T13:39:03.141Z",
            "date_derniere_interrogation": "2022-11-02T13:38:08.308Z",
            "depot_status": {
                "etat_conformite": true
                "certificat_conformite": "01TEST0632792095500041202211220100000000000000200000220221102142907-dcaca72d25e79dfb5fb6a3efb5e1c708ac43b4df-V1_MEQCIB6g+ax+g+uxiBYIYfDt2Il914trytXZ2t2ov2LJyxavAiA/BCrU7PVoCjYZsQL9U78bO1fTpZvKh85cY8ZTSU5utw== ()",
                "date": "2022-11-02T13:29:08.501Z",
            },
            "salaries": [
                {
                    "id": "coquart_vincent_5kcafudj0i",
                    "identifiants": {
                        "ab": "b",
                        "code_contrat": "ABC",
                        "matricule": "A"
                    },
                    "reference": "4YSNM",
                    "etat": {
                        "date": "2022-11-02T13:39:03.139Z",
                        "statut": "declaration_ok"
                    }
                },
                {
                    "id": "coquart_vincent_nigedoajsp",
                    "identifiants": {
                        "ab": "b",
                        "code_contrat": "ABC",
                        "matricule": "A"
                    },
                    "etat": {
                        "date": "2022-11-02T13:29:08.477Z",
                        "statut": "refus",
                        "raison": "Date et/ou Heure dembauche invalide - invraisemblable ou non renseignee",
                        "categorie_probleme": "bloquant"
                    }
                },
                {
                    "id": "coquart_vincent_s1bqm5d1m6",
                    "identifiants": {
                        "ab": "b",
                        "code_contrat": "ABC",
                        "matricule": "A"
                    },
                    "etat": {
                        "date": "2022-11-02T13:29:08.479Z",
                        "statut": "refus",
                        "raison": "Date et/ou Heure dembauche invalide - invraisemblable ou non renseignee",
                        "categorie_probleme": "bloquant"
                    }
                },
            ]
        }
    }
}

Exemple webhook Salarie

{
    "event_id": "48d4491f-6791-4608-8928-194a5da8375a",
    "event_type": "salarie",
    "event_date": "2022-11-02T13:39:03.139Z",
    "data": {
        "salarie": {
            "code_societe": "SocA",
            "matricule": "lad",
            "nom": "LANDRAGIN",
            "prenom": "Drissia",
            "nom_naissance": "",
            "pseudonyme": "",
            "genre": "Madame",
            "adresse": "29 rue des Clamarts",
            "complement_adresse": "",
            "code_postal": "94130",
            "ville": "Nogent",
            "code_pays": null,
            "code_pays_nationalite": null,
            "telephone": "0663533943",
            "mail": "dl@ghs.fr",
            "refus_dematerialisation&": false,
            "date_naissance": "1978-04-19",
            "lieu_naissance": "Pontoise",
            "departement_naissance": "95",
            "code_pays_naissance": null,
            "numero_securite_sociale": "278049550013474",
            "numero_conges_spectacles": "",
            "retraite": false,
            "fiscalite": "FR",
            "abattement": null,
            "date_visite_medicale": "0000-00-00",
            "date_prochaine_visite_medicale": "0000-00-00",
            "date_entree": "0000-00-00",
            "date_anciennete": "0000-00-00",
            "compte_racine": "421",
            "compte_terminaison": "LAN",
            "libelle_racine": "NAP",
            "libelle_terminaison": "LANDRAGIN Drissia",
            "mode_reglement": "",
            "iban": "",
            "bic": "",
            "statut_handicape": 12,
            "statut_handicape_date_debut": "2020-01-02"
        }
    }
}