public static string GenerarCodigoVerificacion(this WhatsappSenderDto sender)
        {
            var generador = new Random();

            int[] codigo = new int[4];

            for (int i = 0; i < codigo.Length; i++)
            {
                codigo[i] = generador.Next(0, 9);
            }

            return(String.Join("", codigo.Select(p => p.ToString()).ToArray()));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Método que genera el código de verificación y envía el mensaje.
        /// </summary>
        /// <param name="modeloMensaje">Dto que posee los datos para poder utilizar el método</param>
        /// <param name="método">Tipo de forma de verificación que desea el usuario</param>
        /// <returns><see cref="MensajeResult"/> Con los datos de operación exitósa o error.</returns>

        #region Método para Enviar Mensaje
        public async Task <MensajeResult> EnviarMensaje(WhatsappSenderDto modeloMensaje, FormaVerificacion método, string email)
        {
            //Iniciamos el cliente de Twilio con nuestro User Id proporcionado por la página y la apiKey

            TwilioClient.Init(_config["Twilio:UID"], _config["Twilio:ApiKey"]);

            //Usamos la extenisón de WhastappSenderDto para llamar al método que genera el código de forma aleatoria

            var codigo = modeloMensaje.GenerarCodigoVerificacion();


            //Verificamos si el usuario es un email o el nombre de Usuario y lo buscamos.

            var user = email.Contains("@") ? await _userManager.FindByEmailAsync(email) : await
                       _userManager.FindByNameAsync(email);

            //Si no se encontró el  usuario
            //Devolvemos un MensajeResult con los datos del error
            if (user == null)
            {
                return new MensajeResult
                       {
                           MsgError  = "No se encontró el usuario al cual enviarle un sms",
                           Body      = null,
                           Succesful = false
                       }
            }
            ;

            //En caso de que el usuario SI se encuentre
            //Verificamos que forma de verificación está usando el usuario y entramos al switch

            switch (método)
            {
            //Caso de que elija Whatsapp

            case FormaVerificacion.Whatsapp:
                ///<summary>
                //Invocamos la API y mentira MessageResource creamos al mensaje
                ///<param>from: Mensaje desde donde saldrá el mensaje, éste debe ser nuestro n° twilio</param>
                ///<param>body: Cuerpo del mensaje que enviaremos en este caso el mensaje más el código</param>
                ///<param>to: teléfono de la persona a la que se le enviará el mensaje
                ///NOTA: El formato del n° de teléfono es E 164
                /// <see cref="https://www.twilio.com/docs/glossary/what-e164"/>
                /// </summary>
                var message = await MessageResource.CreateAsync(
                    from : new Twilio.Types.PhoneNumber("whatsapp:+14155238886"),
                    body : modeloMensaje.Mensaje + codigo,
                    to : new Twilio.Types.PhoneNumber($"whatsapp:{modeloMensaje.Telefono}"));

                //Si el Status del mensaje es Queued(solicitado)
                //NOTA: Habría que crear un método capaz de ir al servidor y verificar si el status ya es entregado
                //o si ocurrió algún error
                if (message.Status == MessageResource.StatusEnum.Queued)
                {
                    //Invocamos al método para colocar el código den los cookies
                    _creator.Set(codigo);

                    //Guardamos el teléfono en el usuario
                    user.PhoneNumber = modeloMensaje.Telefono.ToString();
                    //Modificamos el usuario en la DB
                    await _userManager.UpdateAsync(user);

                    //Enviamos un Result con el objeto serializado a Json
                    return(new MensajeResult
                    {
                        Succesful = true,
                        MsgError = null,
                        Body = JsonConvert.SerializeObject(new TwilioResponse
                        {
                            Body = message.Body,
                            From = message.From.ToString(),
                            To = message.To.ToString(),
                            Codigo = codigo
                        })
                    });
                }



                return(new MensajeResult
                {
                    Succesful = false,
                    MsgError = "Hubo un error al enviar su mensaje",
                    Body = JsonConvert.SerializeObject(message.ErrorMessage + message.ErrorCode.ToString())
                });

            case FormaVerificacion.SMS:
                var verificationSms = await MessageResource.CreateAsync(
                    from : new PhoneNumber("+14155992671"),
                    to : new PhoneNumber("+12069419717"),
                    messagingServiceSid : _config["Twilio:MSID"],
                    body : modeloMensaje.Mensaje + modeloMensaje.GenerarCodigoVerificacion());

                if (verificationSms.Status == MessageResource.StatusEnum.Queued)
                {
                    return new MensajeResult
                           {
                               Succesful = true,
                               MsgError  = null,
                               Body      = JsonConvert.SerializeObject(new TwilioResponse
                        {
                            Body   = verificationSms.Body,
                            From   = verificationSms.From.ToString(),
                            To     = verificationSms.To.ToString(),
                            Codigo = codigo
                        })
                           }
                }
                ;

                return(new MensajeResult
                {
                    MsgError = "Hubo un error al enviar su mensaje",
                    Body = JsonConvert.SerializeObject(verificationSms.ErrorMessage + verificationSms.ErrorCode.ToString()),
                    Succesful = false
                });



            default:
                return(new MensajeResult
                {
                    MsgError = "El método al que intenta acceder no existe",
                    Body = null,
                    Succesful = false
                });
            }
        }