ID Mobile — Recuperar documentos de facturación con consentimiento

Support DQE
Support DQE
  • Actualización
ID Mobile API — Billing

Utilice este endpoint para recuperar un justificante de facturación o un comprobante de domicilio del operador, con el consentimiento del usuario. El proceso consta de dos pasos: iniciar la solicitud de consentimiento y, después, recuperar el documento.

Flujo en dos pasos - Primero llame a /IDMOBILE/ para solicitar el consentimiento del usuario y obtener la URL de la página de consentimiento del operador. Una vez completado el consentimiento, llame a /GET/ para recuperar el documento de facturación.

Documentación relacionada de ID Mobile:

Paso 1 de 2 — Solicitar consentimiento

Inicie la solicitud de consentimiento y obtenga la URL de la página de consentimiento del operador.

Paso 1 — Iniciar la solicitud de consentimiento

Solicitud

Se admiten tanto GET como POST.

{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. Póngase en contacto con su gestor de cuenta de DQE para obtenerlos.
GEThttps://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=billing&redirect_uri={URL_REDIRECT}

Ejemplos de código

Solicitar el consentimiento para recuperar el documento de facturación

curl "https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=billing&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: "billing", 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": "billing", "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' => 'billing', '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: 'billing', 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=billing&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=billing&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=billing&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/

Añada los siguientes parámetros en el cuerpo de la solicitud usando x-www-form-urlencoded.

Ejemplos de código

Solicitar el consentimiento para recuperar el documento de facturación

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=billing" \ -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: "billing", 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": "billing", "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' => 'billing', '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: 'billing', 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=billing&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"] = "billing", ["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", "billing") 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)) }

Parámetros

Parámetro Descripción Obl / Opc
SERVER_ADDRESS Dirección del servidor DQE que procesará los datos. Obligatorio
licence Número asignado como su código de licencia. Obligatorio
number Número de teléfono. Obligatorio
token Token obtenido mediante la autenticación. Obligatorio
mode 2: autenticación por código.
Fixed value: 2
Obligatorio
name Nombre del partner en la base de datos de DQE Software, normalmente el nombre de su empresa. Obligatorio
code_name Campo opcional que contiene un código asociado a name. Opcional
scope Static value. Must be billing for this scope.
Fixed value: billing
Obligatorio
redirect_uri URL de redirección. DQE añade el token de sesión y el estado a la redirección. Opcional
Combinación de scopes — billing se puede combinar con formfilling (ambos basados en consentimiento) en una sola solicitud, p. ej. scope=billing,formfilling, y con info (información del número de teléfono) en cualquier combinación, p. ej. scope=billing,info. Consulte los campos de info a continuación. Póngase en contacto con su gestor de cuenta de DQE para conocer la estructura completa de la respuesta combinada de billing+formfilling.

Campos adicionales de info — se devuelven además de los campos propios de este endpoint cuando info se incluye en scope:

Campo Descripción Ejemplo
telorigine Número de teléfono en la solicitud. 0600000000
tel Número de teléfono, formateado. +33600000000
geolocation Situación geográfica del número de teléfono. FRANCE
operator Operador actual del número de teléfono, si está suscrito. ORANGE
oldoperator Operador anterior del número de teléfono. SFR
ported Indica si el número de teléfono ha sido portado, si está suscrito. Y
type Tipo de número de teléfono. MOBILE
iderror Código de error de la verificación (0 o 1). 1

Respuesta

Si la solicitud se realiza correctamente, la API devuelve un objeto JSON con las siguientes claves.

Clave Descripción Tipo
status success: la información se recuperó correctamente. STRING
scope billing STRING
billing Comprobante de domicilio codificado en Base64. STRING

Pending

Clave Descripción Tipo
status pending: DQE está esperando la respuesta del operador. STRING
scope billing STRING

Ejemplo de respuesta

Solicitud de consentimiento correcta
{ "status": "success", "scope": "billing", "billing": "N0YXJ0eHJlZgo0OTg2MQolJUVPRgoKLS1ZS0xJNTYpPUlSeFdNUzEoYXJpOWI/UklzLkRXZ1dwUF9FLS0K" }
Pendiente — esperando al operador
{ "status": "pending", "scope": "billing" }

Errores

