最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录。在学习的过程中,先使用了Mob的短信服务进行短信验证,因为他是免费的,而且不需要提交什么材料(单纯为了测试),后期加入到项目中的话,还是需要去创建自己的签名和短信模板,先拿Mob练练手,后期在项目中还是会使用阿里云的短信服务,到时候实现了之后也会分享出来。

因为我这里只是做了一个简单的Demo,所以就没有必要去申请这些权限,其实申请的话很容易过的,只要上传一下公司的营业执照就好。好了,废话不多说了,实现功能吧!

需要先在Mob上有一个自己的账号,用自己的常用邮箱注册就好,然后进入到后台,创建一个自己的应用,随便取个名字就可以创建成功,创建成功后就可以拿到Appkey及Appsecret,这两个数据后面是需要用到的,有了这个就可以非常方便的看到后台的统计信息,然后再Mob官网上下载SMSSDK,因为都是开源项目,所以Mob的代码都是托管在git上的,然后将里面的Unity包导入到项目中。我新建了一个工程来实现该功能,利用UGUI搭建了一个简易的收发验证码的界面。接下来就是开始码代码了,新建一个测试脚本,并且继承且实现SMSSDKHandler接口,为了方便接收验证码发送的回调结果。先申明SMSSDK变量,然后在Start中初始化,将先前创建的Appkey及App secret填入,第三个参数为是否warn,根据官网建议设置为false。

  1. ssdk.init("292449f735890", "f1bee8045aac2e6cbb7c535a5277aa1c", false);
  2. ssdk.setHandler(this);

接下来是实现短信验证码功能,特别需要注意的是第四个参数,它表示的短信模板,因为我们一开始是没有申请到短信模板的,因为Mob需要我们的应用中先利用他们sdk实现了短信验证码功能,提交的app才能通过审核。所以此时我们是没有短信模板的,所以这里在测试的时候传null就好了。

  1. ssdk.getCode(CodeType.TextCode, phone, "86", null);

然后点击发送按钮后,就可以接收到短信了,接下来就是验证验证码是否正确了。phoneNumber表示的是手机号,codeNumer表示的是输入的验证码,点击验证后,就会自动验证了。

  1. ssdk.commitCode("phoneNumber", "86", "codeNumber");

前面因为我们实现了SMSSDKHandler接口,所以在onComplete方法中返回验证成功,在onError方法中返回验证失败。

  1. public void onComplete(int action, object resp)
  2. {
  3. ActionType act = (ActionType)action;
  4. if (resp != null)
  5. {
  6. //result = resp.ToString();
  7. text.text += "\n" + resp.ToString();
  8. Debug.Log(resp.ToString());
  9. }
  10. if (act == ActionType.GetCode)
  11. {
  12. text.text += "\n 验证成功!!!";
  13. string responseString = (string)resp;
  14. Debug.Log("isSmart :" + responseString);
  15. }
  16. }
  17.  
  18. public void onError(int action, object resp)
  19. {
  20. Debug.Log("Error :" + resp);
  21. text.text += "\n 验证失败!!!";
  22. text.text += "\n Error : " + resp;
  23. print("OnError ******resp" + resp);
  24. }

以下是我的完整代码。

  1. public class Test : MonoBehaviour, SMSSDKHandler
  2. {
  3.  
  4. public SMSSDK ssdk;
  5. private InputField code;
  6. private InputField phoneNum;
  7. private Button enter;
  8. private Button send;
  9. private string codeNum;
  10. private string phone;
  11. private Text timer;
  12. private bool isSend;
  13. private int time;
  14. private float t;
  15. public Text text;
  16. private void Start()
  17. {
  18. ssdk.init("292449f735890", "f1bee8045aac2e6cbb7c535a5277aa1c", false);
  19. ssdk.setHandler(this);
  20. timer = transform.Find("Timer").GetComponent<Text>();
  21. code = transform.Find("code").GetComponent<InputField>();
  22. phoneNum = transform.Find("num").GetComponent<InputField>();
  23. enter = transform.Find("enter").GetComponent<Button>();
  24. send = transform.Find("send").GetComponent<Button>();
  25.  
  26. timer.gameObject.SetActive(false);
  27. enter.onClick.AddListener(EnterCodeHandler);
  28. send.onClick.AddListener(SendCodeHandler);
  29. }
  30. private void Update()
  31. {
  32. if (isSend)
  33. {
  34. //倒计时
  35. timer.text = time.ToString();
  36. t += Time.deltaTime;
  37. if (t >= 1)
  38. {
  39. time--;
  40. t = 0;
  41. }
  42. if (time < 0)
  43. {
  44. isSend = false;
  45. send.gameObject.SetActive(true);
  46.  
  47. timer.gameObject.SetActive(false);
  48. }
  49. }
  50. }
  51. /// <summary>
  52. /// 发送验证码
  53. /// </summary>
  54. private void SendCodeHandler()
  55. {
  56. phone = phoneNum.text;
  57. isSend = true;
  58. time = 60;
  59. send.gameObject.SetActive(false);
  60. timer.gameObject.SetActive(true);
  61. ssdk.getCode(CodeType.TextCode, phone, "86", null);
  62. }
  63. /// <summary>
  64. /// 点击确定,对比验证码
  65. /// </summary>
  66. private void EnterCodeHandler()
  67. {
  68. ssdk.commitCode(phone, "86", code.text);
  69. }
  70.  
  71. public void onComplete(int action, object resp)
  72. {
  73. ActionType act = (ActionType)action;
  74. if (resp != null)
  75. {
  76. //result = resp.ToString();
  77. text.text += "\n" + resp.ToString();
  78. Debug.Log(resp.ToString());
  79. }
  80. if (act == ActionType.GetCode)
  81. {
  82. text.text += "\n 验证成功!!!";
  83. string responseString = (string)resp;
  84. Debug.Log("isSmart :" + responseString);
  85. }
  86. }
  87.  
  88. public void onError(int action, object resp)
  89. {
  90. Debug.Log("Error :" + resp);
  91. text.text += "\n 验证失败!!!";
  92. text.text += "\n Error : " + resp;
  93. print("OnError ******resp" + resp);
  94. }
  95. }

