Um texto pode chegar depois que o telefone se reconecta, mesmo que o remetente o tenha enviado antes.
O que significa armazenar e encaminhar?
O centro de mensagens salva um texto antes de tentar entregá-lo ao telefone.
A aceitação pela rede não confirma que o telefone recebeu o texto. Um telefone desligado ou inacessível pode deixar a mensagem em espera. Reconectar o telefone torna possível uma nova tentativa de entrega. A mensagem precisa continuar elegível para essa tentativa.
A especificação 3GPP 23.040 descreve o papel do centro em SMS.
Por quanto tempo uma mensagem pode esperar?
A rede pode fazer novas tentativas de entrega enquanto a janela de entrega da mensagem permanece aberta. Essa janela é chamada de período de validade.
O padrão SMS permite que remetentes informem um período de validade. Seu provedor decide se você pode defini-lo por meio da API dele.
A entrega pode resultar em expiração quando essa janela se fecha. Um relatório de expiração não significa que a solicitação de envio original falhou.
Em um fluxo sensível ao tempo, o prazo da própria aplicação ainda precisa ser aplicado. Se um código de verificação é válido por dez minutos e chega após quatro horas, seu servidor deve rejeitá-lo. Um texto atrasado não deve estender o tempo de vida da ação que ele descreve.
Onde o centro se posiciona em relação à minha aplicação?
Sua aplicação pode alcançar um centro de mensagens por meio de um provedor de mensagens, em vez de gerenciar a conexão com a operadora diretamente.
Provedores usam SMPP para enviar textos a centros de mensagens, diretamente ou por meio de outros serviços de roteamento. A referência SMPP descreve essas conexões.
Seu provedor pode confirmar uma solicitação antes de o próximo serviço de rede aceitá-la. O centro de mensagens pode então aceitar o texto antes de o telefone recebê-lo. Cada confirmação descreve uma etapa do percurso.
Aceito, mas não entregue explica como essas etapas aparecem em uma aplicação.
O que posso observar pelo Bird?
Você pode inspecionar a transferência para a operadora e a entrega reportada sem se conectar a um centro de mensagens.
O campo sent_at da resposta da mensagem registra quando Bird entrega a mensagem à operadora. delivered_at registra a entrega confirmada. Ambos os campos contêm um timestamp ou null. A ausência de um horário de entrega não significa que o telefone rejeitou o texto.
O endpoint de envio de Bird rejeita validity_period com HTTP 422 SMSUnsupportedFeature. Você não pode definir a janela de retenção da operadora por meio desse campo. A resposta não retorna esse campo.
Bird emite sms.expired quando a operadora reporta expiração. Um recibo em buffer, ou seja, quando a operadora retém o texto, não produz mudança pública de status. Recibos de entrega explica quais relatórios da rede chegam à sua aplicação.
O que isso muda em um fluxo de envio?
Sua aplicação precisa tratar a entrega como um evento posterior, com um resultado separado do envio.
Mantenha um resultado pendente distinto de uma falha. Aplique prazos para códigos de verificação e outras ações sensíveis ao tempo na sua aplicação. Use um recibo de entrega como o relatório da rede sobre a entrega. Ele não prova que alguém leu o texto.
Em resumo
Aceitação e entrega são etapas separadas.
Um centro de mensagens pode aceitar um texto antes de o telefone do destinatário ficar acessível.
O armazenamento dá à entrega outra oportunidade.
Um texto em espera pode chegar depois que o telefone se reconecta, desde que a janela de entrega ainda esteja aberta.
A janela de entrega é finita.
A rede pode reportar expiração quando o período de espera termina.
Sua integração não precisa se conectar diretamente.
Um provedor de mensagens pode gerenciar a conexão entre sua aplicação e a rede da operadora.