NAV
php shell javascript

Introducción

Bienvenido a MailMerge API! podrás utilizar la siguiente API para procesar plantillas hechas en Microsoft Word con combinación de correspondencia utilizando un JSON como fuente de datos.

Consta de 4 simples pasos:

  1. En la plantilla de Word, incrustar los campos combinables, puedes utilizar cualquier nombre de campo, algo que puedas identificar fácilmente su contenido. Puedes repetir el nombre del campo en varias secciones del documento si así se require y se tomará como un solo campo combinable.
  2. Hacer login en nuestra API para que se le proporcione un token que utilizará en todo el proceso, si no cuenta con usuario y contraseña, contacta con tu administrador para que se te asigne un usuario.
  3. Subir a nuestra plataforma la plantilla, como respuesta recibirás un JSON con el listado de campos detectados en el documento.
  4. Enviar un JSON con los campos y sus valores, como respuesta se le descargará el mismo archivo que subiste en el paso 3 con los datos combinados.

¡Tenemos enlaces en Shell, PHP, JavaScript! Puedes ver ejemplos de código en el área oscura a la derecha, y puedes cambiar el lenguaje de programación de los ejemplos con las pestañas en la parte superior derecha.

Autenticación

/api/v1/login

Para loggearse a la plataforma utilice éste endpoint:

$URI = env('MAILMERGE_API', 'https://mailmerge.789.com.mx/api/v1');
$client = new \GuzzleHttp\Client();
$user = array("username" => "admin@789.mx", "password" => "***********");
try {
    $response = $client->request('POST', "{$URI}/login", [
        'headers' => [
            'Content-Type' => 'application/json',
        ],
        'body' => json_encode($user),
    ]);
    $resp = json_decode($response->getBody()->getContents(), true);
    if (isset($resp["access_token"])) {
        //guardar tokens en cookies
    }
    return $resp;
} catch (RequestException $e) {
    $response = $e->getResponse();
    $responseBody = $response ? $response->getBody()->getContents() : null;
    return json_decode($responseBody, true);
}
curl --request POST \
  --url https://mailmerge.789.com.mx/api/v1/login \
  --header 'content-type: application/json' \
  --data '{
    "username": "admin@789.mx",
    "password": "**********"
}'
fetch("https://mailmerge.789.com.mx/api/v1/login", {
  "method": "POST",
  "headers": {
    "content-type": "application/json"
  },
  "body": {
    "username": "admin@789.mx",
    "password": "***********"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});

Asegúrate de reemplazar ************ por su contraseña.

MailMerge API, utiliza tokens del tipo Bearer para los siguientes endpoints, la API va a requerir que se incluya el token en los encabezados como se muestra a continuación.

Authorization: Bearer miaccesstoken

Como respuesta recibirás un JSON con los tokens e información del objeto usuario

{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpiI6MTU5NDMxNzUzMiwianRpIjoiMWNkZWYwMGUtZmNkNi00ZmQ4LTgwMTQtMzQ0NDcyYzI0ZTk3IiwiZXhwIjoxNTk2OTQ1NTMyLCJpZGVudGl0eSI6MSwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MifQ.abMyXsbYjVoWi5DRd_5JYuYtU5JXm-e199Tw0evj5uA",
  "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzzMTc1MzIsIm5iZiI6MTU5NDMxNzUzMiwianRpIjoiMDc0OGFiYWQtZThmYS00OWIzLTg0OTctMjdiMTdiMDRhNjkzIiwiZXhwIjoxNjEwMDg1NTMyLCJpZGVudGl0eSI6MSwidHlwZSI6InJlZnJlc2gifQ.wGbJJokmkxa_FDXvLHiK3q-tRZlCoUma7G0hoj2AAW0",
  "user": {
    "id": 1,
    "fullname": "Administrator",
    "username": "admin@789.mx",
    "created_at": "2020-06-19T04:52:46.772120"
  }
}

El refresh_token te servirá para obtener un nuevo token en caso de que el actual esté expirado o próximo a expirar. Sólo debes llamar el siguiente endpoint https://mailmerge.789.com.mx/api/v1/refresh e incluir en el encabezado Autorization: Bearer miaccesstoken

Cerrar sesión

/api/v1/logout

Si desea cerrar su sesión en la plataforma, puedes utilizar el siguiente endpoint:

https://mailmerge.789.com.mx/api/v1/logout

En el encabezado es requerido el token de acceso Authorization: Bearer miaccesstoken

Carga de plantilla de Microsoft Word

/api/v1/upload

<?php

$client = new http\Client;
$request = new http\Client\Request;

$body = new http\Message\Body;
$body->addForm(array(
  'data' => '14'
), NULL);

$request->setRequestUrl('https://mailmerge.789.com.mx/api/v1/upload');
$request->setRequestMethod('POST');
$request->setBody($body);

$request->setHeaders(array(
  'authorization' => 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1OTIzNjU5ODUsIwMjAtMDYtMTJUMjA6NDI6MjAuNzkxMjIwIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMTJUMjA6NDI6MjAuNzkxMjIwIn19.ovuXMqNqoRvlxFTe5rgbQebYVOHV8LJ9rr9CR6Si_LI'
));

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();
curl --request POST \
  --url https://mailmerge.789.com.mx/api/v1/upload \
  --header 'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1OTIzNjU5ODVudGl0eSI6IjIwMjAtMDYtMTJUMjA6NDI6MjAuNzkxMjIwIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMTJUMjA6NDI6MjAuNzkxMjIwIn19.ovuXMqNqoRvlxFTe5rgbQebYVOHV8LJ9rr9CR6Si_LI' \
  --header 'content-type: multipart/form-data; boundary=---011000010111000001101001' \
  --form file= \
  --form data=14
var form = new FormData();
form.append("file", "");
form.append("data", "14");

fetch("https://mailmerge.789.com.mx/api/v1/upload", {
  "method": "POST",
  "headers": {
    "content-type": "multipart/form-data; boundary=---011000010111000001101001",
    "authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYxNTkyNDQ4Nzg1LCJpZGVudGl0eSI6IjIwMjAtMDYtMTJUMjA6NDI6MjAuNzkxMjIwIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMTJUMjA6NDI6MjAuNzkxMjIwIn19.ovuXMqNqoRvlxFTe5rgbQebYVOHV8LJ9rr9CR6Si_LI"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});

Esta es la respuesta que recibirás

{
  "id": 1,
  "identification": 14,
  "filepath": "templates/uploads/Pagare_PF_789890fddec-35e2-4ba5-b7cf-5b5a8b0e7d72.docx",
  "created_at": "2020-06-22T18:30:12.914718",
  "fields": [
    "nombre_aval",
    "fecha_termina",
    "fecha_contrato",
    "fecha_inicia",
    "porcentaje_moratorio_letra",
    "nombre_cliente",
    "monto_pagare_letra",
    "monto_pagare",
    "porcentaje_moratorio",
    "plazo"
  ]
}

Este endpoint carga un archivo tipo Microsoft Word que sirve como plantilla con los campos combinables incrustados a lo largo del documento.

HTTP Request

POST https://mailmerge.789.com.mx/api/v1/upload

Parámetros

Parameter Requerido Description
file Si Aquí va el documento en formato de Microsoft Word.
data Si Ésta es la referencia del archivo, éste ID es el número registrado en tu base de datos para referenciar el documento que estas procesando. En la respuesta viene como "identification"

Obtener los campos de un archivo previamente subido

/api/v1/document/{refid}

<?php

$client = new http\Client;
$request = new http\Client\Request;

$request->setRequestUrl('https://mailmerge.789.com.mx/api/v1/document/14');
$request->setRequestMethod('GET');
$request->setHeaders(array(
  'authorization' => 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOj1MTUzNDAyLCJpZGVudGl0eSI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIn19.7rlCm1FCthSqv2hIDaIe-DrC8SZmO51vtQvY9-vgbfY'
));

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();
curl --request GET \
  --url https://mailmerge.789.com.mx/api/v1/document/14 \
  --header 'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODAyLCJpZGVudGl0eSI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIn19.7rlCm1FCthSqv2hIDaIe-DrC8SZmO51vtQvY9-vgbfY'
fetch("https://mailmerge.789.com.mx/api/v1/document/14", {
  "method": "GET",
  "headers": {
    "authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1OTNDAyLCJpZGVudGl0eSI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIn19.7rlCm1FCthSqv2hIDaIe-DrC8SZmO51vtQvY9-vgbfY"
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});

Esta es la respuesta que recibirás

{
  "id": 1,
  "identification": 14,
  "filepath": "templates/uploads/PagarePF7892102cc3a-5f12-4056-87d3-7c04bcd0f42d.docx",
  "created_at": "2020-06-19T00:01:33.938620",
  "fields": [
    "fecha_contrato",
    "nombre_aval",
    "nombre_cliente",
    "porcentaje_moratorio_letra",
    "porcentaje_moratorio",
    "fecha_inicia",
    "plazo",
    "fecha_termina",
    "monto_pagare_letra",
    "monto_pagare"
  ]
}

Si deseas obtener nuevamente la lista de campos de un documento previamente cargado, sólo utilizas éste endpoint colocando al final la referencia de el documento, el número de identificación que tienes en tu base de datos que hace referencia a ésta plantilla.

HTTP Request

GET https://mailmerge.789.com.mx/api/v1/document/id

Parámetros

Parameter Requerido Description
id Si Ésta es la referencia del archivo, éste ID es el número registrado en tu base de datos para referenciar el documento que estas procesando

Combinar platilla con datos

/api/v1/document/{refid}/merge

<?php

$client = new http\Client;
$request = new http\Client\Request;

$body = new http\Message\Body;
$body->append('{
  "fields": {
    "monto_pagare": "1500",
    "nombre_aval": "JANE DOE",
    "monto_pagare_letra": "MIL QUINIENTOS PESOS 00/100 MONEDA NACIONAL",
    "porcentaje_moratorio": "2",
    "fecha_inicia": "2 DE ENERO DE 2020",
    "fecha_contrato": "2 DE ENERO DE 2020",
    "fecha_termina": "2 DE ENERO DE 2021",
    "nombre_cliente": "JOHN DOE",
    "plazo": "12",
    "porcentaje_moratorio_letra": "DOS PORCIENTO"
  },
  "tables": []
}');

$request->setRequestUrl('https://mailmerge.789.com.mx/api/v1/document/14/merge');
$request->setRequestMethod('PUT');
$request->setBody($body);

$request->setHeaders(array(
  'content-type' => 'application/json',
  'authorization' => 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjNDAyLCJpZGVudGl0eSI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIn19.7rlCm1FCthSqv2hIDaIe-DrC8SZmO51vtQvY9-vgbfY'
));

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();
curl --request PUT \
  --url https://mailmerge.789.com.mx/api/v1/document/14/merge \
  --header 'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1O1MTUzNDAyLCJpZGVudGl0eSI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIn19.7rlCm1FCthSqv2hIDaIe-DrC8SZmO51vtQvY9-vgbfY' \
  --header 'content-type: application/json' \
  --data '{
  "fields": {
    "monto_pagare": "1500",
    "nombre_aval": "JANE DOE",
    "monto_pagare_letra": "MIL QUINIENTOS PESOS 00/100 MONEDA NACIONAL",
    "porcentaje_moratorio": "2",
    "fecha_inicia": "2 DE ENERO DE 2020",
    "fecha_contrato": "2 DE ENERO DE 2020",
    "fecha_termina": "2 DE ENERO DE 2021",
    "nombre_cliente": "JOHN DOE",
    "plazo": "12",
    "porcentaje_moratorio_letra": "DOS PORCIENTO"
  },
  "tables": []
}'
fetch("https://mailmerge.789.com.mx/api/v1/document/14/merge", {
  "method": "PUT",
  "headers": {
    "content-type": "application/json",
    "authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjENDAyLCJpZGVudGl0eSI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIiwiZnJlc2giOnRydWUsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6eyJyb2xlcyI6IjIwMjAtMDYtMThUMTg6MDU6MjMuODY1NDgzIn19.7rlCm1FCthSqv2hIDaIe-DrC8SZmO51vtQvY9-vgbfY"
  },
  "body": {
    "fields": {
      "monto_pagare": "1500",
      "nombre_aval": "JANE DOE",
      "monto_pagare_letra": "MIL QUINIENTOS PESOS 00/100 MONEDA NACIONAL",
      "porcentaje_moratorio": "2",
      "fecha_inicia": "2 DE ENERO DE 2020",
      "fecha_contrato": "2 DE ENERO DE 2020",
      "fecha_termina": "2 DE ENERO DE 2021",
      "nombre_cliente": "JOHN DOE",
      "plazo": "12",
      "porcentaje_moratorio_letra": "DOS PORCIENTO"
    },
    "tables": []
  }
})
.then(response => {
  console.log(response);
})
.catch(err => {
  console.error(err);
});

Recibirás como respuesta un archivo binario en formato Microsoft Word, tu código debe estar preparado para leer el contenido de la respuesta y guardarlo en un archivo local.

HTTP Request

PUT https://mailmerge.789.com.mx/api/v1/document/{refid}/merge

Parámetros

Parameter Requerido Description
id Si Ésta es la referencia del archivo, éste ID es el número registrado en tu base de datos para referenciar el documento que estas procesando

Body

En el cuerpo del request, incluir un json con el mapeo de los campos combinables y los datos que van a ser reemplazados en el documento. La seccion "tables" dejarlo como un arreglo vacío

{
  "fields": {
    "monto_pagare": "1500",
    "nombre_aval": "JANE DOE",
    "monto_pagare_letra": "MIL QUINIENTOS PESOS 00/100 MONEDA NACIONAL",
    "porcentaje_moratorio": "2",
    "fecha_inicia": "2 DE ENERO DE 2020",
    "fecha_contrato": "2 DE ENERO DE 2020",
    "fecha_termina": "2 DE ENERO DE 2021",
    "nombre_cliente": "JOHN DOE",
    "plazo": "12",
    "porcentaje_moratorio_letra": "DOS PORCIENTO"
  },
  "tables": []
}

En esta sección deberas enviar un JSON válido con dos claves (fields, tables) en el objeto "fields" envias el mapeo de tus campos combinables y los datos que deseas reemplazar, en "tables" va un arreglo vacío.

Errores

Esta es la lista de errores que puede arrojar MailMerge API

Codigo Significado
400 Bad Request -- Su solicitud no es válida.
401 Unauthorized -- Su token expiró o no es válido.
403 Forbidden -- Su solicitud está oculta o no encontrada.
404 Not Found -- Registro no encontrado.
405 Method Not Allowed -- Esta tratando de utilizar un método no reconocido.
406 Not Acceptable -- Su solicitud no es un json válido.
429 Too Many Requests -- Demasiadas solicitudes
500 Internal Server Error -- Error interno del servidor.