Skip to content

Commit

Permalink
Se añade método de emisión timbrado XML.
Browse files Browse the repository at this point in the history
Se actualiza documentación de uso.
Fix en UnitTest.
  • Loading branch information
JuanGamezSW committed Sep 21, 2018
1 parent 6ba8b09 commit 1acf1ea
Show file tree
Hide file tree
Showing 10 changed files with 376 additions and 17 deletions.
188 changes: 185 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@


[![Smarter Web](http://sw.com.mx/images/logo.png)](http://sw.com.mx/)

# SDK JAVA #
Expand Down Expand Up @@ -49,7 +47,7 @@ Alternativamente tambien se cuenta con un archivo JAR en el que se incluyen toda



**Uso rapido...**
# Timbrar XML #

```java
try{
Expand Down Expand Up @@ -327,6 +325,185 @@ try {
}
```

# Timbrar Json #
Métodos mediante los cuales se envía un string o byte array de un JSON.
## Timbrar Json v1 ##
Recibe un String o byte array del JSON.
Retorna TFD de la factura.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueJson(stringJson, "v1");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

## Timbrar Json v2 ##
Recibe un String o byte array del JSON.
Retorna TFD y el CFDI.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueJson(stringJson, "v2");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
System.out.println(response.cfdi);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

## Timbrar Json v3 ##
Recibe un String o byte array del JSON.
Retorna CFDI y el TFD ya unidos.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueJson(stringJson, "v3");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.cfdi);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

## Timbrar Json v4 ##
Recibe un String o byte array del JSON.
Retorna CFDI, TFD, CadenaOriginal, noCertificadoSat, noCertificadoCFDI, UUID, selloSAT, selloCFDI, fechaTimbrado y QR.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueJson(stringJson, "v4");
System.out.println(response.Status);
System.out.println(response.cfdi);
System.out.println(response.qrCode);
System.out.println(response.cadenaOriginalSAT);
System.out.println(response.selloCFDI);
System.out.println(response.selloSAT);
System.out.println(response.noCertificadoCFDI);
System.out.println(response.noCertificadoSAT);
System.out.println(response.fechaTimbrado);
System.out.println(response.uuid);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

# Emisión Timbrado XML #
Métodos mediante los cuales se envía un XML sin sellar.
## Emisión Timbrado v1 ##
Recibe un String o byte array del XML.
Retorna TFD de la factura.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueXml(stringXml, "v1");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

## Emisión Timbrado v2 ##
Recibe un String o byte array del XML.
Retorna TFD y el CFDI.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueXml(stringXml, "v2");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.tfd);
System.out.println(response.cfdi);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

## Emisión Timbrado v3 ##
Recibe un String o byte array del XML.
Retorna CFDI y el TFD ya unidos.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueXml(stringXml, "v3");
System.out.println(response.Status);
System.out.println(response.HttpStatusCode);
System.out.println(response.cfdi);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

## Emisión Timbrado v4 ##
Recibe un String o byte array del XML.
Retorna CFDI, TFD, CadenaOriginal, noCertificadoSat, noCertificadoCFDI, UUID, selloSAT, selloCFDI, fechaTimbrado y QR.
Ejemplo de uso
```java
try {
//Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
//Se especifica el base path, esto para consumir el api de pruebas o productivo
SWIssueService api = new SWIssueService("demo", "123456789", "http://services.test.sw.com.mx");
//Se inicializa un objeto response, que obtendra la respuesta del api
SuccessV1Response response = null;
response = (SuccessV1Response) api.IssueXml(stringXml, "v4");
System.out.println(response.Status);
System.out.println(response.cfdi);
System.out.println(response.qrCode);
System.out.println(response.cadenaOriginalSAT);
System.out.println(response.selloCFDI);
System.out.println(response.selloSAT);
System.out.println(response.noCertificadoCFDI);
System.out.println(response.noCertificadoSAT);
System.out.println(response.fechaTimbrado);
System.out.println(response.uuid);
} catch (Exception e) {
System.out.println(e.getMessage());
}
```