ID de error Tipo de error Descripción
01 invalid request La solicitud no es válida.
02 invalid licence key La licencia no es válida.
04 invalid scope Scope no válido.
05 missing or empty parameter (user_infos) for this scope Falta un parámetro para el scope solicitado.
06 bad parameter format (user_infos) is not a valid JSON El parámetro user_infos no es un JSON válido.
07 missing mandatory key in user informations (phone) La clave phone es obligatoria en el parámetro user_infos para este operador.
09 ineligible phone number El número de teléfono no es apto para la solución.
10 invalid phone number El número de teléfono no existe.
11 phone number is empty El número de teléfono está vacío.
12 phone check failed La verificación del operador falló.
13 operator [Operator Name] not found No se pudo encontrar el operador.
14 operator [Operator Name] not authorized for this licence Su licencia no está autorizada para este operador.
15 operator [Operator Name] not supported yet La solución aún no está disponible para este operador.
16 operator [Operator Name] unreachable No se pudo contactar con el operador.
17 scope not supported by this operator [Operator Name] yet Este scope no es compatible con el operador.
30 invalid or expired token El token ha expirado.

Probar la API

Haga clic en el botón de abajo para probar este endpoint en directo desde su navegador.

Abrir consola
Paso 2 de 2 — Recuperar el documento de facturación

Una vez que el usuario haya dado su consentimiento, recupere el documento de facturación devuelto por el operador.

Paso 2 — Recuperar el documento de facturación

Solicitud

Se admiten tanto GET como POST.

{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. Póngase en contacto con su gestor de cuenta de DQE para obtenerlos.
GEThttps://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=billing

Ejemplos de código

Recuperar el documento de facturación una vez completado el consentimiento

curl "https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=billing"
fetch("https://{SERVER_ADDRESS}/GET/?" + new URLSearchParams({ token: "{TOKEN}", Licence: "{LICENCE_CODE}", scope: "billing" })) .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": "billing", }, ) print(response.json())
<?php $params = http_build_query([ 'token' => '{TOKEN}', 'Licence' => '{LICENCE_CODE}', 'scope' => 'billing', ]); $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: 'billing' } }) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String url = "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=billing"; 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=billing"; 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=billing" 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/

Añada los siguientes parámetros en el cuerpo de la solicitud usando x-www-form-urlencoded.

Ejemplos de código

Recuperar el documento de facturación una vez completado el consentimiento

curl -X POST "https://{SERVER_ADDRESS}/GET/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "Licence={LICENCE_CODE}" \ -d "token={TOKEN}" \ -d "scope=billing"
fetch("https://{SERVER_ADDRESS}/GET/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ Licence: "{LICENCE_CODE}", token: "{TOKEN}", scope: "billing" }) }) .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": "billing", }, ) 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' => 'billing', ])); 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: 'billing' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "Licence={LICENCE_CODE}&token={TOKEN}&scope=billing"; 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"] = "billing" }; 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", "billing") 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)) }

Parámetros

Parámetro Descripción Obl / Opc
SERVER_ADDRESS Dirección del servidor DQE que procesará los datos. Obligatorio
Licence Número asignado como su código de licencia. Obligatorio
token Token obtenido mediante la autenticación. Obligatorio
scope Static value. Must be billing for this scope.
Fixed value: billing
Obligatorio

Respuesta

The API returns a JSON object containing the following keys:

Clave Descripción Tipo
status success: el documento se recuperó correctamente. STRING
scope billing STRING
billing Comprobante de domicilio codificado en Base64. STRING

Pending

Clave Descripción Tipo
status pending: DQE está esperando la respuesta del operador. STRING
scope billing STRING

Ejemplo de respuesta

Recuperación correcta
{ "status": "success", "scope": "billing", "billing": "N0YXJ0eHJlZgo0OTg2MQolJUVPRgoKLS1ZS0xJNTYpPUlSeFdNUzEoYXJpOWI/UklzLkRXZ1dwUF9FLS0K" }
Error
{ "status": "error", "error_type": "internal server error", "error_id": "99" }

Errores

ID de error Tipo de error Descripción
01 invalid request La solicitud no es válida.
02 invalid licence key La licencia no es válida.
04 invalid scope Scope no válido.
18 failed to retrieve data from operator No se recibieron datos tras la validación del OTP.
20 OTP incorrect La validación del OTP no se completó.
21 access denied La validación del OTP fue rechazada.
30 invalid or expired token El token ha expirado.
99 internal server error Error del servidor.

Probar la API

Haga clic en el botón de abajo para probar este endpoint en directo desde su navegador.

Abrir consola

Ver también

¿Fue útil este artículo?

Usuarios a los que les pareció útil: 0 de 0