[[: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 |
----