Não tem a ver com o seu erro, apenas sobre o que falei da classe não estar preparada pro envelope desse retorno.
Alterei no método XmlSoapPost() isto, acrescentando o bloco ELSEIF com esse "novo" envelope:
IF "<soap:Body>" $ ::cXmlRetorno .AND. "</soap:Body>" $ ::cXmlRetorno
::cXmlRetorno := XmlNode( ::cXmlRetorno, "soap:Body" )
ELSEIF "<soapenv:Body>" $ ::cXmlRetorno .AND. "</soapenv:Body>" $ ::cXmlRetorno
::cXmlRetorno := XmlNode( ::cXmlRetorno, "soapenv:Body" )
ELSE
::cXmlRetorno := "Erro SOAP: XML retorno não está no padrão " + ::cXmlRetorno
ENDIF
E está aí uma coisa que mencionei: Encontramos uma diferença entre SP e MS.
Tem um padrão nacional? Tem, mas... acontece.
Nota:
Criei essa rotina pra facilitar analisar o XML de retorno, pra retirar a parte do envelope, deixando o XML menor.
Sem ela, tudo bem, vém o retorno completo, com envelope e tudo.
E com ela, se o retorno for diferente, também vém completo.
De qualquer forma, o importante continua sendo a comunicação.
E outra coisa que mencionei: novamente "letras". 3 letras
SP usa "soap" e MS usa "soapenv"
Até pensei se no envio não poderia ser algo desse tipo causando erro.... mas se fosse, aqui também daria erro.
Um teste interessante: abrir o webservice direto no navegador. Geralmente o webservice fornece um manual.