Requisição de Web API com Certificado

Olá @Rafael!

Para adaptar o código, você precisa considerar que o Latromi espera um código que possa ser executado dentro de um método. É como um “Bloco anônimo” de código C#.

Então primeiramente, precisamos remover a declaração de classes e de métodos, deixando apenas o código que será executado.

Ao invés de receber os dados dos argumentos do método C#, precisamos modificar para buscar de Variáveis, Campos ou Argumentos (do Procedimento). E quanto ao resultado, precisamos devolver o valor para uma Variável ou Campo do Formulário.

Segue abaixo o código adaptado:

using System;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using Newtonsoft.Json;

// Recebe "clientId" e "secret" via parâmetros do procedimento (argumentos);
string clientId = (string)Arguments["clientId"].Value;
string clientSecret = (string)Arguments["secret"].Value;

string tokenEndpoint = "ENDPOINT_API";
string grantType = "client_credentials";
string certificatePath = "PATH_CERTIFICADO";
string certificatePassword = "SENHA_CERTIFICADO";

// Limpa variável do Form que armazena o "access_token"
Variables["v_access_token"].Value = "";

try
{
    X509Certificate2 certificate = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.DefaultKeySet);

    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(tokenEndpoint);
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";
    request.ClientCertificates.Add(certificate);

    var data = Encoding.ASCII.GetBytes($"grant_type={Uri.EscapeDataString(grantType)}&client_id={Uri.EscapeDataString(clientId)}&client_secret={Uri.EscapeDataString(clientSecret)}");
    request.ContentLength = data.Length;

    using (Stream stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
    {
        string jsonResponse = reader.ReadToEnd();
        var tokenResponse = JsonConvert.DeserializeObject<dynamic>(jsonResponse);

        // Preenche variável do Formulário com o "access_token"
        Variables["v_access_token"].Value = tokenResponse.access_token;
    }
}
catch (WebException webEx)
{
    string responseText = string.Empty;
    if (webEx.Response != null)
    {
        using (var streamReader = new StreamReader(webEx.Response.GetResponseStream()))
        {
            responseText = streamReader.ReadToEnd();
        }
    }

    throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + webEx.Message + "\r\nResposta: " + responseText);
}
catch (Exception ex)
{
    throw new Exception("Erro ao solicitar o token.\r\nDetalhe: " + ex.Message);
}
A seção de declações "using" não é aceita dentro de um método, mas o Latromi trata este bloco de uma maneira especial.

Note que estou recebendo os valores de “clientId” e “secret” da propriedade “Arguments” (argumentos do Procedimento):

Note também que o resultado está sendo retornado para a variável do Formulário “v_access_token”:

 // Preenche variável do Formulário com o "access_token"
 Variables["v_access_token"].Value = tokenResponse.access_token;

Agora basta chamar este procedimento a partir de outro, como por exemplo, a partir do Procedimento associado ao Click de um botão. Para chamar um procedimento, use a ação “Chamar Procedimento”.

Para finalizar, vou deixar o link de alguns tópicos relacionados ao assunto: