ID Mobile — Données utilisateur avec consentement

Support DQE
Support DQE
  • Mise à jour
API ID Mobile — Formfilling

Utilisez cet endpoint pour récupérer les informations utilisateur (nom, date de naissance, email, adresse postale) enregistrées auprès de l'opérateur, avec le consentement de l'utilisateur. Le processus comporte deux étapes : initier la demande de consentement, puis récupérer les données.

Flux en deux étapes - Appelez d'abord /IDMOBILE/ pour demander le consentement de l'utilisateur et obtenir l'URL de la page de consentement de l'opérateur. Une fois le consentement donné, appelez /GET/ pour récupérer les données de l'utilisateur.

Documentation ID Mobile associée :

Étape 1 sur 2 — Demander le consentement

Initiez la demande de consentement et obtenez l'URL de la page de consentement de l'opérateur.

Étape 1 — Initier la demande de consentement

Requête

GET et POST sont toutes deux prises en charge.

{SERVER_ADDRESS} et {LICENCE_CODE} sont fournis par DQE à la création de votre compte. Contactez votre chargé de compte DQE pour obtenir ces identifiants.
GEThttps://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}

Exemples de code

Demander le consentement pour récupérer les données utilisateur

curl "https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/?" + new URLSearchParams({ number: "{NUM}", token: "{TOKEN}", mode: "{MODE}", name: "{NAME}", code_name: "{CODE_NAME}", licence: "{LICENCE_CODE}", scope: "formfilling", redirect_uri: "{URL_REDIRECT}" })) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.get( "https://{SERVER_ADDRESS}/IDMOBILE/", params={ "number": "{NUM}", "token": "{TOKEN}", "mode": "{MODE}", "name": "{NAME}", "code_name": "{CODE_NAME}", "licence": "{LICENCE_CODE}", "scope": "formfilling", "redirect_uri": "{URL_REDIRECT}", }, ) print(response.json())
<?php $params = http_build_query([ 'number' => '{NUM}', 'token' => '{TOKEN}', 'mode' => '{MODE}', 'name' => '{NAME}', 'code_name' => '{CODE_NAME}', 'licence' => '{LICENCE_CODE}', 'scope' => 'formfilling', 'redirect_uri' => '{URL_REDIRECT}', ]); $ch = curl_init("https://{SERVER_ADDRESS}/IDMOBILE/?{$params}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); axios.get('https://{SERVER_ADDRESS}/IDMOBILE/', { params: { number: '{NUM}', token: '{TOKEN}', mode: '{MODE}', name: '{NAME}', code_name: '{CODE_NAME}', licence: '{LICENCE_CODE}', scope: 'formfilling', redirect_uri: '{URL_REDIRECT}' } }) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String url = "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var url = "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}"; var response = await client.GetAsync(url); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" ) func main() { url := "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}" resp, err := http.Get(url) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }
POSThttps://{SERVER_ADDRESS}/IDMOBILE/

Ajoutez les paramètres suivants dans le corps de la requête au format x-www-form-urlencoded.

Exemples de code

Demander le consentement pour récupérer les données utilisateur

curl -X POST "https://{SERVER_ADDRESS}/IDMOBILE/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "licence={LICENCE_CODE}" \ -d "number={NUM}" \ -d "token={TOKEN}" \ -d "mode={MODE}" \ -d "name={NAME}" \ -d "code_name={CODE_NAME}" \ -d "scope=formfilling" \ -d "redirect_uri={URL_REDIRECT}"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ licence: "{LICENCE_CODE}", number: "{NUM}", token: "{TOKEN}", mode: "{MODE}", name: "{NAME}", code_name: "{CODE_NAME}", scope: "formfilling", redirect_uri: "{URL_REDIRECT}" }) }) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.post( "https://{SERVER_ADDRESS}/IDMOBILE/", data={ "licence": "{LICENCE_CODE}", "number": "{NUM}", "token": "{TOKEN}", "mode": "{MODE}", "name": "{NAME}", "code_name": "{CODE_NAME}", "scope": "formfilling", "redirect_uri": "{URL_REDIRECT}", }, ) print(response.json())
<?php $ch = curl_init("https://{SERVER_ADDRESS}/IDMOBILE/"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'licence' => '{LICENCE_CODE}', 'number' => '{NUM}', 'token' => '{TOKEN}', 'mode' => '{MODE}', 'name' => '{NAME}', 'code_name' => '{CODE_NAME}', 'scope' => 'formfilling', 'redirect_uri' => '{URL_REDIRECT}', ])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); const qs = require('querystring'); axios.post('https://{SERVER_ADDRESS}/IDMOBILE/', qs.stringify({ licence: '{LICENCE_CODE}', number: '{NUM}', token: '{TOKEN}', mode: '{MODE}', name: '{NAME}', code_name: '{CODE_NAME}', scope: 'formfilling', redirect_uri: '{URL_REDIRECT}' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "licence={LICENCE_CODE}&number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&scope=formfilling&redirect_uri={URL_REDIRECT}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{SERVER_ADDRESS}/IDMOBILE/")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(form)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var form = new Dictionary<string, string> { ["licence"] = "{LICENCE_CODE}", ["number"] = "{NUM}", ["token"] = "{TOKEN}", ["mode"] = "{MODE}", ["name"] = "{NAME}", ["code_name"] = "{CODE_NAME}", ["scope"] = "formfilling", ["redirect_uri"] = "{URL_REDIRECT}" }; var response = await client.PostAsync( "https://{SERVER_ADDRESS}/IDMOBILE/", new FormUrlEncodedContent(form)); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" "net/url" ) func main() { form := url.Values{} form.Set("licence", "{LICENCE_CODE}") form.Set("number", "{NUM}") form.Set("token", "{TOKEN}") form.Set("mode", "{MODE}") form.Set("name", "{NAME}") form.Set("code_name", "{CODE_NAME}") form.Set("scope", "formfilling") form.Set("redirect_uri", "{URL_REDIRECT}") resp, err := http.PostForm("https://{SERVER_ADDRESS}/IDMOBILE/", form) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }

Paramètres

Paramètre Description Obl / Opt
SERVER_ADDRESS Adresse du serveur DQE qui traitera les données. Obligatoire
licence Numéro qui vous est attribué comme code de licence. Obligatoire
number Numéro de téléphone. Obligatoire
token Jeton obtenu via l'authentification. Obligatoire
mode 2 : authentification par code.
Fixed value: 2
Obligatoire
name Nom du partenaire dans la base de données DQE Software, généralement le nom de votre entreprise. Obligatoire
code_name Champ optionnel contenant un code associé à name. Optionnel
scope Static value. Must be formfilling for this scope.
Fixed value: formfilling
Obligatoire
redirect_uri URL de redirection. DQE ajoute le jeton de session et le statut à la redirection. Optionnel
Combinaison de scopes — formfilling peut être combiné avec billing (tous deux basés sur le consentement) dans une même requête, par exemple scope=formfilling,billing, et avec info (intelligence sur le numéro de téléphone) dans n'importe quelle combinaison, par exemple scope=formfilling,info. Voir les champs info ci-dessous. Contactez votre chargé de compte DQE pour la forme complète de la réponse combinée formfilling+billing.

Champs additionnels info — renvoyés en plus des champs propres à cet endpoint lorsque info est inclus dans scope :

Champ Description Exemple
telorigine Numéro de téléphone de la requête. 0600000000
tel Numéro de téléphone, formaté. +33600000000
geolocation Situation géographique du numéro de téléphone. FRANCE
operator Opérateur actuel du numéro de téléphone, si souscrit. ORANGE
oldoperator Opérateur précédent du numéro de téléphone. SFR
ported Indique si le numéro de téléphone a été porté, si souscrit. Y
type Type du numéro de téléphone. MOBILE
iderror Code d'erreur de la vérification (0 ou 1). 1

Réponse

Si la requête aboutit, l'API retourne un objet JSON contenant les clés suivantes.

Clé Description Type
status success STRING
operator Opérateur. STRING
url URL de l'API de l'opérateur. STRING

Exemple de réponse

Demande de consentement réussie
{ "status": "success", "operator": "Orange", "url": "https://api.operator/openidconnect/fr" }

Erreurs

ID d'erreur Type d'erreur Description
01 invalid request La requête n'est pas valide.
02 invalid licence key La licence n'est pas valide.
04 invalid scope Scope invalide.
05 missing or empty parameter (user_infos) for this scope Un paramètre est manquant pour le scope demandé.
06 bad parameter format (user_infos) is not a valid JSON Le paramètre user_infos n'est pas un JSON valide.
07 missing mandatory key in user informations (phone) La clé phone est obligatoire dans le paramètre user_infos pour cet opérateur.
09 ineligible phone number Le numéro de téléphone n'est pas éligible pour la solution.
10 invalid phone number Le numéro de téléphone n'existe pas.
11 phone number is empty Le numéro de téléphone est vide.
12 phone check failed La vérification auprès de l'opérateur a échoué.
13 operator [Operator Name] not found L'opérateur n'a pas pu être trouvé.
14 operator [Operator Name] not authorized for this licence Votre licence n'est pas autorisée pour cet opérateur.
15 operator [Operator Name] not supported yet La solution n'est pas encore disponible pour cet opérateur.
16 operator [Operator Name] unreachable L'opérateur n'a pas pu être contacté.
17 scope not supported by this operator [Operator Name] yet Ce scope n'est pas pris en charge par l'opérateur.
30 invalid or expired token Le jeton a expiré.

Tester l'API

Cliquez sur le bouton ci-dessous pour tester cet endpoint en direct dans votre navigateur.

Ouvrir la console
Étape 2 sur 2 — Récupérer les données utilisateur

Une fois que l'utilisateur a donné son consentement, récupérez les données retournées par l'opérateur.

Étape 2 — Récupérer les données utilisateur

Requête

GET et POST sont toutes deux prises en charge.

{SERVER_ADDRESS} et {LICENCE_CODE} sont fournis par DQE à la création de votre compte. Contactez votre chargé de compte DQE pour obtenir ces identifiants.
GEThttps://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=formfilling

Exemples de code

Récupérer les données utilisateur une fois le consentement obtenu

curl "https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=formfilling"
fetch("https://{SERVER_ADDRESS}/GET/?" + new URLSearchParams({ token: "{TOKEN}", Licence: "{LICENCE_CODE}", scope: "formfilling" })) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.get( "https://{SERVER_ADDRESS}/GET/", params={ "token": "{TOKEN}", "Licence": "{LICENCE_CODE}", "scope": "formfilling", }, ) print(response.json())
<?php $params = http_build_query([ 'token' => '{TOKEN}', 'Licence' => '{LICENCE_CODE}', 'scope' => 'formfilling', ]); $ch = curl_init("https://{SERVER_ADDRESS}/GET/?{$params}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); axios.get('https://{SERVER_ADDRESS}/GET/', { params: { token: '{TOKEN}', Licence: '{LICENCE_CODE}', scope: 'formfilling' } }) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String url = "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=formfilling"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var url = "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=formfilling"; var response = await client.GetAsync(url); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" ) func main() { url := "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=formfilling" resp, err := http.Get(url) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }
POSThttps://{SERVER_ADDRESS}/GET/

Ajoutez les paramètres suivants dans le corps de la requête au format x-www-form-urlencoded.

Exemples de code

Récupérer les données utilisateur une fois le consentement obtenu

curl -X POST "https://{SERVER_ADDRESS}/GET/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "Licence={LICENCE_CODE}" \ -d "token={TOKEN}" \ -d "scope=formfilling"
fetch("https://{SERVER_ADDRESS}/GET/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ Licence: "{LICENCE_CODE}", token: "{TOKEN}", scope: "formfilling" }) }) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.post( "https://{SERVER_ADDRESS}/GET/", data={ "Licence": "{LICENCE_CODE}", "token": "{TOKEN}", "scope": "formfilling", }, ) print(response.json())
<?php $ch = curl_init("https://{SERVER_ADDRESS}/GET/"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'Licence' => '{LICENCE_CODE}', 'token' => '{TOKEN}', 'scope' => 'formfilling', ])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); const qs = require('querystring'); axios.post('https://{SERVER_ADDRESS}/GET/', qs.stringify({ Licence: '{LICENCE_CODE}', token: '{TOKEN}', scope: 'formfilling' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "Licence={LICENCE_CODE}&token={TOKEN}&scope=formfilling"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{SERVER_ADDRESS}/GET/")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(form)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var form = new Dictionary<string, string> { ["Licence"] = "{LICENCE_CODE}", ["token"] = "{TOKEN}", ["scope"] = "formfilling" }; var response = await client.PostAsync( "https://{SERVER_ADDRESS}/GET/", new FormUrlEncodedContent(form)); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" "net/url" ) func main() { form := url.Values{} form.Set("Licence", "{LICENCE_CODE}") form.Set("token", "{TOKEN}") form.Set("scope", "formfilling") resp, err := http.PostForm("https://{SERVER_ADDRESS}/GET/", form) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }

Paramètres

Paramètre Description Obl / Opt
SERVER_ADDRESS Adresse du serveur DQE qui traitera les données. Obligatoire
Licence Numéro qui vous est attribué comme code de licence. Obligatoire
token Jeton obtenu via l'authentification. Obligatoire
scope Static value. Must be formfilling for this scope.
Fixed value: formfilling
Obligatoire

Réponse

L'API retourne un objet JSON contenant les clés suivantes :

Clé Description Type
status success : les informations ont été récupérées avec succès. STRING
scope Contient le scope envoyé précédemment. STRING
code_name Contient le code name envoyé précédemment. STRING
formfilling Objet contenant les données utilisateur récupérées. Voir le tableau des clés ci-dessous. JSON OBJECT

Clés de l'objet formfilling

Clé Description Type
phone_number Numéro de téléphone. STRING(10)
family_name Nom de famille. STRING
name Prénom et nom. STRING
locale Langue maternelle. STRING(3)
gender Genre : M pour masculin, F pour féminin. STRING
updated_at Date de la dernière mise à jour des informations. DATE
birthdate Date de naissance. DATE
birthplace Département de naissance. STRING
given_name Prénom. STRING
address Objet adresse postale. Clés : country, postal_code, formatted, street_address, number, locality. JSON OBJECT
email Adresse email complète. STRING
email_domain Domaine de l'email. STRING
email_account Nom d'utilisateur de l'email. STRING
subscriber_msisdn Numéro de téléphone utilisé pour la souscription du contrat. STRING(10)
sub Identifiant client dans la base de données de l'opérateur. STRING

En attente

Clé Description Type
status pending : DQE attend la réponse de l'opérateur. STRING
scope Contient formfilling. STRING

Exemple de réponse

Récupération réussie
{ "status": "success", "scope": "formfilling", "code_name": "", "formfilling": { "phone_number": "", "family_name": "", "name": " -", "locale": "fr-FR", "gender": "M", "email_domain": ".com", "updated_at": "-08-09", "birthdate": "-08-30", "birthplace": "-08-30", "given_name": "", "address": { "locality": "", "country": "", "number": "", "formatted": "", "postal_code": "", "street_address": "" }, "email_account": "", "email": "", "subscriber_msisdn": "", "sub": "" } }
Pending — waiting for the operator
{ "status": "pending", "scope": "formfilling" }
Error
{ "status": "error", "error_type": "internal server error", "error_id": "99" }

Erreurs

ID d'erreur Type d'erreur Description
01 invalid request La requête n'est pas valide.
02 invalid licence key La licence n'est pas valide.
04 invalid scope Scope invalide.
18 failed to retrieve data from operator Aucune donnée n'a été reçue après la validation de l'OTP.
20 OTP incorrect La validation de l'OTP n'a pas été terminée.
21 access denied La validation de l'OTP a été refusée.
30 invalid or expired token Le jeton a expiré.
99 internal server error Erreur serveur.

Tester l'API

Cliquez sur le bouton ci-dessous pour tester cet endpoint en direct dans votre navigateur.

Ouvrir la console

Voir aussi

Cet article vous a-t-il été utile ?

Utilisateurs qui ont trouvé cela utile : 0 sur 0