Introduction

SMS Digital offers a REST API for SMS communication. Our API uses basic access for authentication and JSON for request and response data.


Complete example in C#, Delphi PHP, and Java.

Note: OpenSSL(32 bits) is required to use the Delphi example.


The following methods are available:


Send

Sends a SMS message for all recipients.

URL

POST https://ws.smsdigital.com.br/sms/envio

Restritions

Max number of recipients
50000

Parameters

Assunto
required only for short marketing
Message subject.
Destinatarios
required
Array containing the mobile number recipients. All numbers must include the area code; all non numeric characters will be removed.
Data
optional
Date (UTC -3, dd/MM/yyyy HH:mm) to send the messages.
Mensagem
required
Message body.
Flash
optional
Whether the message should be sent as flash.

Response

Lote
Batch identification number.
Destinatarios
Array of objects with the following properties:
  • Celular
    Mobile number recipient.
  • Sequencia
    Identification number for this recipient.
Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Messages sent.
  • 2
    Insufficient funds.
  • 3
    Parameter Mensagem must not be null.
  • 4
    For short marketing messages, parameter Assunto must not be null.
  • 5
    Parameter Destinatários must not be null.
  • 6
    Max recipients number (50000) exceeded.
  • 7
    Short marketing messages must not exceeded 160 characters/Subject in short marketing messages must not exceed 20 characters.
StatusMensagem
Description of the request status code.

Example

        
//implementação        
    public class SequenciaSMS
    {
        public long Celular;
        public int Sequencia;
    }
    public class Destinatario
    {
        public string Celular, Assunto, Mensagem;
        public DateTime? Data;
    }
    
    public partial class SMS
    {
        string Usuario, Senha;
        public SMS(string usuario, string senha)
        {
            Usuario = usuario;
            Senha = senha;
        }
        public async Task <SequenciaSMS[]> EnvieSms(string [] destinatarios, string mensagem,
                                                           DateTime? data = null, string assunto = null, bool flash = false  )
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");                
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
                        Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto com os parâmetros de envio
                var envio = new
                {
                    Destinatarios = destinatarios,
                    Mensagem = mensagem,  
                    Data = data ,
                    Assunto = assunto,
                    Flash = flash
                };
                try
                {
                    //fazendo a chamada
                                                 var post = await ws.PostAsync("sms/envio", new StringContent(JsonConvert.SerializeObject(envio), Encoding.UTF8, "application/json"));
                    var resposta = JsonConvert.DeserializeObject<RespostaSMS>(await post.Content.ReadAsStringAsync());

                    if (resposta.Status == StatusEnvio.Sucesso)
                    {
                        //resposta.Destinatarios e resposta.Lote podem ser usados para consultar status, resposta etc
                        return resposta.Destinatarios;
                    }
                    else
                    {
                        //resposta.StatusMensagem explica qual o motivo do não envio
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratar exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }
                      
        class RespostaSMS
        {
            public int Lote;
            public string StatusMensagem;
            public StatusEnvio Status;
            public SequenciaSMS[] Destinatarios;
        }
        enum StatusEnvio
        {
            Erro,
            Sucesso,
            SemCreditos,
            SemMensagem,
            SemAssunto,
            SemDestinatarios,
            MaximoDestinatarios,
            TamanhoExcedido,
            DestinatarioInvalido,
        }
    }  
                    
//exemplo de chamada
/*
var sms = new SMS("usuario", "senha");
var sequencia = await sms.EnvieSms(new string[] { "(17)996333355", "17 9964.53355", "1 7 9 9 6 4 5 3 3 5 5", "17996333355" }, 
                                                "oi", DateTime.Now.AddDays(30));
*/
   
        
        
//implementação 
//instalar antes OpenSSL http://slproweb.com/products/Win32OpenSSL.html
unit TesteApi;
interface
uses Variants, IdHTTP, IdSSLOpenSSL, Classes, SysUtils, JSON, DateUtils,
  RegularExpressions;
type
  TSequenciaSMS = record
    Celular: int64;
    Sequencia: cardinal;
  end;
type
  TSequencias = array of TSequenciaSMS;
    
type
  TWS20 = class
  private
  var
    usuario, senha: string;
  const
    url: string = 'https://ws.smsdigital.com.br/sms/';
    
  function InvoqueMetodo(metodo: string; parametros: TJSONObject)
      : TJSONObject;
    function ProcesseResposta(resposta: TJSONObject): TSequencias;
  public
    constructor Create(usuario: string; senha: string);
    function EnvieSMS(celulares: array of string; Mensagem: string;
      Data: TDateTime; Assunto: string): TSequencias;
    function EnvieSmsPersonalizado(destinatarios: TDestinatarios): TSequencias;
    function ConsulteStatus(sequencias: array of cardinal): TSequenciasStatus;
    function ConsulteResposta(sequencias: array of cardinal): TRespostas;
    function ConsulteSaldo(subUsuario: string = ''): int64;
    function ConsulteMaisClientes(evento: cardinal; senha: string;
      todosCelulares: boolean): TMailings;
    function CadastreEntrevistado(pesquisa: cardinal; Celular: string;
      nome: string; apelido: string; referencia: string): cardinal;
    function CadastreUsuario(login: string; senha: string; Celular: string;
      email: string; nome: string; confirmacao: byte; resposta: byte;
      assinatura: string; vendedor: boolean = false) : int64;
  end;
implementation
constructor TWS20.Create(usuario: string; senha: string);
begin
  self.usuario := usuario;
  self.senha := senha;
end;
function TWS20.InvoqueMetodo(metodo: string; parametros: TJSONObject)
  : TJSONObject;
var
  requerimento: TIdHttp;
begin
  requerimento := TIdHttp.Create(nil);
  try
    requerimento.IOHandler := TIdSSLIOHandlerSOcketOpenSSL.Create(Nil);
    requerimento.Request.ContentType := 'application/json';
    requerimento.Request.CharSet := 'utf-8';
    requerimento.Request.BasicAuthentication := true;
    requerimento.Request.UserName := self.usuario;
    requerimento.Request.Password := self.senha;
    result := TJSONObject.ParseJSONValue
      (TEncoding.ASCII.GetBytes(requerimento.Post(self.url + metodo,
      TStringStream.Create(parametros.ToJSON(), TEncoding.UTF8, true))), 0)
      as TJSONObject;
  except
    on e: Exception do
    begin
      requerimento.Free;
      raise e;
    end;
  end;
end;
function TWS20.ProcesseResposta(resposta: TJSONObject): TSequencias;
var
  destinatarios: TJSONArray;
  sequencias: TSequencias;
  destino: TSequenciaSMS;
  i: integer;
begin
  if resposta.GetValue <TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(resposta.GetValue<TJSONString>
      ('StatusMensagem').Value);
  end
  else
    destinatarios := resposta.GetValue<TJSONArray>('Destinatarios');
  SetLength(sequencias, destinatarios.Count);
  for i := 0 to destinatarios.Count - 1 do
  begin
    destino.Celular := destinatarios.Items[i].GetValue<int64>('Celular');
    destino.Sequencia := destinatarios.Items[i].GetValue<cardinal>('Sequencia');
    sequencias[i] := destino;
  end;
  result := sequencias;
end;
function TWS20.EnvieSMS(celulares: array of string; Mensagem: string;
  Data: TDateTime; Assunto: string): TSequencias;
var
  parametros: TJSONObject;
  destinatarios: TJSONArray;
  i: integer;
begin
  parametros := TJSONObject.Create;
  destinatarios := TJSONArray.Create;
  for i := 0 to Length(celulares) - 1 do
    destinatarios.Add(celulares[i]);
  parametros.AddPair(TJSONPair.Create(TJSONString.Create('Destinatarios'),
    destinatarios));
  parametros.AddPair(TJSONPair.Create(TJSONString.Create('Mensagem'),
    TJSONString.Create(Mensagem)));
  parametros.AddPair(TJSONPair.Create(TJSONString.Create('Data'),
    TJSONString.Create(DateTimeToStr(Data))));
  parametros.AddPair(TJSONPair.Create(TJSONString.Create('Assunto'),
    TJSONString.Create(Assunto)));
  result := self.ProcesseResposta(self.InvoqueMetodo('envio', parametros));
end;
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.EnvieSMS(['17988135454','17988138126'], 'oi', Date() ,'empresa diz' );               
*)


