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);
}
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: