# Soap messages - WSDL

**URL:** <https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412>\
**Category:** General Discussion\
**Created:** [May 29, 2017, 7:07pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412 "2017-05-29T19:07:03Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![giulianacaula](https://avatars.discourse-cdn.com/v4/letter/g/779978/32.png) [@giulianacaula](https://forum.inductiveautomation.com/u/giulianacaula)\
**Post date:** [May 29, 2017, 7:07pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/1 "2017-05-29T19:07:03Z")

</div>

Hi!

I’m new in Soap and I’m trying to connect to a Web Service and it trows me the error “Access Denied”.  
What this particular web service required is some credentials to be able to use it.  
I’ve manage to do in Ignition the script to get the credentials and it works fine. I use this credentials to test if it work in the program SoapUI and it gives me as a response the correct value that I’m looking for, but in Ignition gives me the “Access Denied” error, using the same credentials.

These are the WSDL I use:

- To get the credentials (token and sign): “[https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl](https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl)”
- To get access to the specific web service I’m trying to connect: “[https://fwshomo.afip.gov.ar/wsctg/services/CTGService\_v3.0?wsdl](https://fwshomo.afip.gov.ar/wsctg/services/CTGService_v3.0?wsdl)”

In this last one, the method I want it’s called “consultarCTGActivosPorPatente”

I do the following in a button in Ignition:

from suds.client import Client  
from xml.dom.minidom import parseString  
client = Client(“[https://fwshomo.afip.gov.ar/wsctg/services/CTGService\_v3.0?wsdl](https://fwshomo.afip.gov.ar/wsctg/services/CTGService_v3.0?wsdl)”)

ConsultaCTGActivo = client.service.consultarCTGActivosPorPatente(token,sign,CUIT,patente)

Here is the full error:

Traceback (most recent call last):  
File “event:actionPerformed”, line 32, in   
File “C:\Users\giuli.ignition\cache\gwlocalhost\_8088\_8043\_main\C0\pylib\suds\client.py”, line 542, in **call**  
return client.invoke(args, kwargs)  
File “C:\Users\giuli.ignition\cache\gwlocalhost\_8088\_8043\_main\C0\pylib\suds\client.py”, line 602, in invoke  
result = self.send(soapenv)  
File “C:\Users\giuli.ignition\cache\gwlocalhost\_8088\_8043\_main\C0\pylib\suds\client.py”, line 649, in send  
result = self.failed(binding, e)  
File “C:\Users\giuli.ignition\cache\gwlocalhost\_8088\_8043\_main\C0\pylib\suds\client.py”, line 702, in failed  
r, p = binding.get\_fault(reply)  
File “C:\Users\giuli.ignition\cache\gwlocalhost\_8088\_8043\_main\C0\pylib\suds\bindings\binding.py”, line 265, in get\_fault  
raise WebFault(p, faultroot)  
suds.WebFault: Server raised fault: ‘Acceso Denegado - El token o la firma son nulos.’

```
at org.python.core.PyException.doRaise(PyException.java:219)
at org.python.core.Py.makeException(Py.java:1239)
at org.python.core.Py.makeException(Py.java:1243)
at org.python.core.Py.makeException(Py.java:1247)
at suds.bindings.binding$py.get_fault$14(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\bindings\binding.py:266)
at suds.bindings.binding$py.call_function(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\bindings\binding.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:149)
at org.python.core.PyFunction. __call__ (PyFunction.java:327)
at org.python.core.PyMethod. __call__ (PyMethod.java:124)
at suds.client$py.failed$46(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py:710)
at suds.client$py.call_function(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:166)
at org.python.core.PyFunction. __call__ (PyFunction.java:338)
at org.python.core.PyMethod. __call__ (PyMethod.java:139)
at suds.client$py.send$43(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py:650)
at suds.client$py.call_function(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:149)
at org.python.core.PyFunction. __call__ (PyFunction.java:327)
at org.python.core.PyMethod. __call__ (PyMethod.java:124)
at suds.client$py.invoke$42(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py:608)
at suds.client$py.call_function(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:166)
at org.python.core.PyFunction. __call__ (PyFunction.java:338)
at org.python.core.PyMethod. __call__ (PyMethod.java:139)
at suds.client$py. __call__ $37(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py:542)
at suds.client$py.call_function(C:\Users\giuli\.ignition\cache\gwlocalhost_8088_8043_main\C0\pylib\suds\client.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyBaseCode.call(PyBaseCode.java:301)
at org.python.core.PyBaseCode.call(PyBaseCode.java:194)
at org.python.core.PyFunction. __call__ (PyFunction.java:387)
at org.python.core.PyMethod.instancemethod ___call__ (PyMethod.java:220)
at org.python.core.PyMethod. __call__ (PyMethod.java:211)
at org.python.core.PyMethod. __call__ (PyMethod.java:206)
at org.python.core.PyObject.invoke(PyObject.java:3555)
at org.python.core.PyInstance.instance ___call__ (PyInstance.java:351)
at org.python.core.PyInstance. __call__ (PyInstance.java:342)
at org.python.core.PyObject. __call__ (PyObject.java:387)
at org.python.core.PyObject. __call__ (PyObject.java:391)
at org.python.pycode._pyx62.f$0(<event:actionPerformed>:32)
at org.python.pycode._pyx62.call_function(<event:actionPerformed>)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1275)
at com.inductiveautomation.ignition.common.script.ScriptManager.runCode(ScriptManager.java:647)
at com.inductiveautomation.factorypmi.application.binding.action.ActionAdapter.runActions(ActionAdapter.java:183)
at com.inductiveautomation.factorypmi.application.binding.action.ActionAdapter.invoke(ActionAdapter.java:284)
at com.inductiveautomation.factorypmi.application.binding.action.RelayInvocationHandler.invoke(RelayInvocationHandler.java:55)
at com.sun.proxy.$Proxy29.actionPerformed(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

```

Ignition v7.9.1 (b2017012511)  
Java: Oracle Corporation 1.8.0\_121

If anyone could help me on this I’ll be very much apreciated!

---

<div class="post-metadata">

**Author:** ![keith.adair](https://avatars.discourse-cdn.com/v4/letter/k/eb8c5e/32.png) [@keith.adair](https://forum.inductiveautomation.com/u/keith.adair)\
**Post date:** [June 2, 2017, 5:36pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/2 "2017-06-02T17:36:05Z")

</div>

A quick way to get this set up is to use the Sepasoft Web Service module. SUDS is mostly deprecated and is not really supported very well. The Web Service module allows for rapid implementation of SOAP and RESTful interfaces.

You can read more here:

[https://www.sepasoft.com/web-services/](https://www.sepasoft.com/web-services/)

---

<div class="post-metadata">

**Author:** ![maidamar](https://avatars.discourse-cdn.com/v4/letter/m/0ea827/32.png) [@maidamar](https://forum.inductiveautomation.com/u/maidamar)\
**Post date:** [June 5, 2017, 7:59pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/3 "2017-06-05T19:59:05Z")

</div>

> [@giulianacaula](#):
>
> 'Acceso Denegado - El token o la firma son nulos.'

The error returned says "Access denied, token or firm are null". The Client constructor requires more parameters in this case. The first parameter should be the wsdl url and then username and password:

```auto
from suds.client import Client
client = Client(wsdl_url, username="your_username", password="the_password")

```

---

<div class="post-metadata">

**Author:** ![giulianacaula](https://avatars.discourse-cdn.com/v4/letter/g/779978/32.png) [@giulianacaula](https://forum.inductiveautomation.com/u/giulianacaula)\
**Post date:** [June 6, 2017, 2:17pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/4 "2017-06-06T14:17:17Z")

</div>

Yes, the username and password are the token and sign values. Thank you!!!

The problem is when I try to invoke a method of that client.  
The structure should be the following in (xml format):

```auto
**<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"**
 **xmlns:ctg="http://impl.service.wsctg.afip.gov.ar/CTGService_v2.0/">**
 **<soapenv:Header/>**
 **<soapenv:Body>**
 **<ctg:consultarCTGActivosPorPatente>**
 **<request>**
 **<auth>**
 **<token>?</token>**
 **<sign>?</sign>**
 **<cuitRepresentado>?</cuitRepresentado>**
 **</auth>**
 **<patente>?</patente>**
 **</request>**
 **</ctg:consultarCTGActivosPorPatente>**
 **</soapenv:Body>**
 **</soapenv:Envelope>**

```

Replacing the "?" for actual values;  
token=username, sign=password, cuitRepresentado=this is a personal information of the programmer that use this web service, and patente=is the license plate of a car.

When using this method, I put:

ConsultaCTGActivo = client.service.consultarCTGActivosPorPatente(username=token, password=sign,cuit=CUIT,patente=patente)  
and it trows me the same error as before.

The following is a print of the client you told me

> [@maidamar](#):
>
> from suds.client import Client  
> client = Client(wsdl\_url, username="your\_username", password="the\_password")

Suds ( [Infrastructure/Fedorahosted-retirement - Fedora Project Wiki](https://fedorahosted.org/suds/) ) version: 0.4 GA build: R699-20100913

Service ( CTGService\_v2.0 ) tns="[http://impl.service.wsctg.afip.gov.ar/CTGService\_v2.0/](http://impl.service.wsctg.afip.gov.ar/CTGService_v2.0/)"  
Prefixes (1)  
ns0 = "[http://impl.service.wsctg.afip.gov.ar/CTGService\_v2.0/](http://impl.service.wsctg.afip.gov.ar/CTGService_v2.0/)"  
Ports (1):  
(CTGServiceHttpSoap20Endpoint)  
Methods (23):  
CTGsPendientesResolucion(ctgsPendientesResolucionRequestType request, )  
anularCTG(anularCTGRequestType request, )  
cambiarDestinoDestinatarioCTGRechazado(cambiarDestinoDestinatarioCTGRechazadoRequestType request, )  
confirmarArribo(confirmarArriboRequestType request, )  
confirmarDefinitivo(confirmarDefinitivoRequestType request, )  
consultarCTG(consultarCTGRequestType request, )  
**consultarCTGActivosPorPatente(consultarCTGActivosPorPatenteRequestType request, )**  
consultarCTGExcel(consultarCTGRequestType request, )  
consultarCTGRechazados(consultarCTGRechazadosRequestType request, )  
consultarConstanciaCTGPDF(consultarConstanciaCTGPDFRequestType request, )  
consultarCosechas(consultarCosechasRequestType request, )  
consultarDetalleCTG(consultarDetalleCTGRequestType request, )  
consultarEspecies(consultarEspeciesRequestType request, )  
consultarEstablecimientos(consultarEstablecimientosRequestType request, )  
consultarLocalidadesPorProvincia(consultarLocalidadesPorProvinciaRequestType request, )  
consultarProvincias(consultarProvinciasRequestType request, )  
desviarCTGAOtroDestino(desviarCTGAOtroDestinoRequestType request, )  
desviarCTGAOtroEstablecimiento(desviarCTGAOtroEstablecimientoRequestType request, )  
dummy()  
rechazarCTG(rechazarCTGRequestType request, )  
regresarAOrigenCTGRechazado(regresarAOrigenCTGRechazadoRequestType request, )  
solicitarCTGDatoPendiente(solicitarCTGDatoPendienteRequestType request, )  
solicitarCTGInicial(solicitarCTGInicialRequestType request, )  
Types (118):  
CTGConfirmadosAResolverType  
CTGOtorgadosAResolverType  
CTGRechazadosAResolverType  
CTGsPendientesResolucionResponseType  
CTGsPendientesResolucionReturnType  
CTGsPendientesResolucionType  
anularCTGRequestType  
anularCTGType  
arrayCTGsConfirmadosAResolverType  
arrayCTGsOtorgadosAResolverType  
arrayCTGsRechazadosAResolverType  
arrayConsultarCTGActivosPorPatenteResponseType  
arrayConsultarCTGRechazadosType  
arrayControlType  
arrayCosechasType  
arrayDatosConsultarCTGType  
arrayErroresType  
arrayEspeciesType  
arrayEstablecimientosType  
arrayLocalidadesType  
arrayProvinciasType  
authType  
cambiarDestinoDestinatarioCTGRechazadoRequestType  
cambiarDestinoDestinatarioCTRRechazadoType  
confirmarArriboRequestType  
confirmarArriboType  
confirmarDefinitivoRequestType  
confirmarDefinitivoResponseType  
confirmarDefinitivoReturnType  
confirmarDefinitivoType  
consultarCTGActivosPorPatenteRequestType  
consultarCTGActivosPorPatenteResponseType  
consultarCTGActivosPorPatenteReturnType  
consultarCTGActivosPorPatenteType  
consultarCTGDatosType  
consultarCTGExcelResponseType  
consultarCTGExcelReturnType  
consultarCTGExcelType  
consultarCTGRechazadosRequestType  
consultarCTGRechazadosResponseType  
consultarCTGRechazadosReturnType  
consultarCTGRechazadosType  
consultarCTGRequestType  
consultarCTGResponseType  
consultarCTGReturnType  
consultarCTGType  
consultarConstanciaCTGPDFRequestType  
consultarConstanciaCTGPDFResponseType  
consultarConstanciaCTGPDFReturnType  
consultarConstanciaCTGPDFType  
consultarCosechasRequestType  
consultarCosechasResponseType  
consultarCosechasReturnType  
consultarCosechasType  
consultarDetalleCTGDatosReturnType  
consultarDetalleCTGRequestType  
consultarDetalleCTGResponseType  
consultarDetalleCTGReturnType  
consultarDetalleCTGType  
consultarEspeciesRequestType  
consultarEspeciesResponseType  
consultarEspeciesReturnType  
consultarEspeciesType  
consultarEstablecimientosRequestType  
consultarEstablecimientosResponseType  
consultarEstablecimientosReturnType  
consultarEstablecimientosType  
consultarLocalidadesPorProvinciaRequestType  
consultarLocalidadesPorProvinciaResponseType  
consultarLocalidadesPorProvinciaReturnType  
consultarLocalidadesPorProvinciaType  
consultarProvinciasRequestType  
consultarProvinciasResponseType  
consultarProvinciasReturnType  
consultarProvinciasType  
controlType  
cosechaType  
ctgsPendientesResolucionRequestType  
cuitSimpleType  
datosCTGType  
datosCambiarDestinoDestinatarioCTGRechazadoType  
datosConfirmarArriboType  
datosConfirmarDefinitivoResponseType  
datosConfirmarDefinitivoType  
datosConsultarCTGType  
datosDesviarCTGType  
datosOperacionCTGResponseType  
datosRechazarCTGType  
datosRegresarAOrigenCTGRechazadoType  
datosSolicitarCTGDatoPendienteType  
datosSolicitarCTGInicialType  
datosSolicitarCTGResponseType  
datosSolicitarCTGType  
decimalType  
desviarCTGAOtroDestinoRequestType  
desviarCTGAOtroDestinoType  
desviarCTGAOtroEstablecimientoRequestType  
desviarCTGAOtroEstablecimientoType  
detalleConsultaCTGActivoType  
detalleConsultaCTGRechazadoType  
dummyResponseType  
dummyReturnType  
especieType  
localidadType  
operacionCTGResponseType  
operacionCTGReturnType  
provinciaType  
rechazarCTGRequestType  
rechazarCTGType  
regresarAOrigenCTGRechazadoRequestType  
regresarAOrigenCTGRechazadoType  
solicitarCTGDatoPendienteRequestType  
solicitarCTGDatoPendienteResponseType  
solicitarCTGDatoPendienteType  
solicitarCTGInicialRequestType  
solicitarCTGInicialResponseType  
solicitarCTGInicialType  
solicitarCTGReturnType

I need to use the consultarCTGActivosPorPatente(consultarCTGActivosPorPatenteRequestType request, ) method.

How should I use it ?

---

<div class="post-metadata">

**Author:** ![maidamar](https://avatars.discourse-cdn.com/v4/letter/m/0ea827/32.png) [@maidamar](https://forum.inductiveautomation.com/u/maidamar)\
**Post date:** [June 6, 2017, 2:46pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/5 "2017-06-06T14:46:16Z")

</div>

`request = client.factory.create('consultarCTGActivosPorPatenteRequestType')`

---

<div class="post-metadata">

**Author:** ![giulianacaula](https://avatars.discourse-cdn.com/v4/letter/g/779978/32.png) [@giulianacaula](https://forum.inductiveautomation.com/u/giulianacaula)\
**Post date:** [June 7, 2017, 7:17pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/7 "2017-06-07T19:17:23Z")

</div>

I’ve managed to make it work!!  
Thanks for everything.

---

<div class="post-metadata">

**Author:** ![maidamar](https://avatars.discourse-cdn.com/v4/letter/m/0ea827/32.png) [@maidamar](https://forum.inductiveautomation.com/u/maidamar)\
**Post date:** [June 8, 2017, 9:20pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/8 "2017-06-08T21:20:00Z")

</div>

Care to share your solution? 😉

---

<div class="post-metadata">

**Author:** ![giulianacaula](https://avatars.discourse-cdn.com/v4/letter/g/779978/32.png) [@giulianacaula](https://forum.inductiveautomation.com/u/giulianacaula)\
**Post date:** [November 15, 2017, 2:20pm UTC](https://forum.inductiveautomation.com/t/soap-messages-wsdl/14412/9 "2017-11-15T14:20:55Z")

</div>

This is the script I use in a button to generate it:

import sys, logging  
from suds.client import Client  
from xml.dom.minidom import parseString

- Make a call to the service and create the type of parameter needed to send it.  
client = Client(‘[https://fwshomo.afip.gov.ar/wsctg/services/CTGService\_v3.0?wsdl](https://fwshomo.afip.gov.ar/wsctg/services/CTGService_v3.0?wsdl)’)  
req = client.factory.create(‘consultarCTGActivosPorPatenteRequestType’)

- It require a sub Type “authType” and an integer parameter “license plate”  
auth = client.factory.create(‘authType’)  
auth[‘token’] = token  
auth[‘sign’] = sign  
auth[‘cuitRepresentado’] = Int8Value

- I pass the sub type “auth” data and the license plate  
req[‘auth’] = auth  
req[‘patente’] = stringLicensePlate

- Call the service passing it the parameter type “consultarCTGActivosPorPatenteRequestType” created before  
result = client.service.consultarCTGActivosPorPatente(request=req)

And that’s it!  
Print the response in an area text or you can do whatever you need with it.

Hope it helps!