//implementação
class RespostaEnvio {
     public $Lote, $StatusMensagem, $Status, $Destinatarios;
     public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
     }
}
class SMS {    
    //definições básicas
    public $usuario, $senha;
    private $url = 'https://ws.smsdigital.com.br/';
    function __construct($usuario, $senha){
        $this->usuario = $usuario;
        $this->senha = $senha;
     }
    private function invoque_metodo ($metodo, $parametros, $classe){
        //dados da requisição
        $dados = array(
            'http' => array(
                'header'  => array('Content-type: application/json',
                                   'Authorization: Basic ' . base64_encode($this->usuario . ':' . $this->senha)
                                  ),
                'method'  => 'POST',
                'content' => json_encode($parametros),
            ),
        );
       
        //faça a requisição  
        $retorno = file_get_contents($this->url . $metodo, false, stream_context_create($dados));
        
        //crie o tipo da resposta  
        $resposta = new $classe();
        $resposta->set(json_decode($retorno,true));
        return $resposta;
    }
    //definições básicas/
    function envie_sms($destinatarios, $mensagem, $assunto, $data){  
        //parâmetros para envio
        $envio = array(
                    'destinatarios' => $destinatarios,
                    'assunto' => $assunto,
                    'mensagem' => $mensagem,
                    'data' => $data
                 );
        //chamada & resposta
        return $this->invoque_metodo('sms/envio', $envio, 'RespostaEnvio');
    }
}
//exemplo chamada
//$sms = new SMS(usuario, senha);
//$dest = $sms->envie_sms(array('17)996333355', '(17) 9 9 6 3 3 3 3 5 5', '17 9964.53355'), 'oi', '',date('d/MM/yyyy'));

        
//Envio.java
    public class Envio {
	    public String[] destinatarios;
	    public String mensagem;
	    public Date data;
	    public String assunto;
}
//SMSAPi.java    
    public class SMSApi {
        String usuario,
               senha;
        public SMSApi (String usuario, String senha){
            this.usuario = usuario;
            this.senha = senha;
        }
        public SequenciaSms [] envieSms (Envio envio) throws Exception {
            return new InvocarMetodo<RespostaSms, Envio>()
                .invoqueMetodo(this.usuario, this.senha, "envio", envio, RespostaSms.class).destinatarios;
        }
        //dummy para formar objeto no envio
	    static class Dados {
		    public Dados (){}
		    public EnvioPersonalizado [] destinatarios;
		    public int [] sequencias;
		    public String subUsuario;
	    }
	    //assim, temos statusMensagem e status em todas as respostas
	    static class RS {
		    public RS(){}
		    public String statusMensagem;
		    public int status;
	    }	
	    //classes de resposta
	    static class RespostaSms extends RS  {
		    public RespostaSms (){}
		    public int lote;		
		    public SequenciaSms [] destinatarios;
	    }	
    }
//InvocarMetodo.java    
//T é o retorno, U os dados enviados
public class InvocarMetodo<T, U> {
	T invoqueMetodo(String usuario, String senha, String metodo, U dados, Class<T> classeRetorno) throws Exception{
		ObjectMapper mapeador = new ObjectMapper();
		mapeador.setDateFormat(new TicksSinceFormat())
		.setSerializationInclusion(Include.NON_EMPTY).disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
		.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)  
		.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
		T retorno = mapeador.readValue(ClientBuilder.newClient()
				.target("https://ws.smsdigital.com.br/").path("sms/" + metodo)
				.request(MediaType.APPLICATION_JSON_TYPE)
				.header("Authorization", "Basic " + new String(Base64.encode((usuario + ":" + senha).getBytes())))
				.post(Entity.entity(new ObjectMapper().configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
                .writeValueAsString(dados),MediaType.APPLICATION_JSON_TYPE), String.class), classeRetorno );
		
		if (classeRetorno.getSuperclass().getDeclaredField("status").getInt(retorno) != 1)
			throw new Exception ("Metodo retornou: " + classeRetorno.getSuperclass().getDeclaredField("statusMensagem")
                .get(retorno).toString());
		
		return retorno;		
	}
}
//para datas vindas no padrão "/Date(NUMERO)/"
@SuppressWarnings("serial")
class TicksSinceFormat extends DateFormat {
	@Override
	public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) {
		long millis = date.getTime();
		return new StringBuffer("/Date(" + millis + ")/");
	}
	@Override
	public Date parse(String string, ParsePosition position) {
		int start = string.indexOf("(") + 1;
		int end = string.indexOf(")");
		String ms = string.substring(start, end);
		Date date = new Date(Long.parseLong(ms));
		position.setIndex(string.length() - 1); 
		return date;
	}
	@Override
	public Object clone() {
		return new TicksSinceFormat(); 
	}
}
            

Personalized Send

Sends an individual SMS message for each of the recipients.

URL

POST https://ws.smsdigital.com.br/sms/envioPersonalizado

Restrições

Max number of recipients
20000

Parâmetros

Destinatarios
required
Array of objects with the following properties:
  • Assunto
    Message subject for this recipient. Required for short marketing.
  • Celular
    Mobile number recipient. Required. The number must include the area code; all non numeric characters will be removed.
  • Data
    Date (UTC -3, dd/MM/yyyy HH:mm) to send this message. Optional.
  • Mensagem
    Message body for this recipient. Required.

