Certificado de clientes

Certificados de pruebas

Recuerda que el cliente de prueba deben usar certificados especiales y no los certificados reales de algún emisor.

Si un cliente de pruebas usara un certificado real, no verás ningún error hasta el momento que quieras emitir una factura. Por lo que es importante realizar el flujo de pruebas completo primero.

Una vez hayas realizado facturas de prueba satisfactorias, deberás dar de alta un nuevo cliente productivo y posteriormente cargar el CSD real.

Recuerda que no es posible convertir un cliente emisor de prueba en un cliente productivo. El cliente productivo deberá ser uno nuevo cuando hayas generado facturas de prueba correctamente.

Contraseña de la llave: 12345678a

Subir el certificado

Subir los certificados se realiza en Front-End, subiendo los archivos como Form Data (x-www-form-urlencoded). En el ejemplo verás una función declarada en JavaScript para browser, la cual no depende de ningun framework y puede ser llamada tal cual.

Para ejecutar esta función usando un input normal de HTML puedes hacer lo siguiente.

POST: https://api.fiscalpop.com/api/v1/upload/cer/:authToken
<input type="file" accept=".cer" onchange="uploadCertificate()">

Respuesta del request

  • keyPem: Key del CSD en formato PEM

  • keyModulus: El Modulus de la llave del CSD
    El Modulus es una valor de tipo MD5 de OPENSSL que encuentras en los certificados CSR (tal como los CSD).

  • cer: El Cer en formato PEM

  • cerNumber: El número de serie del Certificado, como lo solicita el SAT.

  • cerModulus:
    El Modulus es una valor de tipo MD5 de OPENSSL que encuentras en los certificados CSR (tal como los CSD).

  • notBefore: El CSD puede usarse a partir de esta fecha, no antes.

  • notAfter: Fecha de caducidad del CSD, después de esta fecha, no puede usarse.

  • authToken: La llave de acceso del cliente, confirmando el token usado

  • masterToken: Esta es la llave de acceso principal, confirmando la clave usada para crear el cliente.

  • modulusMatch: Valor true / false que indica si la llave pertenece al certificado
    Si el modulusMatch es true, y las fechas notBefore / notAfter son válidas, el cliente esta listo para facturar

    .

Subir Cer CSD

HTML

JavaScript

Subir archivo con HTML solo

multipart/form-data


<form action="https://api.fiscalpop.com/api/v1/upload/cer/:authToken" method="post" enctype="multipart/form-data">
    <label for="upload">Certificado:</label>
    <input type="file" accept=".cer" id="upload" name="upload">
    <input type="submit" value="Submit">
</form>

Subir archivo desde Web

multipart/form-data


<form onsubmit="makeFormData(event);">
    <label for="upload">Certificado:</label>
    <input type="file" accept=".cer" id="upload" name="upload">
    <input type="submit" value="Submit">
</form>

function makeFormData(event) {
    event.preventDefault();
    const cerFile = document.getElementById("upload").files[0];
    // Asumiento que rfc y authToken están definidas en otro lado
    uploadCertificate(cerFile, rfc, authToken);
}

function uploadCertificate(cerFile, rfc, authToken) {
    const compatibleFileName = new File([cerFile], rfc+'.cer', {type: 'application/pkix-cert'})
    const formData = new FormData();
    formData.append('upload', compatibleFileName);
    return fetch('https://api.fiscalpop.com/api/v1/upload/cer/'+authToken, {
        method: 'POST',
        credentials: 'omit',
        body: formData
    }).then(response => {
        if (response.ok) {
            return response.json()
        } else {
            throw response.text();
        }
    }).then(respuesta => {
        console.log('Respuesta:', respuesta);
        // Ejecuta tu propia lógica aquí 
    }).catch(errProm => {
        errProm.then(err => {
            // El error desde el servidor se recibe como "Promise" 
            console.log('Cert submit err: ', err);
            // Ejecuta tu propia lógica de error aquí 
        })
        .catch(() => null);
    });
}

Respuesta correcta


{
    keyPem: '...',
    keyModulus: '...',
    cer: '...',
    cerNumber: '...',
    cerModulus: '...',
    notBefore: 2020-08-27T06:53:19.174Z,
    notAfter: 2024-08-27T06:53:19.174Z,
    authToken: '...',
    masterToken: '...',
    modulusMatch: true,
}