[[:guide_de_migration_shootid_vers_id360|Français]] | [[:en:guide_de_migration_shootid_vers_id360|English]] ---- ====== Guide de migration ShootID vers ID360 ====== ===== 🔑 ETAPE 1 – AUTHENTIFICATION ===== ==== đŸ”č ShootID ==== * **MĂ©thode** : Authentification via **HTTP Basic Auth** * **Header utilisĂ© dans toutes les requĂȘtes** : Authorization: Basic base64(applicationToken:applicationSecret) * **DurĂ©e de validitĂ©** : Permanente (ou jusqu’à rĂ©vocation manuelle) ---- ==== 🔾 ID360 ==== * **MĂ©thode** : POST /api/1.0.0/user/login/ * **URL** : * PrĂ©prod : https://preprod.id360docaposte.com/api/1.0.0/user/login/ * Prod : https://id360docaposte.com/api/1.0.0/user/login/ * **Payload JSON** : { "username": "string", "password": "string" } * **RĂ©ponse** : { "token": "0123456789abcdef01234567" } * **Header Ă  inclure ensuite dans chaque appel API** : Authorization: Token 0123456789abcdef01234567 ---- ==== 🕐 DurĂ©e de vie & renouvellement du token (ID360) ==== * **DurĂ©e de validitĂ©** : 15 minutes * **Renouvellement automatique** : Ă  chaque appel API utilisant ce token * **Exception** : L’appel `/user/login/` ne renouvelle **pas** la durĂ©e * **Erreur en cas d’expiration** : HTTP 401 Unauthorized **🔄 Pour prolonger la validitĂ© du token (sans gĂ©nĂ©rer un nouveau token) :** GET /api/1.0.0/user/whoami Authorization: Token 0123456789abcdef01234567 * **FrĂ©quence recommandĂ©e** : toutes les 13 minutes * **RĂ©ponse attendue** : HTTP 200 si le token est toujours valide ---- ==== ✅ Tableau de correspondance : Authentification ==== ^ Fonction ^ ShootID ^ ID360 ^ | MĂ©thode | HTTP Basic Auth | Login avec username/password → Token | | Endpoint | N/A (inclus dans chaque appel) | POST /user/login/ | | Format d’authentification | Authorization: Basic ... | Authorization: Token | | ValiditĂ© du token | Long terme (pas d’expiration) | expirĂ© au delĂ  de 15 min d'inactivitĂ© | | Prolongation du token | N/A | GET /user/whoami recommandĂ© toutes les 13 min | ---- ===== đŸ§© ÉTAPE 2 – INITIALISER UNE TRANSACTION / DÉMARRER UN PARCOURS ===== ==== đŸ”č ShootID ==== * **MĂ©thode** : `GET` * **URL** : `https://www.contralia.fr/shootid/api/v2/init` * **RĂ©ponse** : { "transactionId": "2c95841e45404f7e0145405da33f0009", "qrCode": "https://www.contralia.fr/shootid/api/v2/picture?pictureId=2c95841e45404f7e0145405" } ---- ==== 🔾 ID360 ==== * **MĂ©thode** : `POST` * **URL PROD** : `https://id360docaposte.com/api/1.0.0/process/{UUID}/enrollment` * **URL PREPROD** : `https://preprod.id360docaposte.com/api/1.0.0/process/{UUID}/enrollment` * **RequĂȘte (cURL)** : curl -X POST \ "https://id360docaposte.com/api/1.0.0/process/{UUID}/enrollment" \ -H "accept: application/json" \ -H "Authorization: Token 0123456789abcdef01234567" \ -d '{ "callback_url": "https://www.example.com/callback_url", "browser_callback_url": "https://www.example.com/browser_callback_url", "client_reference": "any_string", "callback_headers": { "header_name_1": "header_value_1", "header_name_2": "header_value_2" }, "last_name": "Users last name", "first_name": "Users first name", "email": "Users email", "address_line_1": "Users address line 1", "address_line_2": "Users address line 2", "address_line_3": "Users address line 3", "zip_code": "Users zip code", "city": "Users city", "country": "Users country", "phone_number": "Users phone number" }' === đŸ§Ÿ PrĂ©cisions sur les paramĂštres === * Dans l'url, l'UUID correspond Ă  l'ID du parcours * `callback_url` (**obligatoire**) : URL backend qui recevra en POST le **rĂ©sultat complet** du parcours ID360 * `browser_callback_url` (**obligatoire**) : URL vers laquelle l’utilisateur est **redirigĂ© cĂŽtĂ© navigateur** * `callback_headers` : headers personnalisĂ©s pour l’appel vers votre backend (auth, identifiant, etc.) * `client_reference` : identifiant de dossier interne Ă  votre SI (pour faire le lien avec vos donnĂ©es) * Champs utilisateurs (`last_name`, `email`, etc.) : purement **informatifs**, non utilisĂ©s pour des contrĂŽles * `email` : obligatoire uniquement si parcours PVID ---- ==== ✅ Tableau de correspondance : Initialisation de parcours ==== ^ Fonction ^ **ShootID** ^ **ID360** ^ | Type d’appel | `GET /api/v2/init` | `POST /api/1.0.0/process/{id}/enrollment` | | Retour | `transactionId`, `qrCode` | `id` (dossier), `url`, `api_key`, `status` | | ParamĂ©trage du parcours | Implicite | Explicite via `{id}` du process configurĂ© dans l’IHM | | Callback technique | N\A | `callback_url` (backend) + `browser_callback_url` (front) | | Suivi personnalisĂ© | Non | `client_reference` possible | | Authentification | Via Basic dans chaque appel | Via token (`Authorization: Token ...`) | ===== 🔀 ÉTAPE 2B – CHOIX & SÉLECTION DE LA ROUTE (ID360) ===== === 🧭 Pourquoi cette Ă©tape est nĂ©cessaire === Dans certains parcours ID360, **plusieurs mĂ©thodes d’identification** peuvent ĂȘtre proposĂ©es Ă  l’utilisateur final, telles que : * L’identification via **l’IdentitĂ© NumĂ©rique de La Poste** * L’identification via un **Parcours en Ligne Personnalisable de Docaposte** 👉 **Dans le cadre du prĂ©sent parcours**, **seul le canal du Parcours Personnalisable Docaposte est utilisĂ©**, ce qui implique que la plateforme ID360 **demande explicitement Ă  l’intĂ©grateur de sĂ©lectionner cette route** parmi les options disponibles. 🔐 Cette sĂ©lection garantit que l’utilisateur suivra **le bon scĂ©nario d’identification**, sans ambiguĂŻtĂ©, en accord avec le paramĂ©trage mĂ©tier prĂ©vu dans la console d’administration. ---- === 🎯 Objectif === Associer une **route spĂ©cifique** Ă  un **dossier utilisateur (enrollment)** via son `api_key`, afin de **verrouiller le mode d’identification** Ă  suivre. ---- === 1. đŸ“„ RĂ©cupĂ©ration de la liste des routes === * **Endpoint** : `GET /api/1.0.0/enrollment/flow/enrollment_info/` **PrĂ©prod :** curl -X 'GET' \ 'https://preprod.id360docaposte.com/api/1.0.0/enrollment/flow/enrollment_info/' \ -H 'accept: application/json' \ -H 'x-api-key: {API_KEY_DOSSIER}' **Prod :** curl -X 'GET' \ 'https://id360docaposte.com/api/1.0.0/enrollment/flow/enrollment_info/' \ -H 'accept: application/json' \ -H 'x-api-key: {API_KEY_DOSSIER}' **RĂ©ponse (extrait)** : { "routes": [ { "id": 275128 } ] } > Le champ `routes[0].id` contient l’identifiant de la route Ă  utiliser. ---- === 2. ✅ SĂ©lection de la route === * **Endpoint** : `POST /api/1.0.0/enrollment/flow/route/{route_id}/select/` **PrĂ©prod :** curl -X 'POST' \ 'https://preprod.id360docaposte.com/api/1.0.0/enrollment/flow/route/{route_id}/select/' \ -H 'accept: application/json' \ -H 'x-api-key: {API_KEY_DOSSIER}' \ -H 'Content-Type: text/plain' **Prod :** curl -X 'POST' \ 'https://id360docaposte.com/api/1.0.0/enrollment/flow/route/{route_id}/select/' \ -H 'accept: application/json' \ -H 'x-api-key: {API_KEY_DOSSIER}' \ -H 'Content-Type: text/plain' **RĂ©ponse attendue** : HTTP 204 No Content ---- === 📝 Remarques clĂ©s === * La **clĂ© API du dossier (`api_key`)** est obtenue via l’appel `POST /process/{id}/enrollment` * Le choix de la route est **obligatoire** dans les parcours multi-canal * La route sĂ©lectionnĂ©e est ensuite **associĂ©e dĂ©finitivement** Ă  ce dossier * Cette action doit ĂȘtre effectuĂ©e **avant tout envoi de documents ou d’infos utilisateur** ---- ===== đŸȘȘ ÉTAPE 3 – AJOUTER UN DOCUMENT D’IDENTITÉ ===== ==== đŸ”č ShootID ==== * **MĂ©thode** : `POST` * **URL** : `https://www.contralia.fr/shootid/api/v2/add` * **Type** : `multipart/form-data` * **Champs principaux** : * `transactionId` (string) – identifiant de la transaction (**obligatoire**) * `file` (fichier) – image Ă  uploader (**obligatoire**) * `type` (enum string) – type de document gĂ©rĂ© : `Enum : IDENTITY`. (**obligatoire**) * `documentId` (integer) – identifiant du document (**obligatoire**) * **Options avancĂ©es** : page, gĂ©olocalisation, scanProvider, OCR/MRZ, traitement image * **RĂ©ponse exemple** : { "transactionId": "2c95841e45404f7e0145405da33f0009", "qrCode": "https://www.contralia.fr/shootid/api/v2/picture?pictureId=2c95841e45404f7e0145405da35c000a", "documents": [{ "status": "READY_TO_BE_SCANNED", "declaredType": "IDENTITY", "documentId": 0 }] } ---- ==== 🔾 ID360 ==== * **MĂ©thode** : `POST` * **URL** : https://preprod.id360docaposte.com/api/1.0.0/enrollment/flow/document/id_document_image/?total_pages=2&uploaded_page=0 * **Type** : `application/octet-stream` * **Authentification** : `x-api-key` (obtenue lors de l’enrollment) * **Payload** : binaire pur (pas de form-data) === ➀ cURL (prĂ©prod) === curl -X 'POST' \ 'https://preprod.id360docaposte.com/api/1.0.0/enrollment/flow/document/id_document_image/?total_pages=2&uploaded_page=0' \ -H 'accept: */*' \ -H 'x-api-key: {API_KEY_DOSSIER}' \ -H 'Content-Type: application/octet-stream' \ --data-binary '@CNIRecto.PNG' === ➀ ParamĂštres dans l’URL === ^ ParamĂštre ^ Description ^ | `total_pages` | Nombre total de pages Ă  uploader pour le document (ex : `2` pour CNI recto/verso) | | `uploaded_page` | Index de la page envoyĂ©e (commence Ă  `0`) | ---- ==== ✅ Tableau de correspondance – Upload Document ==== ^ ÉlĂ©ment ^ **ShootID** ^ **ID360** ^ | Endpoint | `POST /api/v2/add` | `POST /enrollment/flow/document/id_document_image/` | | Authentification | `Authorization: Basic` + `transactionId` | `x-api-key` | | Format d’envoi | `multipart/form-data` | `application/octet-stream` (binaire pur) | | ParamĂštres document | `type`, `documentId`, `page`, etc. | `total_pages`, `uploaded_page` dans l’URL | | Champ du fichier | `file` | contenu brut via `--data-binary` | | RĂ©ponse | JSON avec `status`, `documentId`, etc. | RĂ©ponse non dĂ©taillĂ©e (succĂšs silencieux) ou `204` attendu | | Traitements optionnels | Oui (binarisation, OCR, cropping, etc.) | GĂ©rĂ©s en amont dans le paramĂ©trage du parcours | | Type de document gĂ©rĂ© | Enum : `IDENTITY`, `RIB`, `CHECK`, `CAR_REGISTRATION`, etc. | Fixe : `id_document_image` (pour cette Ă©tape spĂ©cifique) | ---- ===== 📄 ÉTAPE 4 – AJOUT D’AUTRES DOCUMENTS (RIB, justificatif de domicile, etc.) ===== Dans certains parcours ID360, notamment ceux nĂ©cessitant la **constitution du bloc adresse** ou de l’**identitĂ© bancaire**, il est indispensable d’ajouter d'autres documents **en plus** de la piĂšce d’identitĂ© : * 📄 **Justificatif de domicile** (facture, quittance, etc.) * 🏩 **RIB** (relevĂ© d'identitĂ© bancaire) ---- ==== đŸ”č ShootID ==== * **Endpoint** : `POST /shootid/api/v2/add` * **Champs obligatoires** : * `transactionId` * `file` * `type` → `ADDRESS_BLOCK` (justificatif) ou `RIB` * **Champs optionnels** : `documentId`, `page`, `scanProvider`, `processCropping`, etc. * **RĂ©ponse** : confirmation + status `READY_TO_BE_SCANNED` ---- ==== 🔾 ID360 ==== === 🏩 1. Upload du RIB === * **Endpoint** : POST /api/1.0.0/enrollment/flow/document/bank_details_image/ * **Exemple cURL** : curl -X 'POST' \ 'https://preprod.id360docaposte.com/api/1.0.0/enrollment/flow/document/bank_details_image/' \ -H 'accept: */*' \ -H 'x-api-key: {API_KEY_DOSSIER}' \ -H 'Content-Type: application/octet-stream' \ --data-binary '@rib.jpg' → Ce document alimente le **bloc bancaire** (IBAN, titulaire du compte). ---- === 🏠 2. Upload du justificatif de domicile === * **Endpoint** : POST /api/1.0.0/enrollment/flow/document/proof_of_address_image/ * **Exemple cURL** : curl -X 'POST' \ 'https://preprod.id360docaposte.com/api/1.0.0/enrollment/flow/document/proof_of_address_image/' \ -H 'accept: */*' \ -H 'x-api-key: {API_KEY_DOSSIER}' \ -H 'Content-Type: application/octet-stream' \ --data-binary '@facture_edf.pdf' → Ce document est utilisĂ© pour alimenter le **bloc adresse**, qui peut ĂȘtre recoupĂ© avec la piĂšce d’identitĂ©. ---- ==== ✅ RĂ©sumĂ© des endpoints documentaires ID360 ==== ^ Type de document ^ Endpoint ID360 ^ | PiĂšce d'identitĂ© | `/enrollment/flow/document/id_document_image/` | | Justificatif de domicile | `/enrollment/flow/document/proof_of_address_image/` | | RIB | `/enrollment/flow/document/bank_details_image/` | ---- ===== đŸ“„ ÉTAPE 5 – RECUPERATION DU RESULTAT FINAL ===== ==== đŸ”č ShootID ==== * **MĂ©thode** : `GET` * **URL** : `https://www.contralia.fr/shootid/api/v2/result` * **ParamĂštres** : * `transactionId` (obligatoire) * `documentId` (optionnel) * `scanTimeout` (optionnel) === Exemple de rĂ©ponse === * Statut du scan : `OK`, `KO`, `PROVIDER_COULD_NOT_PROCESS_ERROR` * RĂ©sultats de validation : MRZ, intĂ©gritĂ©... * DonnĂ©es OCR : nom, prĂ©nom, date de naissance, sexe, numĂ©ro... * Images gĂ©nĂ©rĂ©es : `imagePhoto`, `image1Cut`, `image2Cut`, `imageSignature` * CritĂšres de fraude : `fraudScanTimesCriteria`, `fraudPeriodCriteria` ==== 🔾 ID360 ==== === RequĂȘte de rĂ©cupĂ©ration du rapport === * **MĂ©thode** : `GET` * **URL PROD** : `https://id360docaposte.com/api/1.0.0/enrollment/{id}/report` * **URL PRÉPROD** : `https://preprod.id360docaposte.com/api/1.0.0/enrollment/{id}/report` * **Authentification** : `Authorization: Token {votre_token}` === Exemple de requĂȘte CURL === curl -X GET \ "https://preprod.id360docaposte.com/api/1.0.0/enrollment/{id}/report" \ -H "accept: application/json" \ -H "Authorization: Token 0123456789abcdef01234567" * **Dans l'url {id}** : correspond Ă  l'id du dossier * **ParamĂštres** : aucun * **RĂ©sultat** : Code HTTP 200 + rĂ©ponse JSON * **Appel Ă  effectuer uniquement cĂŽtĂ© serveur** === Exemple de rĂ©ponse === { "status": "OK", "id": 215416, "identity": { "name": "SPECIMEN ABB", "first_name": "NATACHA", "birth_date": "1973-07-12", "gender": "F", "birth_place": "TOULON", "nationality": "FRA", "extra": { "id_number": "90RF02331", "expiration_date": "2029-03-03", "issuer": "PrĂ©fecture du Sud", "address": "102 RUE PRINCIPALE 34700 LODÈVE FRANCE" } }, "extracted_data": { "proof_of_address": [ { "full_name": "MME SPECIMEN NATACHA", "address_1": "205 route des lylas", "address_2": "BT LES OLIVIERS", "zip_code": "06000", "city": "Nice", "date": "2022-04-06" } ], "bank_details": [ { "iban": "FR7630006000011234567890189", "bic": "CEPAFRPP831", "full_name": "MLE NATACHA SPECIMEN" } ] } } ==== ⚠ Attention : ne pas appeler le rapport immĂ©diatement ==== **→ Attendez toujours la rĂ©ception de la *callback finale* sur votre `callback_url` avant d'appeler la mĂ©thode report.** * Cette callback vous informe que le traitement est terminĂ©. * Une fois reçue, vous pouvez alors appeler `/enrollment/{id}/report`. * Voir le guide des callbacks [[guide_callback|ici]] ==== Comparatif ShootID / ID360 ==== ^ Fonction ^ ShootID ^ ID360 ^ | Endpoint | `GET /result` | `GET /enrollment/{id}/report` | | Authentification | Basic Auth | `Authorization: Token ...` | | Moment d’appel | AprĂšs upload des docs | **AprĂšs rĂ©ception de la callback finale** | | Structure de rĂ©ponse | Par document (`documents[]`) | Par bloc (`blocks.identity`, `blocks.address`, etc.) | | RĂ©sultats techniques | DĂ©tail MRZ / OCR | AgrĂ©gĂ©s selon configuration du parcours | ----