Response

Lote
Batch identification number.
Destinatarios
Array of objects with the following properties:
  • Celular
    Mobile number recipient.
  • Sequencia
    Identification number for this recipient.
Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Messages sent.
  • 2
    Insufficient funds.
  • 3
    Parameter Mensagem must not be null.
  • 4
    For short marketing messages, parameter Assunto must not be null.
  • 5
    Parameter Destinatários must not be null.
  • 6
    Max recipients number (20000) exceeded.
  • 7
    Short marketing messages must not exceeded 160 characters/Subject in short marketing messages must not exceed 20 characters.
StatusMensagem
Description of the request status code.

Example

        
//implementação
    public class Destinatario
    {
        public string Celular, Assunto, Mensagem;
        public DateTime? Data;
    }
    
    public partial class SMS
    {         
        //classes de reposta e status definidas no exemplo sem personalização
        public async Task <SequenciaSMS[]> EnvieSmsPersonalizado(Destinatario[] destinatarios)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                             Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto com os parametros para envio
                var envio = new
                {
                    Destinatarios = destinatarios
                };
                try
                {
                    //fazendo a chamada
                                               var post = await ws.PostAsync("sms/envioPersonalizado", new StringContent(
   JsonConvert.SerializeObject(envio), Encoding.UTF8, "application/json"));
                    var resposta = JsonConvert.DeserializeObject<RespostaSMS>(await post.Content.ReadAsStringAsync());

                    if (resposta.Status == StatusEnvio.Sucesso)
                    {
                        //resposta.Destinatarios e resposta.Lote podem ser usados para consultar status, resposta etc
                        return resposta.Destinatarios;
                    }
                    else
                    {
                        //resposta.StatusMensagem explica qual o motivo do não envio
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratamento exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }       
    }
//exemplo de chamada
/*
var sms = new SMS("usuario", "senha");
var sequenciaPersonalizado = await sms.EnvieSmsPersonalizado(new Destinatario[] {
                         new Destinatario {
                             Celular = "17 9964.53355",
                             Assunto = "SMS Digital",
                             Mensagem = "ola",
                             Data = DateTime.Now
                         },
                         new Destinatario {
                             Celular = "(17)996333355",                          
                             Mensagem = "bom dia",
                             //envio agendado
                             Data = DateTime.Now.AddDays(30)
                         },
                         new Destinatario {
                             Celular = "17996333355",
                             Mensagem = "oi"
                         }
                       });
*/
   
    

//tipos & declarações nos exemplos acima
function TWS20.EnvieSmsPersonalizado(destinatarios: TDestinatarios)
  : TSequencias;    
var
  objeto, parametros: TJSONObject;
  sms: TJSONArray;
  i: integer;
begin
  parametros := TJSONObject.Create;
  sms := TJSONArray.Create;
  for i := 0 to Length(destinatarios) - 1 do
  begin
    objeto := TJSONObject.Create;
    objeto.AddPair(TJSONPair.Create(TJSONString.Create('Celular'),
      TJSONString.Create(destinatarios[i].Celular)));
    objeto.AddPair(TJSONPair.Create(TJSONString.Create('Assunto'),
      TJSONString.Create(destinatarios[i].Assunto)));
    objeto.AddPair(TJSONPair.Create(TJSONString.Create('Mensagem'),
      TJSONString.Create(destinatarios[i].Mensagem)));
    objeto.AddPair(TJSONPair.Create(TJSONString.Create('Data'),
      TJSONString.Create(DateTimeToStr(destinatarios[i].Data))));
    sms.AddElement(objeto);
  end;
  parametros.AddPair(TJSONPair.Create(TJSONString.Create('Destinatarios'), sms));
  result := self.ProcesseResposta(self.InvoqueMetodo('envioPersonalizado', parametros));
end;
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);  
    
 destino.Celular :=     '17988138869';
 destino.Assunto :=     'oi';
 destino.Mensagem :=     'bom dia';
 destino.Data :=     Date(); 
               
 sms.EnvieSMSPersonalizado([destino]);               
*)


//implementação
class SMS {    
  //definições do exemplo acima
   
  function envie_sms_personzalido($destinatarios){
        //parâmetros para envio
        $envio = array ('destinatarios' => $destinatarios); 
        //chamada & resposta
        return $this->invoque_metodo('sms/envioPersonalizado', $envio, 'RespostaEnvio');
    }
}
//exemplo de chamada
//$sms = new SMS(usuario, senha);
//$sms->envie_sms_personzalido(array ( array('celular' => "(17)996333355", 'mensagem' => "bom dia", 'data' => date("dd/MM/yyyy")), 
//                                     array('celular' => "17.99633.3355", 'assunto' => "ola", 'mensagem' => "boa tarde", 'data' => date("dd/MM/yyyy")), 
//                                     array('celular' => "17996333355", 'mensagem' => "oi")
//                                    )
//                             );
    

//outras definições acima
//EnvioPersonalizado.java
public class EnvioPersonalizado {
	public String celular;
	public String mensagem;
	public Date data;
	public String assunto;
}
//SMSApi.java
public class SMSApi{
    public SequenciaSms [] envieSms (EnvioPersonalizado [] envio) throws Exception {
		return new InvocarMetodo<RespostaSms, Dados>()
				.invoqueMetodo(this.usuario, this.senha, "envioPersonalizado",
                             new Dados() {{ destinatarios = envio; }}, RespostaSms.class).destinatarios;
	}
}
    

Status

Note: if possible, it is advised to use URL Status.

Returns the status of a SMS message. Possible status:

Code Status Description
101 Send The message is in the queue to be sent.
104 Error An error ocurred during the comunication with the carrier and the message was not sent.
105 Sent The message was sent, but the carrier have yet to acknowledge the delivery.
106 Not delivered The carrier could not send the message for techinical reasons, e.g.: number does not exist.
107 Delivered The message was sent and the carrier acknowledged the deliver.
108 Blacklist The message was not sent because the recipient was blacklisted. Incurs no charges.
109 Invalid The message was not set because the recipient is either invalid, fixed telephone or nonexistent. Incurs no charges.
112 Cota Excedida Max weekly quota of 5 messages per recipient exceeded. Incurs no charge.
113 Delivered without acknowlegdment The message was sent to a carrier without delivery acknowledgment, e.g.: OI.
114 Spam The message was considered spam. Incurs no charge.
116 Duplicate The same message was sent to the same receipient during a period of 12 hours. Incurs no charge.

URL

POST https://ws.smsdigital.com.br/sms/status

Restritions

Interval between requests
60 seconds
SMS messages sent
In the last 3 days
Status limited
to only the SMS messages sent by the user authenticated in the request

Parameters

Sequencias
required
Array containing the recipient identification numbers.

Response