# Cancelación #

Expand Down Expand Up @@ -435,6 +612,11 @@ for (int i = 0; i < List.size(); i++) {
}
System.out.println("\t" + node.section);
}
System.out.println(response.cadenaOriginalComprobante);
System.out.println(response.cadenaOriginalSAT);
System.out.println(response.uuid);
System.out.println(response.statusSat);
System.out.println(response.statusCodeSat);
//En caso de obtener un error, este puede obtenerse de los campos
System.out.println(response.message);
System.out.println(response.messageDetail);
Expand Down
14 changes: 12 additions & 2 deletions src/main/java/Services/Issue/SWIssueService.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,21 @@ public IResponse IssueJson(String json, String version) throws AuthException, Ge
return req.sendRequest(settings);
}

public IResponse Issue(byte[] jsonFile, String version) throws AuthException, GeneralException, IOException {
public IResponse IssueJson(byte[] jsonFile, String version) throws AuthException, GeneralException, IOException {
String jsonProcess = new String(jsonFile, Charset.forName("UTF-8"));
IssueOptionsRequest settings = new IssueOptionsRequest(getToken(), getURI(), jsonProcess, version);
IssueRequest req = new IssueRequest();
return req.sendRequest(settings);

}
public IResponse IssueXml(String xml, String version) throws AuthException, GeneralException, IOException {
IssueOptionsRequest settings = new IssueOptionsRequest(getToken(), getURI(), xml, version, true);
IssueRequest req = new IssueRequest();
return req.sendRequestXml(settings);
}
public IResponse IssueXml(byte[] xmlfile, String version) throws AuthException, GeneralException, IOException {
String xmlProcess = new String(xmlfile, Charset.forName("UTF-8"));
IssueOptionsRequest settings = new IssueOptionsRequest(getToken(), getURI(), xmlProcess, version, true);
IssueRequest req = new IssueRequest();
return req.sendRequestXml(settings);
}
}
1 change: 1 addition & 0 deletions src/main/java/Utils/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ public class Constants {
public static String AUTH_PATH = "/security/authenticate";
public static String STAMP_PATH = "/cfdi33/stamp/";
public static String ISSUE_JSON_PATH = "/v3/cfdi33/issue/json/";
public static String ISSUE_XML_PATH = "/cfdi33/issue/";
public static String CANCELATION_CSD_PATH = "/cfdi33/cancel/csd";
public static String CANCELATION_XML_PATH = "/cfdi33/cancel/xml";
public static String CANCELATION_PFX_PATH = "/cfdi33/cancel/pfx";
Expand Down
6 changes: 5 additions & 1 deletion src/main/java/Utils/Requests/Issue/IssueOptionsRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,9 @@ public IssueOptionsRequest(String token, String URI, String xml, String version)
this.xml = xml;
this.version = version;
}

public IssueOptionsRequest(String token, String URI, String xml, String version, boolean isXml) {
super(token, URI+ Constants.ISSUE_XML_PATH+version, xml, version);
this.xml = xml;
this.version = version;
}
}
99 changes: 99 additions & 0 deletions src/main/java/Utils/Requests/Issue/IssueRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,16 @@
import Utils.Responses.Stamp.SuccessV4Response;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.UUID;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
Expand Down Expand Up @@ -112,7 +117,101 @@ else if(request.version.equalsIgnoreCase("v3")){
e.printStackTrace();
throw new GeneralException(500,e.getMessage());
}
}

