Referencias de pago
Te presentamos las Referencias de Pago, una funcionalidad diseñada para incluir información detallada en tus archivos PDF y facilitar el proceso de cobranza. Con ellas, tus clientes sabrán exactamente cómo y dónde pagar las facturas que emites, permitiéndote agregar distintos métodos como SPEI, BBVA, OXXO, Paynet y Links de Pago, entre otros.
Estas referencias pueden integrarse a cada uno de tus CFDIs (de tipo ingreso) tanto al momento de timbrar como de forma posterior al timbrado. En esta sección te mostraremos cómo implementarlo a través de nuestra API
Importante
La referencia de pago será generada basándose estrictamente en los datos que proporciones. Si ocurre algún inconveniente durante el proceso de pago, será necesario validar que la información enviada sea la correcta.
Este elemento se añade al XML de tu CFDI en el nodo de Addenda, el cual está destinado a información no fiscal útil para especificaciones o instrucciones. Es importante resaltar que, aunque se agreguen referencias de pago a tus CFDIs, aún puedes agregar alguna addenda si es necesario.
Agregar referencias de pago a CFDIs ya timbrados
A continuación, se presentan los parámetros necesarios para generar las referencias de pago en un CFDI que ha sido timbrado previamente:
| Parámetro | Tipo | Requerido | Detalles |
|---|---|---|---|
| invoice | String | Requerido | Es el campo para enviar el UID o UUID del CFDI donde se agregarán las referencias de pago. |
| PagosReferenciados | Array | Requerido | Es el arreglo que identifica la sección de pagos y contiene la información de cada referencia.. |
| Tipo | String | Opcional | Se utiliza para definir si se usará alguna plantilla por defecto. Existen plantillas prediseñadas (con colores y logos correspondientes) para: oxxo, paynet, spei, bbva y link_pago. Si se envía vacío o no se incluye, se tomará como pago genérico. Los valores admitidos son: oxxo paynet spei bbva link_pago |
| Titulo | String | Opcional | Es el título que se mostrará en la sección de la referencia de pago dentro del PDF. |
| Banco | String | Condicional | Requerido cuando se utiliza el Tipo ‘spei’ para señalar la institución bancaria donde se recibirá el pago. |
| Clabe | Numerico | Condicional | Necesario cuando se utiliza el Tipo ‘spei’ para indicar la CLABE interbancaria. |
| Convenio | Numerico | Condicional | Opcional cuando se utiliza el Tipo ‘bbva’ para indicar el convenio CIE de BBVA. |
| Referencia | String | Requerido | Requerido para señalar la referencia de pago que se utilizará. Es obligatorio independientemente del Tipo elegido. |
| Beneficiario | String | Opcional | Campo opcional para indicar el nombre del beneficiario del pago a realizar. |
| Total | Numerico | Requerido | Campo para indicar el monto a pagar. |
| Comision | Numerico | Opcional | Se utiliza para indicar si el pago requiere de algún pago de comisión por la forma de pago utilizada. Si el Tipo es ‘spei’ o ‘bbva’, este campo no se tomará en cuenta. |
| Instrucciones | Arreglo de strings | Opcional | Solo se mostrará si el Tipo es generico o vacio. Es un arreglo que debe contener entre 1 y 4 strings con los pasos personalizados para realizar el pago. Se recomienda mantener instrucciones cortas, ya que el diseño en el PDF puede verse afectado si el texto es muy extenso. |
| URL | String | Condicional | Requerido si Tipo es ‘link_pago’. Se utiliza para agregar la dirección web donde se podrá realizar el pago; esta se mostrará en forma de código QR. Si el Tipo es cualquier otro, este campo no se mostrará. |
Construcción de la URL
Importante
Importante el metodo para agregar una referencia de pago es POST
Host: https://api.factura.com (producción) / https://sandbox.factura.com/api (sandbox)
Endpoint: /v4/addenda/pagosreferenciados/store
Ejemplo: https://api.factura.com/v4/addenda/pagosreferenciados/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de Referencia de pago
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/addenda/pagosreferenciados/store',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Titulo": "Pago Generico",
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Comision": 8.00,
"Total": 2226.00,
"Instrucciones": [
"Paso 1 - Ve al banco a realizar un deposito.",
"Paso 2 - Menciona la cuenta y referencia de pago.",
"Paso 3 - Paga el monto total indicado.",
"Paso 4 - Enviarnos el comprobante al correo de pagos."
]
}
]
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/addenda/pagosreferenciados/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Titulo": "Pago Generico",
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Comision": 8,
"Total": 2226,
"Instrucciones": [
"Paso 1 - Ve al banco a realizar un deposito.",
"Paso 2 - Menciona la cuenta y referencia de pago.",
"Paso 3 - Paga el monto total indicado.",
"Paso 4 - Enviarnos el comprobante al correo de pagos."
]
}
]
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/addenda/pagosreferenciados/store"
payload = json.dumps({
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Titulo": "Pago Generico",
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Comision": 8,
"Total": 2226,
"Instrucciones": [
"Paso 1 - Ve al banco a realizar un deposito.",
"Paso 2 - Menciona la cuenta y referencia de pago.",
"Paso 3 - Paga el monto total indicado.",
"Paso 4 - Enviarnos el comprobante al correo de pagos."
]
}
]
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/addenda/pagosreferenciados/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Titulo": "Pago Generico",
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Comision": 8,
"Total": 2226,
"Instrucciones": [
"Paso 1 - Ve al banco a realizar un deposito.",
"Paso 2 - Menciona la cuenta y referencia de pago.",
"Paso 3 - Paga el monto total indicado.",
"Paso 4 - Enviarnos el comprobante al correo de pagos."
]
}
]
})
response = http.request(request)
puts response.read_body
Ejemplo de mas de una Referencia de pago a la vez
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/addenda/pagosreferenciados/store',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Tipo": "oxxo",
"Titulo": "Pago tiendas de conveniencia",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226.00,
"Comision": 10.00
},
{
"Titulo": "Pago con transferencia",
"Tipo": "spei",
"Banco": "Banco demo",
"Clabe": 123456789012345678,
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226.00
},
{
"Titulo": "Link de pago",
"Tipo": "link_pago",
"Referencia": "123456789012",
"URL": "sitioweb.com/pago-express",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226.00,
"Comision": 0.00
}
]
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/addenda/pagosreferenciados/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Tipo": "oxxo",
"Titulo": "Pago tiendas de conveniencia",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226,
"Comision": 10
},
{
"Titulo": "Pago con transferencia",
"Tipo": "spei",
"Banco": "Banco demo",
"Clabe": 123456789012345680,
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226
},
{
"Titulo": "Link de pago",
"Tipo": "link_pago",
"Referencia": "123456789012",
"URL": "sitioweb.com/pago-express",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226,
"Comision": 0
}
]
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/addenda/pagosreferenciados/store"
payload = json.dumps({
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Tipo": "oxxo",
"Titulo": "Pago tiendas de conveniencia",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226,
"Comision": 10
},
{
"Titulo": "Pago con transferencia",
"Tipo": "spei",
"Banco": "Banco demo",
"Clabe": 123456789012345680,
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226
},
{
"Titulo": "Link de pago",
"Tipo": "link_pago",
"Referencia": "123456789012",
"URL": "sitioweb.com/pago-express",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226,
"Comision": 0
}
]
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/addenda/pagosreferenciados/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "69d55bdeea6b0",
"PagosReferenciados": [
{
"Tipo": "oxxo",
"Titulo": "Pago tiendas de conveniencia",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226,
"Comision": 10
},
{
"Titulo": "Pago con transferencia",
"Tipo": "spei",
"Banco": "Banco demo",
"Clabe": 123456789012345680,
"Referencia": "123456789012",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226
},
{
"Titulo": "Link de pago",
"Tipo": "link_pago",
"Referencia": "123456789012",
"URL": "sitioweb.com/pago-express",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 2226,
"Comision": 0
}
]
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Respuesta erronea cuando no exite el CFDI enviado
{
"response": "failed",
"message": "CFDI invalido"
}
Respuesta erronea cuando falta algun campo requerido
{
"response": "failed",
"message": "El campo Clabe es requerido en PagosReferenciados[1] cuando Tipo es spei"
}
Agregar referencias de pago desde el timbrado de un CFDI
Estos son los parametros para agregar las referencias de pago desde que se envia la petición de timbrado de un nuevo CFDI.
| Parámetro | Tipo | Requerido | Detalles |
|---|---|---|---|
| PagosReferenciados | Array | Requerido | Es el arreglo que identifica la sección de pagos y contiene la información de cada referencia.. |
| Tipo | String | Opcional | Se utiliza para definir si se usará alguna plantilla por defecto. Existen plantillas prediseñadas (con colores y logos correspondientes) para: oxxo, paynet, spei, bbva y link_pago. Si se envía vacío o no se incluye, se tomará como pago genérico. Los valores admitidos son: oxxo paynet spei bbva link_pago |
| Titulo | String | Opcional | Es el título que se mostrará en la sección de la referencia de pago dentro del PDF. |
| Banco | String | Condicional | Requerido cuando se utiliza el Tipo ‘spei’ para señalar la institución bancaria donde se recibirá el pago. |
| Clabe | Numerico | Condicional | Necesario cuando se utiliza el Tipo ‘spei’ para indicar la CLABE interbancaria. |
| Convenio | Numerico | Condicional | Opcional cuando se utiliza el Tipo ‘bbva’ para indicar el convenio CIE de BBVA. |
| Referencia | String | Requerido | Requerido para señalar la referencia de pago que se utilizará. Es obligatorio independientemente del Tipo elegido. |
| Beneficiario | String | Opcional | Campo opcional para indicar el nombre del beneficiario del pago a realizar. |
| Total | Numerico | Requerido | Campo para indicar el monto a pagar. |
| Comision | Numerico | Opcional | Se utiliza para indicar si el pago requiere de algún pago de comisión por la forma de pago utilizada. Si el Tipo es ‘spei’ o ‘bbva’, este campo no se tomará en cuenta. |
| Instrucciones | Arreglo de strings | Opcional | Solo se mostrará si el Tipo es generico o vacio. Es un arreglo que debe contener entre 1 y 4 strings con los pasos personalizados para realizar el pago. Se recomienda mantener instrucciones cortas, ya que el diseño en el PDF puede verse afectado si el texto es muy extenso. |
| URL | String | Condicional | Requerido si Tipo es ‘link_pago’. Se utiliza para agregar la dirección web donde se podrá realizar el pago; esta se mostrará en forma de código QR. Si el Tipo es cualquier otro, este campo no se mostrará. |
Construcción de la URL
Importante
Importante el metodo para agregar una referencia de pago es POST
Host: https://api.factura.com (producción) / https://sandbox.factura.com/api (sandbox)
Endpoint: /v4/cfdi40/create
Ejemplo: https://api.factura.com/v4/cfdi40/create
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de Referencia de pago al timbrar un CFDI
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/create',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"Receptor" : {
"UID": "6650cd65930e1"
},
"TipoDocumento":"factura",
"NumOrder": "",
"LugarExpedicion": 69800,
"Conceptos": [{
"ClaveProdServ": "81112101",
"Cantidad":1,
"ClaveUnidad":"E48",
"ValorUnitario": 1000.00,
"Descripcion": "Desarrollo a la medida",
"ObjetoImp": "02",
"Impuestos":{
"Traslados":[
{
"Base": 1000.00,
"Impuesto":"002",
"TipoFactor":"Tasa",
"TasaOCuota":"0.16",
"Importe":160.00
}
]
}
}],
"UsoCFDI": "S01",
"Serie": 61896,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": true,
"PagosReferenciados": [
{
"Titulo": "Pago referenciado",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116.00,
"Referencia": "000000000000",
"Comision": 25.00,
"Instrucciones": [
"Acude a cualquier tienda participante",
"Indica que deseas realizar un pago digital",
"Proporciona la referencia y pague el total",
"Envie el comprobante al correo [email protected]"
]
},
{
"Titulo": "Pago tiendas de conveniencia",
"Tipo": "Paynet",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116.00,
"Comision": 10.00
}
],
"Draft": 0
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/cfdi40/create',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"Receptor": {
"UID": "6650cd65930e1"
},
"TipoDocumento": "factura",
"NumOrder": "",
"LugarExpedicion": 69800,
"Conceptos": [
{
"ClaveProdServ": "81112101",
"Cantidad": 1,
"ClaveUnidad": "E48",
"ValorUnitario": 1000,
"Descripcion": "Desarrollo a la medida",
"ObjetoImp": "02",
"Impuestos": {
"Traslados": [
{
"Base": 1000,
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": 160
}
]
}
}
],
"UsoCFDI": "S01",
"Serie": 61896,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": true,
"PagosReferenciados": [
{
"Titulo": "Pago referenciado",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116,
"Referencia": "000000000000",
"Comision": 25,
"Instrucciones": [
"Acude a cualquier tienda participante",
"Indica que deseas realizar un pago digital",
"Proporciona la referencia y pague el total",
"Envie el comprobante al correo [email protected]"
]
},
{
"Titulo": "Pago tiendas de conveniencia",
"Tipo": "Paynet",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116,
"Comision": 10
}
],
"Draft": 0
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/creat"
payload = json.dumps({
"Receptor": {
"UID": "6650cd65930e1"
},
"TipoDocumento": "factura",
"NumOrder": "",
"LugarExpedicion": 69800,
"Conceptos": [
{
"ClaveProdServ": "81112101",
"Cantidad": 1,
"ClaveUnidad": "E48",
"ValorUnitario": 1000,
"Descripcion": "Desarrollo a la medida",
"ObjetoImp": "02",
"Impuestos": {
"Traslados": [
{
"Base": 1000,
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": 160
}
]
}
}
],
"UsoCFDI": "S01",
"Serie": 61896,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": True,
"PagosReferenciados": [
{
"Titulo": "Pago referenciado",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116,
"Referencia": "000000000000",
"Comision": 25,
"Instrucciones": [
"Acude a cualquier tienda participante",
"Indica que deseas realizar un pago digital",
"Proporciona la referencia y pague el total",
"Envie el comprobante al correo [email protected]"
]
},
{
"Titulo": "Pago tiendas de conveniencia",
"Tipo": "Paynet",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116,
"Comision": 10
}
],
"Draft": 0
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/create")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"Receptor": {
"UID": "6650cd65930e1"
},
"TipoDocumento": "factura",
"NumOrder": "",
"LugarExpedicion": 69800,
"Conceptos": [
{
"ClaveProdServ": "81112101",
"Cantidad": 1,
"ClaveUnidad": "E48",
"ValorUnitario": 1000,
"Descripcion": "Desarrollo a la medida",
"ObjetoImp": "02",
"Impuestos": {
"Traslados": [
{
"Base": 1000,
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": 160
}
]
}
}
],
"UsoCFDI": "S01",
"Serie": 61896,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": true,
"PagosReferenciados": [
{
"Titulo": "Pago referenciado",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116,
"Referencia": "000000000000",
"Comision": 25,
"Instrucciones": [
"Acude a cualquier tienda participante",
"Indica que deseas realizar un pago digital",
"Proporciona la referencia y pague el total",
"Envie el comprobante al correo [email protected]"
]
},
{
"Titulo": "Pago tiendas de conveniencia",
"Tipo": "Paynet",
"Referencia": "000000000000",
"Beneficiario": "Empresa Demo SA de CV",
"Total": 116,
"Comision": 10
}
],
"Draft": 0
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa
{
"response": "success",
"message": "Factura creada y enviada satisfactoriamente",
"UUID": "c0032dc0-3344-42f9-806d-0bf69296cdff",
"uid": "6a022dd065a91",
"SAT": {
"UUID": "c0032dc0-3344-42f9-806d-0bf69296cdff",
"FechaTimbrado": "2026-05-01T13:27:43",
"NoCertificadoSAT": "00000000000000000000",
"Version": "1.1",
"SelloSAT": "TRlXhKj1RsGuiGyoa2I1sBSCuOV9WxBwy...",
"SelloCFD": "N/6l1QC2k884DsBggSY1hCBjws1L9RwFqmc+c..."
},
"INV": {
"Serie": "F",
"Folio": 370
},
"invoice_uid": "6a022dd065a91"
}
Respuesta erronea cuando falta algun campo requerido
{
"response": "error",
"message": "El campo Referencia es requerido en PagosReferenciados[0]"
}
Eliminar referencia de pago
Es posible eliminar las referencias de pago agregadas a un CFDI, sin importar si se incluyeron al momento de timbrar o posteriormente. Esto no afectará la validez del CFDI en cuestión, y tienes la flexibilidad de eliminar todas las referencias o solo una de ellas.
A continuación, verás los parámetros necesarios para realizar la eliminación de referencias de pago.
| Parámetro | Tipo | Requerido | Detalles |
|---|---|---|---|
| uid | String | Requerido | Campo para enviar el UID del CFDI al que se le eliminarán las referencias de pago. Nota: No acepta UUID. |
| node | String | Requerido | Este campo siempre debe ser: ‘ReferenciaPago‘. |
| index | Numerico | Opcional | Aquí debemos indicar el índice de la referencia que queremos borrar. Es base 1, por lo que el primer elemento es el 1. Por ejemplo, si hay 3 referencias y queremos eliminar la segunda, debemos enviar: 2. Si se envía vacío, se eliminarán todas las referencias asociadas. |
Construcción de la URL
Importante
Importante el metodo para eliminar una referencia de pago es POST
Host: https://api.factura.com (producción) / https://sandbox.factura.com/api (sandbox)
Endpoint: /v4/addenda/drop
Ejemplo: https://api.factura.com/v4/addenda/drop
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de eliminar Referencia de pago
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/addenda/drop',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"uid": "69fe88e236b29",
"node": "ReferenciaPago",
"index": 1
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/addenda/drop',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"uid": "69fe88e236b29",
"node": "ReferenciaPago",
"index": 1
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/addenda/drop"
payload = json.dumps({
"uid": "69fe88e236b29",
"node": "ReferenciaPago",
"index": 1
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/addenda/drop")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"uid": "69fe88e236b29",
"node": "ReferenciaPago",
"index": 1
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa
{
"response": "success"
}
Respuesta erronea cuando se manda mal el UID
{
"response": "error",
"message": "No se encontró el cfdi"
}