StatusSequencias
Array of objects with the following properties:
  • Sequencia
    Recipient identification number.
  • StatusCodigo
    Status.
  • StatusDescricao
    Status description.
Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Status returned.
  • 2
    One request allowed each 60 seconds
StatusMensagem
Description of the request status code.

Example

        
//implementação
 public partial class SMS
    {
        public async Task<SequenciaStatus[]> ConsulteStatus(int[] sequencias)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
                                    Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                
                //objeto envio
                var sequenciaSMS = new
                {
                    Sequencias = sequencias
                };
                try
                {
                    //fazendo a chamada
                                                               var post = await ws.PostAsync("sms/status", new StringContent(
                       JsonConvert.SerializeObject(sequenciaSMS), Encoding.UTF8, "application/json"));
                    var resposta = JsonConvert.DeserializeObject<RespostaStatus>(await post.Content.ReadAsStringAsync());

                    if (resposta.Status == StatusResposta.Sucesso)
                    {
                        //StatusSequencias contem o status de cada sequencia
                        return resposta.StatusSequencias;
                    }
                    else
                    {
                        //resposta.StatusMensagem explica por que não voltaram os status
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratamento exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }
        enum StatusResposta
        {
            Erro,
            Sucesso,
            MaximoConsultas
        }
        class RespostaStatus
        {
            public SequenciaStatus[] StatusSequencias;
            public StatusResposta Status;
            public string StatusMensagem;
        }
    }
//exemplo chamada
/*
var sms = new SMS("usuario", "senha");
var statusSMS = await sms.ConsulteStatus(sequencias);
*/
                

        
//tipos & declarações nos exemplos acima
function TWS20.ConsulteStatus(sequencias: array of cardinal): TSequenciasStatus;
var
  objetos: TJSONObject;
  vetor: TJSONArray;
  i: integer;
  status: TStatusSMS;
  sequenciaStatus: TSequenciasStatus;
begin
  objetos := TJSONObject.Create;
  vetor := TJSONArray.Create;
  for i := 0 to Length(sequencias) - 1 do
    vetor.Add(sequencias[i]);
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Sequencias'), vetor));
  objetos := self.InvoqueMetodo('status', objetos);
  if objetos.GetValue <TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(objetos.GetValue<TJSONString>('StatusMensagem').Value);
  end
  else
    vetor := objetos.GetValue<TJSONArray>('StatusSequencias');
  SetLength(sequenciaStatus, vetor.Count);
  for i := 0 to vetor.Count - 1 do
  begin
    status.StatusDescricao := vetor.Items[i].GetValue<string>
      ('StatusDescricao');
    status.Sequencia := vetor.Items[i].GetValue<cardinal>('Sequencia');
    status.StatusCodigo := vetor.Items[i].GetValue<cardinal>('Sequencia');
    sequenciaStatus[i] := status;
  end;
  result := sequenciaStatus;
end;
  
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.ConsulteStatus([271619437, 271619438, 271619440]);
*)                             


//implementação
class RespostaStatus {
    public $StatusSequencias, $StatusCodigo, $StatusMensagem;
    public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
    }
}
class SMS {
    //definições dos exemplos acima
    function consulte_status($sequencias)  {
        $sequencias_sms = array ('sequencias' => $sequencias); 
        //chamada & resposta
        return $this->invoque_metodo('sms/status', $sequencias_sms, 'RespostaStatus');
    }    
}
//exemplo chamada
//$sms = new SMS(usuario, senha);
//$sms->consulte_status(sequencias);


//StatusSequencias.java
public class StatusSequencias {	   
       public int statusCodigo;
       public int sequencia;
}

//SMSApi.java
public class SMSApi {
    public StatusSequencias[] consulteStatus(int [] sequencia) throws Exception{
		return new InvocarMetodo<RespostaStatus, Dados>()
				.invoqueMetodo(this.usuario, this.senha, "status", 
                        new Dados() {{ sequencias = sequencia; }}, RespostaStatus.class).statusSequencias;
	}
    static class RespostaStatus extends RS {
		public RespostaStatus(){}
		public StatusSequencias [] statusSequencias;	
	}	
}
        
        

Consulta status via URL

Note: to enable URL Reply, inform an URL on the SMS Digital plataform: menu Configurações > Webservice.

URL

URL informed on the SMS Digital plataform to which the parameters below will be sent

Possible status:

Code Status Description
101 Send The message is in the queue to be sent.
104 Error An error ocurred during the comunication with the carrier and the message was not sent.
105 Sent The message was sent, but the carrier have yet to acknowledge the delivery.
106 Not delivered The carrier could not send the message for techinical reasons, e.g.: number does not exist.
107 Delivered The message was sent and the carrier acknowledged the deliver.
108 Blacklist The message was not sent because the recipient was blacklisted. Incurs no charges.
109 Invalid The message was not set because the recipient is either invalid, fixed telephone or nonexistent. Incurs no charges.
112 Cota Excedida Max weekly quota of 5 messages per recipient exceeded. Incurs no charge.
113 Delivered without acknowlegdment The message was sent to a carrier without delivery acknowledgment, e.g.: OI.

Parameter

TipoSMS
Number code identifying the plataform:
  • 1
    Short code- SMS Digital
  • 3
    Short code marketing- SMS Digital Marketing
TipoSMSDescricao
Name of the plataform in which the SMS was sent.
Sequencia
Identification number for SMS message sent.
StatusCodigo
Status
StatusDescricao
Status do SMS
Status
Request status code:
  • 1
    Status returned.
StatusMensagem
Description of the request status code.

Reply

Note: if possible, it is advised to use URL Reply.

Returns SMS message replies.

URL

GET https://ws.smsdigital.com.br/sms/resposta

Restritions

Interval between requests
60 seconds
Replies limited
to only the SMS messages sent by the user authenticated in the request

Parameters

Sequencias
required
Array containing the recipient identification numbers.

Response

Respostas
Array of objects with the following properties:
  • Sequencia
    Recipient identification number.
  • Mensagem
    Reply from the recipient.
  • Data
    Reply date.
  • Celular
    Sender's mobile number.
Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Replies returned.
  • 2
    One request allowed each 60 seconds.
StatusMensagem
Description of the request status code.

