Java

A continuación encontrara los ejemplos para consumir los servicios de SmartWeb; cabe resaltar que todos los ejemplos fueron probados exitosamente con el IDE NetBeans 8. De igual manera puede descargar los proyectos con los código de ejemplo de la pagina de github para SmarterWeb.

Todas las URLs mostradas en esta documentación apuntan al servicio de pruebas, para obtener las URLs del servicio productivo es necesario contratar un paquete.

Pasos previos

Para poder consumir los servicios, es necesario agregarlos previamente al IDE; NetBeans provee una herramienta para poder efectuar esta tarea de manera sencilla, para esto es necesario dar clic con el botón derecho del mouse en el Proyecto, seleccionar “Nuevo” y dar clic en “Web Service Client…”. Una vez hecho esto aparecera una nueva ventana, en esta debe agregarsele el URL del servicio y el Package donde se almacenará.

Autenticación

Antes de realizar cualquier otra operación es necesario autenticarse, para consumir este servicio se usa la URL: http://pruebascfdi.smartweb.com.mx/Autenticacion/wsAutenticacion.asmx?WSDL.

El servicio de autenticación básico recibe un usuario y una contraseña, si ambos son correctos devuelve un token de autenticación, en caso contrario se lanza una excepción.

Para este ejemplo el WebService se agregó usando el Package Autenticacion.

package test;

import Autenticacion.WsAutenticacion;
import Autenticacion.WsAutenticacionSoap;

public class Test {

    public static void main(String[] args) {
        WsAutenticacionSoap autenticacion = new WsAutenticacion()
            .getWsAutenticacionSoap();
        String token = autenticacion.autenticarBasico("demo", "123456789");
        System.out.println(token);
    }
}

Timbrado

Para el servicio de timbrado se usa la URL: http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL

Para los ejemplos de timbrado, el WebService se agregó usando el Package Timbrado.

TimbrarXML

TimbrarXML Recive el contenido de una factura en string y el token de autenticación, si la factura y el token son correctos devuelve el complemento timbre en un string, en caso contrario lanza una excepción.

package test;

import java.io.File;
import java.io.FileInputStream;

import Autenticacion.WsAutenticacion;
import Autenticacion.WsAutenticacionSoap;
import Timbrado.WsTimbrado;
import Timbrado.WsTimbradoSoap;

public class Test {