public IResponse sendRequestXml(IRequest request) throws GeneralException, AuthException {
try {
String xmlStr = ((IssueOptionsRequest) request).getXml();
String boundary = UUID.randomUUID().toString();
String raw = "--"+boundary+"\r\nContent-Disposition: form-data; name=xml; filename=xml\r\nContent-Type: application/xml\r\n\r\n"+xmlStr+"\r\n--"+boundary+"--";

CloseableHttpClient client = HttpClients.createDefault();
HttpPost httppost = new HttpPost(request.URI);
httppost.setHeader("Authorization", "bearer " + request.Token);
httppost.addHeader("Content-Type", "multipart/form-data; boundary="+boundary);
httppost.addHeader("Content-Disposition", "form-data; name=xml; filename=xml");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
Charset chars = Charset.forName("UTF-8");
builder.setCharset(chars);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addTextBody("xml", raw, ContentType.DEFAULT_BINARY);
httppost.setEntity(builder.build());

CloseableHttpResponse responseB = client.execute(httppost);
HttpEntity entity = responseB.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
int statusE = responseB.getStatusLine().getStatusCode();
client.close();
responseB.close();
if(!responseString.isEmpty()) {
JSONObject body = new JSONObject(responseString);
if(statusE==200){
JSONObject data = body.getJSONObject("data");

if (request.version.equalsIgnoreCase("v1")) {
return new SuccessV1Response(statusE,body.getString("status"),data.getString("tfd"),"OK","OK");
}
else if(request.version.equalsIgnoreCase("v2")){
return new SuccessV2Response(statusE,body.getString("status"),data.getString("tfd"),data.getString("cfdi"),"OK","OK");
}
else if(request.version.equalsIgnoreCase("v3")){
return new SuccessV3Response(statusE,body.getString("status"),data.getString("cfdi"),"OK","OK");

}else if(request.version.equalsIgnoreCase("v4")){
return new SuccessV4Response(statusE,body.getString("status"),data.getString("cfdi"),data.getString("cadenaOriginalSAT"),data.getString("noCertificadoSAT"),data.getString("noCertificadoCFDI"),data.getString("uuid"),data.getString("selloSAT"),data.getString("selloCFDI"),data.getString("fechaTimbrado"),data.getString("qrCode"),"OK","OK");
}
else{
return new SuccessV1Response(statusE,body.getString("status"),data.toString(),"OK","OK");
}


}
else{
String messageDetail = "";
if (!body.isNull("messageDetail")){
messageDetail = body.getString("messageDetail");
}
if (request.version.equalsIgnoreCase("v1")) {
return new SuccessV1Response(statusE,body.getString("status"),"",body.getString("message"),messageDetail);
}
else if(request.version.equalsIgnoreCase("v2")){
return new SuccessV2Response(statusE,body.getString("status"),"","",body.getString("message"),messageDetail);
}
else if(request.version.equalsIgnoreCase("v3")){
return new SuccessV3Response(statusE,body.getString("status"),"",body.getString("message"),messageDetail);

}else if(request.version.equalsIgnoreCase("v4")){
return new SuccessV4Response(statusE,body.getString("status"),"","","","","","","","","",body.getString("message"),messageDetail);
}
else{
return new SuccessV1Response(statusE,body.getString("status"),"",body.getString("message"),messageDetail);
}

}
}
else{
if (request.version.equalsIgnoreCase("v1")) {
return new SuccessV1Response(statusE,"error","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
else if(request.version.equalsIgnoreCase("v2")){
return new SuccessV2Response(statusE,"error","","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
else if(request.version.equalsIgnoreCase("v3")){
return new SuccessV3Response(statusE,"error","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());

}else if(request.version.equalsIgnoreCase("v4")){
return new SuccessV4Response(statusE,"error","","","","","","","","","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
else{
return new SuccessV1Response(statusE,"error","",responseB.getStatusLine().getReasonPhrase(),responseB.getStatusLine().getReasonPhrase());
}
}
}
catch (JSONException e){
throw new GeneralException(500,e.getMessage());
} catch (IOException e) {
e.printStackTrace();
throw new GeneralException(500,e.getMessage());
}
}
}
Loading

0 comments on commit 1acf1ea

Please sign in to comment.