Pular para o conteúdo principal

Integração

Neste documento serão descritos os passos para realizar a integração com a API do SMS.

Configuração do Acesso Cidadão

  1. Solicitar via SA o acesso ao Acesso Cidadão Admin;
  2. Criar um sistema para a aplicação que irá consumir a Api de SMS;
  3. Após criar o sistema, deve ser criado um APP com as configurações:
    • Fluxo: ClientCredentials
    • Scopes de Api: api-sistema-sms-acesso
  4. Solicitar ao Prodest a criação de um usuário na Api de SMS;
Atenção

Caso o scope acima não esteja disponível na lista entrar em contato via SA.

Telas do AC Admin para criação de um no APP:

Novo APP

Apps

Criação de um APP com o fluxo Client Credentials

ClientCredentials

Editando um APP para adicionar o scope de SMS

AppEditar

APP novo sem nenhum scope

ClientCredentials

Scope de SMS adicionado

ClientCredentials

Testando a integração

Swagger

  1. Acesse o endereço da Api de SMS em um nova aba;
  2. Volte ao AC Admin e gere um access token no APP criado anteriormente;
  3. Clique no botão Authorize e cole o token no campo indicado;
  4. Vá até a seção SMS e clique no endpoint /v2/enviar e preencha os dados solicitados;
    • O campo agendamento é opcional e pode ser removido para envio instantâneo;
    • O campo idMensagem pode ser o valor do client_id criado anteriormente;
  5. Clique em enviar e se tudo estiver correto você receberá o retorno conforme a imagem abaixo;

Telas para realizar o teste via swagger:

Swagger

Swagger

Botão para gerar token de teste no AC Admin

GerarToken

Token gerado

TokenGerado

Usando o token gerado no swagger

TokenGerado

Enviando um SMS

SMS

SMS enviado com sucesso

SMSEnviado

Dotnet

Atenção

Os códigos abaixo são apenas para demonstração, aplique as melhores práticas ao implementar em produção.

appsettings.json

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"SmsApiClient": {
"Authority": "https://acessocidadao.es.gov.br/is/",
"ClientId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"ClientSecret": "s3nh@$up3rS3cre74",
"RequireHttpsMetadata": "true",
"ResponseType": "code id_token",
"SaveTokens": "true",
"Scopes": [
"api-sistema-sms-acesso"
]
}
}

Program.cs

using Microsoft.AspNetCore.Mvc;
using WebApplication2;

var builder = WebApplication.CreateBuilder(args);

builder.Services
.AddOptions<ApiClientConfiguration>()
.BindConfiguration("SmsApiClient");

builder.Services
.AddHttpClient<SmsApiClient>(options =>
{
options.BaseAddress = new Uri("https://api.sms.es.gov.br");
});

var app = builder.Build();

app.MapPost("/enviaSms", async ([FromBody] SmsDto sms, [FromServices] SmsApiClient apiClient) =>
{
var resposta = await apiClient.EnviaSmsAsync(sms);

return resposta;
});

await app.RunAsync();

// ReSharper disable ClassNeverInstantiated.Global
public sealed record ApiClientConfiguration(
string Authority, string ClientId, string ClientSecret, string[] Scopes
)
{
public ApiClientConfiguration() : this("", "", "", Array.Empty<string>())
{
}
}

internal sealed record SmsDto(string Mensagem, string Numero);

SmsApiClient.cs

using IdentityModel.Client;
using Microsoft.Extensions.Options;

namespace WebApplication2;

public sealed class SmsApiClient
{
private readonly ApiClientConfiguration _apiClientConfiguration;
private readonly HttpClient _httpClient;

public SmsApiClient(
IOptions<ApiClientConfiguration> apiClientConfiguration,
HttpClient httpClient
)
{
_apiClientConfiguration = apiClientConfiguration.Value;
_httpClient = httpClient;
}

internal async ValueTask<RespostaSms> EnviaSmsAsync(SmsDto sms)
{
var tokenRequest = await _httpClient.RequestClientCredentialsTokenAsync(
new ClientCredentialsTokenRequest
{
Address = $"{_apiClientConfiguration.Authority}connect/token",
ClientId = _apiClientConfiguration.ClientId,
ClientSecret = _apiClientConfiguration.ClientSecret,
ClientCredentialStyle = ClientCredentialStyle.PostBody,
Scope = string.Join(" ", _apiClientConfiguration.Scopes)
}
);

_httpClient.DefaultRequestHeaders
.Add("Authorization", $"Bearer {tokenRequest.AccessToken}");

var response = await _httpClient.PostAsJsonAsync("/v2/enviar", new
{
Mensagens = new[]
{
new MensagemSms
{
IdMensagem = _apiClientConfiguration.ClientId,
Destinatarios = new[]
{
sms.Numero
},
Mensagem = sms.Mensagem
}
}
});

if (response is { IsSuccessStatusCode: false })
{
return new RespostaSms
{
Sucesso = false,
Resposta = "Erro ao enviar o SMS"
};
}

var smsResposta = await response.Content
.ReadFromJsonAsync<RespostaSms>();

return smsResposta!;
}
}

internal sealed class MensagemSms
{
public string? IdMensagem { get; set; }

public string[]? Destinatarios { get; set; }

public string? Mensagem { get; set; }
}

internal sealed class RespostaSms
{
public bool Sucesso { get; set; }

public string? Resposta { get; set; }

public int Lote { get; set; }
}

Administração de recursos

Cada orgão é responsável por gerir os créditos alocados para a organização. Para mais informações consulte o manual do atual provedor de SMS.