    public static void main(String[] args) {
        WsAutenticacionSoap autenticacion = new WsAutenticacion()
            .getWsAutenticacionSoap();
        WsTimbradoSoap timbrado = new WsTimbrado().getWsTimbradoSoap();
        String token = autenticacion.autenticarBasico("demo", "123456789");
        try {
            File file = new File("factura1peso.xml");
            FileInputStream reader = new FileInputStream(file);
            int size = (int)file.length();
            byte[] buffer = new byte[size];
            reader.read(buffer, 0, size);
            String xml = new String(buffer, "utf-8");
            String result = timbrado.timbrarXML(xml, token);
            System.out.println(result);
            reader.close();
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

TimbrarXMLV2

TimbrarXMLV2 es muy similar a TimbrarXML, con la diferencia de que el resultado en lugar de ser solo el complemento timbre, es la factura ya timbrada.

package test;

import java.io.File;
import java.io.FileInputStream;

import Autenticacion.WsAutenticacion;
import Autenticacion.WsAutenticacionSoap;
import Timbrado.WsTimbrado;
import Timbrado.WsTimbradoSoap;

public class Test {

    public static void main(String[] args) {
        WsAutenticacionSoap autenticacion = new WsAutenticacion()
            .getWsAutenticacionSoap();
        WsTimbradoSoap timbrado = new WsTimbrado().getWsTimbradoSoap();
        String token = autenticacion.autenticarBasico("demo", "123456789");
        try {
            File file = new File("factura1peso.xml");
            FileInputStream reader = new FileInputStream(file);
            int size = (int)file.length();
            byte[] buffer = new byte[size];
            reader.read(buffer, 0, size);
            String xml = new String(buffer, "utf-8");
            String result = timbrado.timbrarXMLV2(xml, token);
            System.out.println(result);
            reader.close();
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

Cancelación

Para el servicio de cancelación se usa el servicio con la URL: http://pruebascfdi.smartweb.com.mx/Cancelacion/wsCancelacion.asmx?WSDL.

Para los ejemplos de cancelación se agrego el WebService con el Package Cancelacion

CancelarCSD

Este servicio recibe los archivos *.cer y *.key en base 64, la contraseña del archivo *.key, el RFC del emisor que desea cancelar la facturas, los UUIDs de las facturas a cancelar (estos se encuentran dentro del complemento timbre) y el token de autentificación.

package test;

import java.io.File;
import java.io.FileInputStream;

import sun.misc.BASE64Encoder;

import Autenticacion.WsAutenticacion;
import Autenticacion.WsAutenticacionSoap;
import Cancelacion.ArrayOfString;
import Cancelacion.WsCancelacion;
import Cancelacion.WsCancelacionSoap;
import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        WsAutenticacionSoap autenticacion = new WsAutenticacion()
            .getWsAutenticacionSoap();
        WsCancelacionSoap cancelacion = new WsCancelacion()
            .getWsCancelacionSoap();
        String token = autenticacion.autenticarBasico("demo", "123456789");
        try {
            BASE64Encoder encoder = new BASE64Encoder();
            File fileCer = new File("aad990814bp7_1210261233s.cer");
            File fileKey = new File("aad990814bp7_1210261233s.key");
            FileInputStream readerCer = new FileInputStream(fileCer);
            FileInputStream readerKey = new FileInputStream(fileKey);
            int sizeCer = (int)fileCer.length();
            int sizeKey = (int)fileKey.length();
            byte[] bufferCer = new byte[sizeCer];
            byte[] bufferKey = new byte[sizeKey];
            readerCer.read(bufferCer, 0, sizeCer);
            readerKey.read(bufferKey, 0, sizeKey);
            String b64Cer = encoder.encode(bufferCer);
            String b64Key = encoder.encode(bufferKey);
            
            ArrayOfStringHelper uuids = new ArrayOfStringHelper();
            uuids.addString("17aeeccc-6ec0-49af-b786-0878d34e0b27");
            uuids.addString("a3216283-078c-418e-bf2c-2fb62e418d45");
            
            String result = cancelacion.cancelarCSD(b64Cer, b64Key, "12345678a",
                    "AAD990814BP7", uuids, token);

            System.out.println(result);
            readerCer.close();
            readerKey.close();
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    public static class ArrayOfStringHelper extends ArrayOfString {
        
        public ArrayOfStringHelper() {
            this.string = new ArrayList<String>();
        }
        
        public void addString(String value) {
            this.string.add(value);
        }
    }
}

CancelarPEM

Este servicio es muy similar a “CancelarCSD”, con la diferencia de que deben de mandarse el certificado y el key en formato *.pem, ademas de que no se envia la contraseña del key, ya que no es requerida.

package test;

import java.io.File;
import java.io.FileInputStream;

import sun.misc.BASE64Encoder;

import Autenticacion.WsAutenticacion;
import Autenticacion.WsAutenticacionSoap;
import Cancelacion.ArrayOfString;
import Cancelacion.WsCancelacion;
import Cancelacion.WsCancelacionSoap;
import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        WsAutenticacionSoap autenticacion = new WsAutenticacion()
            .getWsAutenticacionSoap();
        WsCancelacionSoap cancelacion = new WsCancelacion()
            .getWsCancelacionSoap();
        String token = autenticacion.autenticarBasico("demo", "123456789");
        try {
            BASE64Encoder encoder = new BASE64Encoder();
            File fileCer = new File("aad990814bp7_1210261233s.cer.pem");
            File fileKey = new File("aad990814bp7_1210261233s.key.pem");
            FileInputStream readerCer = new FileInputStream(fileCer);
            FileInputStream readerKey = new FileInputStream(fileKey);
            int sizeCer = (int)fileCer.length();
            int sizeKey = (int)fileKey.length();
            byte[] bufferCer = new byte[sizeCer];
            byte[] bufferKey = new byte[sizeKey];
            readerCer.read(bufferCer, 0, sizeCer);
            readerKey.read(bufferKey, 0, sizeKey);
            String b64Cer = encoder.encode(bufferCer);
            String b64Key = encoder.encode(bufferKey);
            
            ArrayOfStringHelper uuids = new ArrayOfStringHelper();
            uuids.addString("17aeeccc-6ec0-49af-b786-0878d34e0b27");
            uuids.addString("a3216283-078c-418e-bf2c-2fb62e418d45");
            
            String result = cancelacion.cancelarPEM(b64Cer, b64Key,
                    "AAD990814BP7", uuids, token);

            System.out.println(result);
            readerCer.close();
            readerKey.close();
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    public static class ArrayOfStringHelper extends ArrayOfString {
        
        public ArrayOfStringHelper() {
            this.string = new ArrayList<String>();
        }
        
        public void addString(String value) {
            this.string.add(value);
        }
    }
}

Timbres disponibles

Para obtener los timbres disponibles es necesario agregar el servicio que corresponde a la siguiente URL: https://pruebascfdi.smartweb.com.mx/Account/wsAccount.svc?wsdl. Notese que esta URL trabaja con HTTP seguro.

Para el siguiente ejemplo, se agrego el WebService con el Package Account.

package test;

import Account.Cliente;
import Account.IwsAccount;
import Account.SaldoCliente;
import Account.WsAccount;
import Autenticacion.WsAutenticacion;
import Autenticacion.WsAutenticacionSoap;
import com.sun.xml.internal.ws.api.message.Headers;
import com.sun.xml.internal.ws.developer.WSBindingProvider;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.xml.namespace.QName;

public class Test {

    public static void main(String[] args) {
        TrustManager[] trustAllCerts = new TrustManager[] {
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] xcs, String string) { }

                @Override
                public void checkServerTrusted(X509Certificate[] xcs, String string) { }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            }
        };
        
        HostnameVerifier allHostValid = new HostnameVerifier() {
            @Override
            public boolean verify(String string, SSLSession ssls) {
                return true;
            }
        };
        
        try {
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(allHostValid);
            WsAutenticacionSoap autenticacion = new WsAutenticacion()
                .getWsAutenticacionSoap();
            IwsAccount account = new WsAccount().getAccountEndpoint();
            WSBindingProvider bp = (WSBindingProvider)account;
            String token = autenticacion.autenticarBasico("demo", "123456789");
            bp.setOutboundHeaders(
                Headers.create(new QName("http://soapinterop.org/echoheader/", "token"), token)
            );
            Cliente client = account.getClientById();
            SaldoCliente cliente = account.getSaldoClientById(client.getIdCliente());
            System.out.println(cliente.getSaldoTimbres());
            System.out.println(cliente.getTimbresUtilizados().getValue());
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

Si tiene algún problema para compilar el ejemplo, debe agregar la opción “-XDignore.symbol.file=true” para la compilación, esto se hace dando clic en el proyecto, propiedades y despues seleccionando la categoria “Compiling”

lenguajes/java.txt · Última modificación: 2016/08/10 09:34 (editor externo)
Volver arriba
CC Attribution-Share Alike 3.0 Unported
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0