最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录。
一、发送消息
没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一下。
在这个部分写了两个类文件:一个是生成随机数,一个是模拟发送此数字的。
1、因为生成几位随机数,是必须要到项目上线之前才能定的,因此,写了一个带参数的函数,如下
/// <summary> /// 生成随机验证码 /// </summary> public static class RandomCode { /// <summary> /// 返回一个N位验证码 /// </summary> /// <param name="N">位数</param> /// <returns></returns> public static string RandomCodeCommand(int N) { string code = ""; Random random = new Random(); for (int i = 0; i < N; i++) { code += random.Next(9); } return code; } }
2、模拟发送此串数字。
这个类里面用了两个Timer函数,一个是用作Button的倒数显示的,另一个是用作保存这个验证码时长的。
在记录验证码的同时,还需要记录发送验证码的手机号,以防止,用户用第一个手机号点击了发送验证码后,把手机号部分修改为其他的手机号。
public class SendRandomCode : ViewModelBase { private int _interval;//记录倒计时长 private string idCode;//在规定时间内保存验证码 private int idCodeTime;//设置验证码的有效时间(秒) private int idCodeNum = 6;//设置验证码的位数 public void GetCode(string phoneNum) { //获取验证码 timerSend = new Timer(1000); timerSend.AutoReset = true; timerSend.Elapsed += Timer_Elapsed; _interval = SecondNum; timerSend.Start(); //在验证码有效期内,再次请求验证码,需要先关闭上一次的 if (timerTime != null) { timerTime.Close(); timerTime.Dispose(); } //验证码的有效期 timerTime = new Timer(1000); timerTime.AutoReset = true; timerTime.Elapsed += TimerTime_Elapsed; timerTime.Start(); idCodeTime = SaveTime; IdCode = RandomCode.RandomCodeCommand(idCodeNum); PhoneNum = phoneNum; } #region 获取验证码倒计时 Timer timerSend; Timer timerTime; private void Timer_Elapsed(object sender, ElapsedEventArgs e) { BtnIsEnable = false; BtnContent = "(" + (_interval--) + ")秒后再次获取验证码"; if (_interval <= -1) { BtnIsEnable = true; BtnContent = "获取验证码"; timerSend.Stop(); timerSend.Dispose(); } //throw new NotImplementedException(); } private void TimerTime_Elapsed(object sender, ElapsedEventArgs e) { idCodeTime--; if (idCodeTime <= 0) { IdCode = ""; timerTime.Stop(); timerTime.Dispose(); } Console.WriteLine(IdCode); //throw new NotImplementedException(); } #endregion #region 字段 //*************************************************************************************************//上线时需要修改 private int secondNum = 30;//设置倒计时长 private int saveTime = 60;//设置保存验证码时长 //*************************************************************************************************// private string btnContent = "获取验证码";//设置获取验证码按钮显示的名称 private bool btnIsEnable = true;//设置获取验证码按钮是否可用 private string phoneNum;//记录是否是发送验证码的手机号 public int SecondNum { get { return secondNum; } set { secondNum = value; } } public int SaveTime { get { return saveTime; } set { saveTime = value; } } public string BtnContent { get { return btnContent; } set { btnContent = value; RaisePropertyChanged("BtnContent"); } } public bool BtnIsEnable { get { return btnIsEnable; } set { btnIsEnable = value; RaisePropertyChanged("BtnIsEnable"); } } public string IdCode { get { return idCode; } set { idCode = value; RaisePropertyChanged("IdCode"); } } public string PhoneNum { get { return phoneNum; } set { phoneNum = value; RaisePropertyChanged("PhoneNum"); } } #endregion }
二、XAML页面代码
<Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal"> <Label Content="手机号"/> <TextBox Text="{Binding PhoneNum}" Height="20" Width="100"/> <Button Content="{Binding Src.BtnContent}" IsEnabled="{Binding Src.BtnIsEnable}" Command="{Binding SendCode}" Height="20" Width="120"/> </StackPanel> <StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal"> <Label Content="验证码"/> <TextBox Text="{Binding IdentifyCode}" Height="20" Width="100"/> <Button Content="提交" Command="{Binding Submit}" Height="20" Width="120"/> </StackPanel> </Grid>
三、VM页面代码
VM页面没有什么特别的,就是声明了一些字段,
特别注意的是,由于前台的XAML页面上的发送短信按钮是需要倒计时的,因此Button的Content和IsEnable需要绑定到SendRandomCode这个类上,所以需要在VM下声明一下这个类
public class BingVM: ViewModelBase { #region 界面字段 private string phoneNum;//手机号 private string identifyCode;//验证码 public string PhoneNum { get { return phoneNum; } set { phoneNum = value; RaisePropertyChanged("PhoneNum"); } } public string IdentifyCode { get { return identifyCode; } set { identifyCode = value; RaisePropertyChanged("IdentifyCode"); } } #endregion #region 为获取验证码按钮设置content和isEnable用的 SendRandomCode src = new SendRandomCode(); public SendRandomCode Src { get { return src; } set { src = value; } } #endregion private RelayCommand sendCode;//获取验证码 public RelayCommand SendCode { get { return sendCode ?? (sendCode = new RelayCommand( () => { if (!string.IsNullOrEmpty(PhoneNum)) { src.GetCode(PhoneNum); } else { MessageBox.Show("手机号不能为空!"); } })); } } private RelayCommand submit; public RelayCommand Submit { get { return submit ?? (submit = new RelayCommand( () => { if (IdentifyCode == src.IdCode && PhoneNum == src.PhoneNum) { MessageBox.Show("验证成功"); } else { MessageBox.Show("验证失败"); } })); } } }
四、效果展示
上面是成功的效果图。
验证失败的情况如下:
1、如果在发送验证码的过程中,把手机号修改了,填入原有的验证码
2、如果输入的验证码不是程序输出的验证码
3、时间超过了验证码的保存时间
BUG修复:
刚才在测试的过程中发现了一个问题,由于我们做的主程序是调用模块的DLL文件生成磁贴的,而主程序的返回按钮,不会关闭掉当前磁贴的所有线程,导致当返回再进入此磁贴时,再次点击发送按钮,则会再次出现一个验证码,解决方式很简单:修改SendRandomCode代码,在Timer timerTime;前加static,是其成为静态的。这样再次点击时,就是知道线程已存在,先关闭再发送。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
所以我试图让我的应用程序发送短信自动给给定的号码时,用户按下按钮。 我可以让它打开messenger并编写文本,但我不能让它自动发送。 我的代码如下(我想最重要的部分); 那么,我怎样才能让它发送短信呢? 顺便说一句,我添加了权限:“Android。权限。发送短信”
本文向大家介绍Twilio 发送短信,包括了Twilio 发送短信的使用技巧和注意事项,需要的朋友参考一下 示例 要使用Twilio和Python发送您的第一条SMS,您只需要Twilio-Python帮助程序库即可开始。
问题内容: 我试图在用户按下屏幕上的按钮时自动将SMS消息发送到特定号码。 这是我的代码: xxxxxxx =电话号码 我具有以下权限: 当我按下按钮时,它将带我到另一个屏幕,在该屏幕上我可以编辑文本并按发送。我只希望它自动执行此过程,而无需带我到另一个屏幕。因为已经定义了消息,所以我只想将其发送到特定号码。 而且我不确定我是否将相应的电话号码放在第二行代码中。我必须首先在其中输入国家代码吗?或者
egg 发送短信逻辑 service 'use strict'; const Service = require('egg').Service; class UserService extends Service { /** * 发送验证码 */ async sendCode() { //1. 获取用户手机号 const { phone } = this
我试图自动发送短信到某一个号码时,用户按下屏幕上的一个按钮。
本文向大家介绍Android基础开发小案例之短信发送器,包括了Android基础开发小案例之短信发送器的使用技巧和注意事项,需要的朋友参考一下 先看看效果图: 布局文件: activity_main.xml Java代码: 以上就是Android短信发送器的实现代码,希望能给大家一个参考,也希望大家多多支持呐喊教程。
我正在尝试使用亚马逊SNS发送消息,但它显示了非典型的行为。它向一些号码发送消息,而向另一些号码发送消息,也可能不发送消息。 我正在使用publish API直接为OTPs发送SMS而不使用主题。有什么办法我可以得到他们的送货状态吗?区域/DND是否会影响交货。这是为了印度数字。我使用的是事务性消息。
问题内容: 我正在尝试从我的应用程序发送紧急短信。我必须确保SMS发送成功。 在Android系统启动后并进行检查后,将发送SMS。 因此,我有一个处理BOOT_COMPLETED意向过滤器的服务类。此类进行检查,如果内容正确,则尝试通过另一个“扩展服务”类发送SMS消息 确保成功发送短信后,两个服务(处理启动呼叫的服务和发送短信的服务)都必须退出。 问题1 :如何使我的短信发送功能在超时的情况下