Example

        
//implementação
   public class Resposta
    {
        public int Sequencia;
        public string Mensagem;
        public DateTime Data;
    }
    public partial class SMS
    {        
        public async Task<Resposta[]> ConsulteResposta(int[] sequencias)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");                        
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                                 Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto envio
                var sequenciasSMS = new {
                    Sequencias = sequencias
                };
                
                try
                {
                                  var post = await ws.PostAsync("sms/resposta", new StringContent(
   JsonConvert.SerializeObject(sequenciasSMS), Encoding.UTF8, "application/json"));
                    var resposta = JsonConvert.DeserializeObject<RetornoSMS>(await post.Content.ReadAsStringAsync());

                    //fazendo a chamada
                    if (resposta.Status == StatusRespostaSMS.Sucesso)
                    {
                        //verificar status
                        return resposta.Respostas;
                    }
                    else
                    {
                        //resposta.StatusMensagem explica por que não voltaram os status
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratamento exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }
        enum StatusRespostaSMS
        {
            Erro,
            Sucesso,
            MaximoConsultas
        }
        class RetornoSMS
        {
            public StatusRespostaSMS Status;
            public string StatusMensagem;
            public Resposta[] Respostas;
        }
    }
//exemplo chamada
/*
var sms = new SMS("usuario","senha");
var respostaSMS = await sms.ConsulteResposta(sequencias);
*/
   
        
//tipos & declarações nos exemplos acima
function TWS20.ConsulteResposta(sequencias: array of cardinal): TRespostas;
var
  objetos: TJSONObject;
  vetor: TJSONArray;
  i: integer;
  resp: TRespostaSMS;
  respostas: TRespostas;
  regex: TRegEx;
begin
  objetos := TJSONObject.Create;
  vetor := TJSONArray.Create;
  regex := TRegEx.Create('\D', [roIgnoreCase, roMultiline]);
  for i := 0 to Length(sequencias) - 1 do
    vetor.Add(sequencias[i]);
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Sequencias'), vetor));
  objetos := self.InvoqueMetodo('resposta', objetos);
  if objetos.GetValue<TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(objetos.GetValue<TJSONString>('StatusMensagem').Value);
  end
  else
    vetor := objetos.GetValue<TJSONArray>('Respostas');
  SetLength(respostas, vetor.Count);
  for i := 0 to vetor.Count - 1 do
  begin
    resp.Mensagem := vetor.Items[i].GetValue<string>('Mensagem');
    resp.Sequencia := vetor.Items[i].GetValue<cardinal>('Sequencia');
    resp.Data := IncSecond(StrToDate('1/1/1970'),
      StrToInt64(regex.Replace(vetor.Items[i].GetValue<string>('Data'), '')));
    respostas[i] := resp;
  end;
  result := respostas;
end;
                                
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.ConsulteResposta([271639150]);
*)


//implementação
class RespostaResposta {
    public $Respostas, $Status, $StatusMensagem;
    public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
    }   
}
class SMS {
     //definições dos exemplos acima
     function consulte_resposta($sequencias)  {
        $sequencias_sms = array ('sequencias' => $sequencias); 
        //chamada & resposta
        return $this->invoque_metodo('sms/resposta', $sequencias_sms, 'RespostaResposta');
    }
}
//exemplo chamada
//$sms = new SMS (usuario,senha);
//$sms->consulte_resposta(sequencias);
            

//Resposta.java
public class Resposta {
	public int Sequencia;
    public String Mensagem;
    public Date Data;
}

//SMSApi.java
public class SMSApi {
    public Resposta [] consulteResposta(int[] sequencia) throws Exception{
        return new InvocarMetodo()
                    .invoqueMetodo(this.usuario, this.senha, "resposta", 
                            new Dados() {{ sequencias = sequencia; }}, RespostaResposta.class).respostas;
        }
    static class RespostaResposta extends RS{
		public RespostaResposta(){}
		public Resposta [] respostas;
	}	
}
                                

URL Reply

Note: to enable URL Reply, inform an URL on the SMS Digital plataform: menu Configurações > Webservice.

URL

URL informed on the SMS Digital plataform to which the parameters below will be sent.

Parameters

TipoSMS
Number code identifying the plataform:
  • 1
    Short code- SMS Digital
  • 3
    Short code marketing- SMS Digital Marketing
TipoSMSDescricao
Name of the plataform in which the SMS was sent.
Sequencia
Identification number for SMS message sent.
Mensagem
SMS message reply.
Data
Reply date.
Status
Request status code:
  • 1
    Reply returned.
StatusMensagem
Description of the request status code.

Balance

Returns an user's or subuser's account balance.

URL

GET https://ws.smsdigital.com.br/sms/saldo

Restrition

Interval between requests
10 seconds

Parameter

Subusuario
optional
Subuser to consult. If null, the balance of the authenticated user will be returned.

Response

Saldo
User's or subuser's balance.
Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Balance returned.
  • 2
    One request allowed each 60 seconds.
  • 3
    Invalid subuser.
StatusMensagem
Description of the request status code.

Example

        
//implementação
  public partial class SMS
    {
        public async Task<int> ConsulteSaldo(string subusuario = null)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
                            Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto de envio
                var parametro = new { 
                    Subusuario= subusuario
                };
                
                try
                {
                    //fazendo a chamada
                                        var post = await ws.PostAsync("sms/saldo", new StringContent(
JsonConvert.SerializeObject(parametro), Encoding.UTF8, "application/json"));
                    var resposta = JsonConvert.DeserializeObject<RespostaSaldo>(await post.Content.ReadAsStringAsync());

                    if (resposta.Status == StatusSaldo.Sucesso)
                    {
                        //saldo atual
                        return resposta.Saldo;
                    }
                    else
                    {
                        //resposta.StatusMensagem explica por que não voltaram os status
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratamento exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }
        enum StatusSaldo
        {
            Erro,
            Sucesso,
            MaximoConsultas,
            UsuarioInvalido
        }
        class RespostaSaldo
        {
            public int Saldo;
            public StatusSaldo Status;
            public string StatusMensagem;
        }
    }
//exemplo chamada
/*var sms = new SMS("usuario", "senha" );
  var saldoSMS = await sms.ConsulteSaldo();
*/
   
        
//tipos & declarações nos exemplos acima
function TWS20.ConsulteSaldo(subUsuario: string = ''): int64;
var
  objeto: TJSONObject;
begin
  objeto := TJSONObject.Create;
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('subUsuario'),
    TJSONString.Create(subUsuario)));
  objeto := self.InvoqueMetodo('saldo', objeto);
  if objeto.GetValue<TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(objeto.GetValue<TJSONString> ('StatusMensagem').Value);
  end
  else
    result := StrToInt64(objeto.GetValue<TJSONNumber>('Saldo').Value);
end;
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.ConsulteSaldo();
*)


//implementação
class RespostaSaldo {
    public $Mailing, $Status, $StatusMensagem;
    public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
    }   
}
class SMS {
     //definições dos exemplos acima
     function consulte_saldo($sub_usuario = '')  {
        $parametro = array ('subUsuario' => $sub_usuario); 
        //chamada & resposta
        return $this->invoque_metodo('sms/saldo', $parametro, 'RespostaSaldo');
    }
}            
//exemplo de chamada
//$sms = new SMS (usuario,senha);
//$sms->consulte_saldo();
            

//SMSApi.java
public class SMSApi {
    public int consulteSaldo() throws Exception{
		return consulteSaldo("");
	}