通过上面的实现,我们现在就基本实现了短信验证功能,但是因为Mob是免费的,所以对每个手机号都有限制,好像是对每一个手机号都只能验证一次,所以很不方便。接下来我打算利用阿里云的短信服务实现一个,到时候也会分享出来,这个项目的源码及我发布的一个测试版本都放在了我的https://github.com/Iamdevelope/SMSSDemo上了,有兴趣的可以下载下来看看。

Unity利用SMSSDK实现短信验证码(附代码)的更多相关文章

  1. Java发送手机短信(附代码和解析,亲测有效,简便易操作)

    这个方法用的是中国网建SMS短信通相关依赖进行操作的~~ 很简单,仅需要三步,第二部代码直接复制,不需要修改,第三部中的用户名和密钥修改成自己的即可 <1> 首先需要导入三个jar包 &l ...

  2. C++ 短信验证码/通知 - 代码示例

    //接口类型:互亿无线触发短信接口,支持发送验证码短信.订单通知短信等. // ///////////////////账户注册:请通过该地址开通账户http://user.ihuyi.com/regi ...

  3. 使用阿里大于平台发送短信验证码java代码实现

    待续..网站app后台还未完成,不能添加签名,短信不能正常发送. Tip: https://help.aliyun.com/document_detail/55284.html?spm=5176.sm ...

  4. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  5. 『实践』Android之短信验证码(用的Mob短信验证)

    1.参考资料 Mob网站:http://www.mob.com/ Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android 教程:htt ...

  6. java接入创蓝253短信验证码

    说明 项目是springboot框架 1.短信配置文件 包含验证码发送路径.用户名.密码 chuanglan.requesturl= chuanglan.account= chuanglan.pswd ...

  7. java实现发送短信验证码

    java实现短信验证码发送 由于我们使用第三方平台进行验证码的发送,所以首先,我们要在一个平台进行注册. 在这里我选择是秒嘀科技,因为新人注册会赠送十元,足够测试使用了. 注册完成后,我们需要获取自己 ...

  8. 【安全测试】如何利用短信验证码BUG浪费公司的钱

    一.背景 公司新产品体验,发现不少交互.UI.功能设计上的小问题.于是花了点时间随意挑了几个功能深入的玩了一下,顺手提了BUG.接口层,看了一下接口文档,简单测了一下接口,BUG其实还挺严重的,后面详 ...

  9. 利用WeX5给手机APP增加短信验证码功能

    帖子来源:http://bbs.wex5.com/thread-70908-1-1.html 遇到一个手机APP项目客户要求注册到APP上的用户手机号必须是真实的通过X5平台整合短信发送平台接口完成了 ...

随机推荐

  1. .join() ----- 是把列表中的元素用 "xx".join() 拼接成字符串

    li = ["alex", "eric", "rain"] str1 = "_".join(li) # 是把列表中的元素 ...

  2. FZU Monthly-201901 tutorial

    FZU Monthly-201901 tutorial 题目(难度递增) easy easy-medium medium medium-hard hard 思维难度 AHG F B CE D 编码难度 ...

  3. Stop Bitbucket prompting for password in git

    出处:http://qosys.info/485/bitbucket-git-prompt-for-password In some cases after adding public ssh key ...

  4. python第三十课--异常(异常对象传递过程)

    演示异常对象传递的过程(往上“抛”),并将其解决 def func1(): print('func1...') print(10/0) def func2(): print('func2...') t ...

  5. Netty入门(二)时间服务器及客户端

    在这个例子中,我在服务器和客户端连接被创立时发送一个消息,然后在客户端解析收到的消息并输出.并且,在这个项目中我使用 POJO 代替 ByteBuf 来作为传输对象. 一.服务器实现 1.  首先我们 ...

  6. 【洛谷】【最小生成树】P1195 口袋的天空

    [题目背景:] 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. [题目描述:] 给你云朵的个数N,再给你M个关系,表示哪些 ...

  7. 哪些地方会出现css阻塞,哪些地方会出现js阻塞?

    Js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.直到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容.为了提高用户体验,新一代浏览器 ...

  8. C++ vector 容器

    //vector类 resemble array 自动扩容... 暂存于内存中 //格式 vector<类(型)名> 对象名 example: vector<string> v ...

  9. Android Edittext聚焦时输入法挡住了EditText输入框的两种解决方案

    方案一.把整个布局文件用ScrollView套住.这样当你聚焦时虽然输入法也能够挡住一些输入框,但是你可以通过手动滑动看被挡住的内容. 方案二.在Activity中设置android:windowSo ...

  10. tarjan 求割点

    在无向连通图中,如果将其中一个点以及所连的所有边都删掉,图就不再连通的话,那么这个点就叫做割点 首先将所有的点分为:1.环中点 2.不成环的单点割点一般出现的情况是:如果(处在不同环中/一环一单点/均 ...