    public int consulteSaldo(String subusuario) throws Exception{
        return new InvocarMetodo<RespostaSaldo, Dados>()
				.invoqueMetodo(this.usuario, this.senha, "saldo", 
                            new Dados() {{ subUsuario = subusuario; }}, RespostaSaldo.class).saldo;
	}

    static class RespostaSaldo extends RS {
		public RespostaSaldo(){}
		public int saldo;	
	}
}
    

Transfer funds

Transfer funds to a subuser.

URL

POST https://ws.smsdigital.com.br/sms/transferencia

Restrictions

Authenticated user
must be an admnistrator

Parameters

Amount
mandatory
Amount to transfer.
Subuser
mandatory
Subuser to transfer funds to.

Response

Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Operation suscessful.
  • 2
    Invalid operation (subuser does not exist, own user, user is not an administrator, etc.).
  • 3
    Insufficient funds.
StatusMensagem
Description of the request status code.

Exemplo de implementação

        
//implementação         
    public partial class SMS
    {
        public async Task TransfiraCreditos(string Subusuario, uint Quantidade)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto com os parâmetros de transferência
                var transferencia = new
                {
                    Quantidade = Quantidade,
                    Subusuario = Subusuario
                };
                try
                {
                    //fazendo a chamada
                                   var post = await ws.PostAsync("sms/transferencia", new StringContent(
JsonConvert.SerializeObject(transferencia), Encoding.UTF8, "application/json"));
                    var resposta = JsonConvert.DeserializeObject<RespostaTransferencia>(await post.Content.ReadAsStringAsync());

                    if (resposta.Status == StatusTransferencia.Sucesso)
                    {
                        //créditos transferidos
                    }
                    else
                    {
                        //resposta.StatusMensagem explica qual o motivo do não envio
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratar exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        } 
    }
    public enum StatusTransferencia
    {
        Erro,
        Sucesso,
        TransferenciaInvalida,
        CreditosInsuficientesExpirados
    }
    public class RespostaTransferencia
    {
        public StatusTransferencia Status;
        public string StatusMensagem;
    }
                    
//exemplo de chamada
/*
var sms = new SMS("usuario", "senha");
await sms.TransfiraCreditos("subusuario', 500);
*/
   
        
        
//tipos & declarações nos exemplos acima
procedure TWS20.TransfiraCreditos(subUsuario: string; quantidade: integer);
var
  objeto: TJSONObject;
begin
  objeto := TJSONObject.Create;
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('subUsuario'),
    TJSONString.Create(subUsuario)));
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('quantidade'),
    TJSONNumber.Create(quantidade)));
  objeto := self.InvoqueMetodo('transferencia', objeto);
  if objeto.GetValue<TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(objeto.GetValue<TJSONString> ('StatusMensagem').Value);
  end
  else
    //créditos transferidos
end;
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.TransfiraCreditos("subusuario", 500);
*)

    
//implementação
class RespostaTransferencia {
    public $Status, $StatusMensagem;
    public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
    }   
}
class SMS {
     //definições dos exemplos acima
     function transfira_creditos($sub_usuario, $quantidade)  {
        $parametro = array ('subUsuario' => $sub_usuario, 'quantidade' => $quantidade); 
        //chamada & resposta
        return $this->invoque_metodo('sms/transferencia', $parametro, 'RespostaTransferencia');
    }
}            
//exemplo de chamada
//$sms = new SMS (usuario,senha);
//$sms->transfira_creditos('subusuario', quantidade);


//Transferencia.java
public class Transferencia {
	public int quantidade;
    public String subUsuario;
}

//SMSApi.java
public class SMSApi {
    public void transfiraCreditos(Transferencia transferencia) throws Exception{
		new InvocarMetodo()
				.invoqueMetodo(this.usuario, this.senha, "transferencia", transferencia, RespostaRS.class);
	}
    static class RespostaRS extends RS {}

}
    
    

Mais Clientes

Returns the Mais Clientes mailing.

URL

GET https://ws.smsdigital.com.br/sms/mailingMaisClientes

Parameters

Evento
required
Mais Clientes event ID.
Senha
required
Mais Clientes event password.
TodosCelulares
required
Boolean value: true to return all mobile numbers for this event, false to return only new numbers.

Response

Mailing
Array of objects with the following properties:
  • ID
    Identification number for this participant.
  • Celular
    Mobile number of the participant.
  • Campo1
    First field for participant supplied data.
  • Campo2
    Second field for participant supplied data.
  • Campo3
    Third field for participant supplied data.
Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Mailing returned.
  • 2
    Mais Clientes event ID or password invalid.
StatusMensagem
Description of the request status code.

Example

        
//implementação
   public partial class SMS
    {
        public async Task<Mailing[]> ConsulteMaisClientes(int evento, string senha, bool todosCelulares)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
                        Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto para envio
                var maisClientes = new
                {
                    Evento = evento,
                    Senha = senha,
                    TodosCelulares = todosCelulares
                };
                try
                {
                              var post = await ws.PostAsync("sms/mailingMaisClientes", new StringContent(
JsonConvert.SerializeObject(maisClientes), Encoding.UTF8, "application/json"));
                    var resposta = JsonConvert.DeserializeObject<RespostaMailingMaisCliente>(await post.Content.ReadAsStringAsync());
                
                    //fazendo a chamada
                    if (resposta.Status == StatusMailingMaisClientes.Sucesso)
                    {
                        //mailing deste Mais Clientes
                        return resposta.Mailing;
                    }
                    else
                    {
                        //resposta.StatusMensagem explica por que não voltaram os status
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratamento exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }
        enum StatusMailingMaisClientes
        {
            Erro,
            Sucesso,
            EventoInvalido
        }
        class RespostaMailingMaisClientes
        {
            public Mailing[] Mailing;
            public StatusMailingMaisClientes Status;
            public string StatusMensagem;
        }
    }
//exemplo chamada
/*
var sms = new SMS("usuario", "senha" );
var mailingMaisClientes = await sms.ConsulteMaisClientes(id,senha,true);
*/
   
        
//tipos & declarações nos exemplos acima
function TWS20.ConsulteMaisClientes(evento: cardinal; senha: string;
  todosCelulares: boolean): TMailings;
var
  objetos: TJSONObject;
  vetor: TJSONArray;
  i: integer;
  mailing: TMailings;
  ml: TMailingSMS;
begin
  objetos := TJSONObject.Create;
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Evento'),
    TJSONNumber.Create(evento)));
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Senha'),
    TJSONString.Create(senha)));
  if todosCelulares then
  begin
    objetos.AddPair(TJSONPair.Create(TJSONString.Create('TodosCelulares'),
      TJSONTrue.Create()));
  end
  else
    objetos.AddPair(TJSONPair.Create(TJSONString.Create('TodosCelulares'),
      TJSONFalse.Create()));
  objetos := self.InvoqueMetodo('mailingMaisClientes', objetos);
  if objetos.GetValue<TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(objetos.GetValue<TJSONString>
      ('StatusMensagem').Value);
  end
  else
    vetor := objetos.GetValue<TJSONArray>('Mailing');
  SetLength(mailing, vetor.Count);
  for i := 0 to vetor.Count - 1 do
  begin
    ml.ID := vetor.Items[i].GetValue<cardinal>('ID');
    ml.Celular := vetor.Items[i].GetValue<string>('Celular');
    ml.Campo1 := vetor.Items[i].GetValue<string>('Campo1');
    ml.Campo2 := vetor.Items[i].GetValue<string>('Campo2');
    ml.Campo3 := vetor.Items[i].GetValue<string>('Campo3');
    mailing[i] := ml;
  end;
  result := mailing;
end;
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.ConsulteMaisClientes (evento,senha, true);               
*)


//implementação
class RespostaMaisClientes {
    public $Pesquisa, $Celular, $Nome;
    public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
    }  
}
class SMS {
      //definições dos exemplos acima
      function consulte_maisclientes ($evento, $senha, $todosCelulares){
             $parametros = array ('evento' => $evento, 'senha' => $senha ,'todosCelulares' => $todosCelulares); 
            //chamada & resposta
            return $this->invoque_metodo('sms/mailingMaisClientes', $parametros, 'RespostaMaisClientes');
      }
}
//exemplo chamada
//$sms = new SMS (usuario, senha);
//$sms->consulte_maisclientes(evento,senha, true);
            
                        
        
//MaisCliente.java                        
public class MaisCliente {
	public int evento;
	public String senha;
	public boolean todosCelulares;
}
//SMSApi.java
public class SMSApi {
    public Mailing[] consulteMaisClientes (MaisCliente maisCliente) throws Exception {
		return new InvocarMetodo<RespostaMailing, MaisCliente>()
				.invoqueMetodo(this.usuario, this.senha, "mailingMaisClientes", maisCliente, RespostaMailing.class).mailing;
	}
    static class RespostaMailing extends RS {
		public RespostaMailing(){}
		public Mailing[] mailing;	
	}
}

            

New SMS Radar interviewee

Signs up a mobile number for a SMS Radar.

URL

POST https://ws.smsdigital.com.br/sms/entrevistado

Parameters

Pesquisa
required
SMS Radar ID.
Celular
required
Mobile number to send the poll.
Nome
optional
Interviewee's name.
Apelido
optional
Interviewee's preferred name.
Referencia
optional
SMS Radar reference code.
Date
opcional
Date to send the poll(dd/mm format).

Response

Sequencia
Number code for this interviewee.
Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    Interviewee succesfuly signed up.
  • 2
    Required fields (Celular, Pesquisa) missing or invalid mobile number .
  • 3
    Invalid SMS Radar ID .
StatusMensagem
Description of the request status code.

Example

        
//implementation
  public partial class SMS
    {
        public async Task<int> CadastreEntrevistado(int pesquisa, string celular, string nome = null,
                 string apelido = null, string referencia = null)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
                        Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto com parametros
                var entrevistado = new
                {
                    Pesquisa = pesquisa,
                    Celular = celular,
                    Nome = nome,
                    Apelido = apelido,
                    Referencia = referencia
                };
                try
                {
                    //fazendo a chamada
                                  var post = await ws.PostAsync("sms/entrevistado", new StringContent(
JsonConvert.SerializeObject(entrevistado), Encoding.UTF8, "application/json"));
                                     var resposta = JsonConvert.DeserializeObject<RespostaEntrevistado>(await post.Content.ReadAsStringAsync());

                    if (resposta.Status == StatusEntrevistado.Sucesso)
                    {
                        //identificador do entrevistado
                        return resposta.Sequencia;
                    }
                    else
                    {
                        //resposta.StatusMensagem explica por que não foi cadastrado o entrevistado
                        throw new Exception(resposta.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratamento exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }
        enum StatusEntrevistado
        {
            Erro,
            Sucesso,
            CamposInvalidos,
            PesquisaInvalida
        }
        class RespostaEntrevistado
        {
            public int Sequencia;
            public StatusEntrevistado Status;
            public string StatusMensagem;
        }
    }
//exemplo chamada
/*
var entrevistado = await sms.CadastreEntrevistado(40,"17915788869");
*/
   
        
//tipos & declarações nos exemplos acima
function TWS20.CadastreEntrevistado(pesquisa: cardinal; Celular: string;
  nome: string; apelido: string; referencia: string): cardinal;
var
  objetos: TJSONObject;
  vetor: TJSONArray;
  i: integer;
  mailing: TMailings;
  ml: TMailingSMS;
begin
  objetos := TJSONObject.Create;
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Pesquisa'),
    TJSONNumber.Create(pesquisa)));
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Celular'),
    TJSONString.Create(Celular)));
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Nome'),
    TJSONString.Create(nome)));
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Apelido'),
    TJSONString.Create(apelido)));
  objetos.AddPair(TJSONPair.Create(TJSONString.Create('Referencia'),
    TJSONString.Create(referencia)));
  objetos := self.InvoqueMetodo('entrevistado', objetos);
  if objetos.GetValue<TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(objetos.GetValue<TJSONString>('StatusMensagem').Value);
  end
  else
    result := StrToInt(objetos.GetValue<TJSONNumber>('Sequencia').Value);
end;
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.CadastreEntrevistado(40,'179917579492','nome','apelido','');                
*)


//implementação
class RespostaEntrevistado {
    public $Sequencia, $Status, $Celular, $StatusMensagem;
    public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
    }  
}
class SMS {    
    //definições nos exemplos acima
    function cadastre_entrevistado ($pesquisa, $celular, $nome){
        $parametros = array ('pesquisa' => $pesquisa, 'celular' => $celular ,'nome' => $nome); 
        //chamada & resposta
        return $this->invoque_metodo('sms/entrevistado', $parametros, 'RespostaEntrevistado');
    }
}
//exemplo chamada
//$sms = new SMS (usuario, senha);
//$sms->cadastre_entrevistado(pesquisa,celular, nome);


    //outras definições nos exemplo acima
    //Entrevistado.java
    package br.com.smsdigital;
    public class Entrevistado {
    	    public int pesquisa;
	        public String celular,
	 		              nome,
	 			          apelido,
	 			          referencia;
        }
    
    //SMSApi.java    
    public class SMSApi {
            public int cadastreEntrevistado(Entrevistado entrevistado) throws Exception{
		        return new InvocarMetodo<RespostaRadar, Entrevistado>()
				        .invoqueMetodo(this.usuario, this.senha, "entrevistado", entrevistado, RespostaRadar.class).sequencia;
	        }

            static class RespostaRadar extends RS {
		        public RespostaRadar (){}
		        public int sequencia;
	        }
    }    
    

New User

Creates a new user account on the plataform.

URL

POST https://ws.smsdigital.com.br/sms/usuario

Restritions

Max number of salespeople for HOME franchises
1
Max number of salespeople for FULL franchises
6
Max number of user accounts for LIGHT franchises
2

Parameters

Login
required
Username, must be at least 6 characteres in length.
Senha
required
Password, must be at least 6 characteres in length and not the same as the username.
Celular
required
Mobile number with area code.
Email
required
Email addres.
UrlWebService
opcional
Url to call for status and replies updates.
Nome
required
Name.
Confirmacao
required
Value indicating SMS delivery acknowledgment. Possible values:
  • 0
    Do not receive acknowledgement.
  • 1
    Receive acknowledgement by SMS(Incurs in change).
  • 2
    Receive acknowledgement by e-mail.
  • 3
    Receive acknowledgement by SMS and e-mail (Incurs charge).
Response
required
Value indicating replies. Possible values:
  • 0
    Do not receive replies.
  • 1
    Recieve replies by SMS(Incurs charge).
  • 2
    Recieve replies by e-mail.
  • 3
    Recieve replies by SMS e e-mail (Incurs charge).
Assinatura
optional
Default SMS signature for this user.
Vendedor
optional
Boolean value indicating whether this user account is a salesperson.

Response

Status
Request status code:
  • 0
    An exception ocurred during the request.
  • 1
    User created.
  • 2
    Salesperson or user account quota exceed.
  • 3
    Username already in use.
  • 4
    Required fields (Celular, Nome,Email, Confirmacao, Resposta, Login, Senha) missing.
  • 5
    Celular, Login, Email or Senha invalid.
StatusMensagem
Description of the request status code.

Example

        
//implementação
public enum ConfirmacaoRespostaPor
    {
        Nao,
        PorSMS,
        PorEmail,
        PorSMSEmail
    }
    public partial class SMS
    {
        public async Task CadastreUsuario(string login, string senha, string celular, string email, string nome,
             ConfirmacaoRespostaPor confirmacao, ConfirmacaoRespostaPor resposta, string assinatura = null, bool vendedor = false)
        {
            using (var ws = new HttpClient())
            {
                ws.BaseAddress = new Uri("https://ws.smsdigital.com.br/");
                ws.DefaultRequestHeaders.Accept.Clear();
                ws.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                ws.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                                     Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", Usuario, Senha))));
                //objeto para envio
                var novoUsuario = new
                {
                    Login = login,
                    Senha = senha,
                    Celular = celular,
                    Email = email,
                    Nome = nome,
                    Confirmacao = confirmacao,
                    Resposta = resposta,
                    Assinatura = assinatura,
                    Vendedor = vendedor
                };
                try
                {
                    //fazendo a chamada
                               var post = await ws.PostAsync("sms/usuario", new StringContent(
JsonConvert.SerializeObject(novoUsuario), Encoding.UTF8, "application/json"));
                    var retorno = JsonConvert.DeserializeObject<RespostaUsuario>(await post.Content.ReadAsStringAsync());

                    if (retorno.Status == StatusUsuario.Sucesso)
                    {
                        //usuário cadastrado
                    }
                    else
                    {
                        //resposta.StatusMensagem explica por que não foi cadastrado o usuário
                        throw new Exception(retorno.StatusMensagem);
                    }
                }
                catch (Exception ex)
                {
                    //tratamento exceção, conferir usuário/senha, url etc
                    throw ex;
                }
            }
        }
        
        enum StatusUsuario
        {
            Erro,
            Sucesso,
            CotaExcedida,
            UsuarioExistente,
            CamposObrigatorios,
            CamposInvalidos
        }
        class RespostaUsuario
        {
            public StatusUsuario Status;
            public string StatusMensagem;
        }
    }
//exemplo de chamada
/*
await sms.CadastreUsuario("superusuario", "supersenhasecreta", "17911338864", 
            "email@dominio.com", "Usuário Web", ConfirmacaoRespostaPor.Nao, ConfirmacaoRespostaPor.Nao);
*/
   
        
//tipos & declarações nos exemplos acima
function TWS20.CadastreUsuario(login: string; senha: string; Celular: string;
  email: string; nome: string; confirmacao: byte; resposta: byte;
  assinatura: string; vendedor: boolean = false) : int64;
var
  objeto: TJSONObject;
  vetor: TJSONArray;
  i: integer;
  mailing: TMailings;
  ml: TMailingSMS;
begin
  objeto := TJSONObject.Create;
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('Senha'),
    TJSONNumber.Create(senha)));
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('Celular'),
    TJSONString.Create(Celular)));
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('Nome'),
    TJSONString.Create(nome)));
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('Login'),
    TJSONString.Create(login)));
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('Email'),
    TJSONString.Create(email)));
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('Assinatura'),
    TJSONString.Create(assinatura)));
   objeto.AddPair(TJSONPair.Create(TJSONString.Create('Resposta'),
    TJSONNumber.Create(resposta)));
  objeto.AddPair(TJSONPair.Create(TJSONString.Create('Confirmacao'),
    TJSONNumber.Create(confirmacao)));
  if vendedor then
  begin
    objeto.AddPair(TJSONPair.Create(TJSONString.Create('Vendedor'),
      TJSONTrue.Create()));
  end
  else
    objeto.AddPair(TJSONPair.Create(TJSONString.Create('Vendedor'),
      TJSONFalse.Create()));
  objeto := self.InvoqueMetodo('usuario', objeto);
  if objeto.GetValue<TJSONString>('Status').Value <> '1' then
  // verificar causa
  begin
    raise Exception.Create(objeto.GetValue<TJSONString>
      ('StatusMensagem').Value);
  end
  else
    result := StrToInt(objeto.GetValue<TJSONNumber>('Status').Value);
end;
                                  
(* exemplo chamada 
 sms := TWS20.Create(usuario,senha);            
 sms.CadastreUsuario('usuario','senhausuario','17988134541', 'email@email.com','nome',1,1,'assinatura');
*)   

 
//implementação
class RespostaUsuario {
    public $Status;
    public function set($data) {
        foreach ($data AS $key => $value) $this->{$key} = $value;
    } 
}
class SMS {
    //definições dos exemplos acima
    function cadastre_usuario ($login, $senha, $celular, $email, $nome, $confirmacao, $resposta) {
        $parametros = array ('login' => $login, 'senha' => $senha, 'celular' => $celular, 'email' => $email,'nome' => $nome,
                             'confirmacao' => $confirmacao, 'resposta' => $resposta); 
        //chamada & resposta
        return $this->invoque_metodo('sms/usuario', $parametros, 'RespostaUsuario');
    }
}
//exemplo chamada
//$sms = new SMS(usuario, senha);
//$sms->cadastre_usuario(login, senha, celular, email, nome, 0, 0);                        
            


© SMS Digital 2012