android 验证码之短信验证(云之讯短信平台)
好久没更新过博客了。这段时间总算是忙完了,抽点时间出来更新下博客。这次跟大家带来的是一个很简单的短信验证码。相信这个验证码的功能基本上99的项目都需要用到,我这里是用的云之迅平台,为什么要用这个平台,因为原理很简单,用起来也还不错。
1、这里说下云之迅的实现原理,首先得去云之迅平台去申请个开发者账号,然后集成云之迅代码。
2、代码原理其实也很简单,就是自己在本地生成一个多少位的验证码,然后把验证码等参数通过云之迅的接口发给云之迅,再通过云之迅给那台手机发送短信验证码,然后得到验证码之后输入验证码,跟一开始生成的验证码进行对比,如果匹配的话就算是验证通过,当然也可以本地md5加密,当前demo是没有进行验证码加密的。
首先看下效果动图(由于隐私问题把电话号码挡住了一部分):
好了,下面我们进入正题!!!!
1、下面我们先看目录结构(红线部分就是云之迅的代码集成的部分,我们真正写的只有一个MainActivity)
2、好了,咱们来看看MainActivity这个里面的代码:
package com.wyw.smsdemo;import org.json.JSONException;
import org.json.JSONObject;import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {// 确认按钮private Button btn_enter;// 发送验证码private Button btn_send_code;// 验证码输入框private EditText edit_code;// 手机号码输入框private EditText edit_phone;// 验证码private String code;/*** 短信平台 Account sid*/public final static String SMS_SID = "";/*** 短信平台 Auth Token*/public final static String SMS_TOKEN = "";/*** 短信平台 SMS_APPID*/public final static String SMS_APPID = "";/*** 短信模板ID SMS_TEMPLATEID*/public final static String SMS_TEMPLATEID = "";//计时器private TimeCount timeCount;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_enter = (Button) findViewById(R.id.btn_enter);btn_send_code = (Button) findViewById(R.id.btn_send_code);edit_code = (EditText) findViewById(R.id.edit_code);edit_phone = (EditText) findViewById(R.id.edit_phone);btn_enter.setOnClickListener(this);btn_send_code.setOnClickListener(this);}/*** 内部类计时器*/private class TimeCount extends CountDownTimer {public TimeCount(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔}@Overridepublic void onFinish() {// 计时完毕时触发btn_send_code.setText("重新发送验证码");btn_send_code.setEnabled(true);}@Overridepublic void onTick(long millisUntilFinished) {// 计时过程显示btn_send_code.setText((millisUntilFinished / 1000) + "后可重新发送验证码");btn_send_code.setEnabled(false);}}@Overrideprotected void onDestroy() {super.onDestroy();if (timeCount!=null) {timeCount.cancel();}}@Overridepublic void onClick(View v) {if (btn_enter == v) {//确认按钮String code_lin = edit_code.getText().toString();if (TextUtils.isEmpty(code_lin)) {Toast.makeText(MainActivity.this, "验证码不能为空", Toast.LENGTH_SHORT).show();return;}if (code != null && code.equals(code_lin)) {Toast.makeText(MainActivity.this, "验证成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "验证失败,请填写正确的验证码", Toast.LENGTH_SHORT).show();}} else if (btn_send_code == v) {//发送验证码if (TextUtils.isEmpty(edit_phone.getText().toString())) {Toast.makeText(MainActivity.this, "手机号码不能为空", Toast.LENGTH_SHORT).show();return ;}if (!isMobileNO(edit_phone.getText().toString())) {Toast.makeText(MainActivity.this, "手机号码不合法", Toast.LENGTH_SHORT).show();return ;}sendSMS();}}/*** 验证手机格式*/public static boolean isMobileNO(String mobiles) {/*移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188联通:130、131、132、152、155、156、185、186电信:133、153、180、189、177(1349卫通)总结起来就是第一位必定为1,第二位必定为3或5或8,其他位置的可以为0-9*/String telRegex = "[1][134578]\\d{9}";//"[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。if (TextUtils.isEmpty(mobiles)) {return false;} else {return mobiles.matches(telRegex);}}/*** 发送短信验证码*/private void sendSMS() {code = Math.round(Math.random() * 10000) + "";if (code.length() > 4) {code = code.substring(0, 4);} else if (code.length() < 4) {sendSMS();return;}new Thread(new Runnable() {public void run() {JsonReqClient client = new JsonReqClient();String result = client.sendVerificationCode(SMS_APPID, SMS_SID,SMS_TOKEN, code, edit_phone.getText().toString(), SMS_TEMPLATEID);//{"resp":{"respCode":"000000","templateSMS":{"createDate":"20140820145658","smsId":"d2c49329f363b802fb3531d9c67b54f8"}}}if (result != null && result.length() > 0) {try {JSONObject object = new JSONObject(result);if (object.has("resp")) {JSONObject item = object.getJSONObject("resp");//Code = 105122 同一天同一用户不能发超过10条验证码(因运营商限制一般情况下不足5条)if (item.has("respCode") && item.getString("respCode").equals("000000")) {mHandler.sendEmptyMessage(0);} else {mHandler.sendEmptyMessage(1);}} else {mHandler.sendEmptyMessage(1);}} catch (JSONException e) {e.printStackTrace();mHandler.sendEmptyMessage(1);}} else {mHandler.sendEmptyMessage(1);}}}).start();}private Handler mHandler = new Handler() {@Overridepublic void dispatchMessage(Message msg) {switch (msg.what) {case 0:Toast.makeText(MainActivity.this, "短信验证码发送成功", Toast.LENGTH_SHORT).show();timeCount = new TimeCount(60000, 1000);timeCount.start();break;case 1:Toast.makeText(MainActivity.this, "短信验证码发送失败", Toast.LENGTH_SHORT).show();break;}}};
}
在代码里面我们可以看到这4个常量参数,然而这4个参数是怎么获取的呢?请往下看我会一一解释!
/*** 短信平台 Account sid*/public final static String SMS_SID = "";/*** 短信平台 Auth Token*/public final static String SMS_TOKEN = "";/*** 短信平台 SMS_APPID*/public final static String SMS_APPID = "";/*** 短信模板ID SMS_TEMPLATEID*/public final static String SMS_TEMPLATEID = "";
首先是(短信平台 Account sid,短信平台 Auth Token)这2个参数,请看图中红色框框标出的部分,就可以知道咱们的这2个参数怎么获得,当然前提是你必须得有个开发者账号!!:
接着就是(短信平台 SMS_APPID)这个参数的获取了,这个参数呢你得先去“应用管理-应用列表”里面去把你的应用给添加起来,然后会出现个你的应用列表,然后点击该应用就能看到该下图:
最后这个参数呢(短信模板ID SMS_TEMPLATEID)也是在“应用管理-短信管理”里面有个创建短信模板的,请先创建短信的模板,我这里会跟你提供一个比较大众的模板,当然了如果有不知道模板的规则是怎样可以点击下图红框标记的查看规则说明。
当模板创建成功之后就得到咱们需要的(短信模板ID SMS_TEMPLATEID)这个参数啦!请看下图
这样我们就拿到所有的参数了,然后调用上面代码的这段代码(原理也说了本地生成一个多少位的验证码,然后通过接口传给云之迅平台,由云之迅平台发送短信,收到短信后与本地做验证,当前也可以进行加密之后的验证):
/*** 发送短信验证码*/private void sendSMS() {code = Math.round(Math.random() * 10000) + "";if (code.length() > 4) {code = code.substring(0, 4);} else if (code.length() < 4) {sendSMS();return;}new Thread(new Runnable() {public void run() {JsonReqClient client = new JsonReqClient();String result = client.sendVerificationCode(SMS_APPID, SMS_SID,SMS_TOKEN, code, edit_phone.getText().toString(), SMS_TEMPLATEID);//{"resp":{"respCode":"000000","templateSMS":{"createDate":"20140820145658","smsId":"d2c49329f363b802fb3531d9c67b54f8"}}}if (result != null && result.length() > 0) {try {JSONObject object = new JSONObject(result);if (object.has("resp")) {JSONObject item = object.getJSONObject("resp");//Code = 105122 同一天同一用户不能发超过10条验证码(因运营商限制一般情况下不足5条)if (item.has("respCode") && item.getString("respCode").equals("000000")) {mHandler.sendEmptyMessage(0);} else {mHandler.sendEmptyMessage(1);}} else {mHandler.sendEmptyMessage(1);}} catch (JSONException e) {e.printStackTrace();mHandler.sendEmptyMessage(1);}} else {mHandler.sendEmptyMessage(1);}}}).start();}
本篇博客就到这里,如果有有疑问的欢迎留言讨论。同时希望大家多多关注我的博客,多多支持我。
尊重原创转载请注明:(http://blog.csdn.net/u013895206) !
下面是地址传送门:址:http://download.csdn.net/detail/u013895206/9608223
android 验证码之短信验证(云之讯短信平台)相关推荐
- php 短信验证 云之讯,python3.7实现云之讯、聚合短信平台的短信发送功能
1.云之讯平台数据返回Json格式: {'reason': '操作成功', 'result': {'sid': '17209241456456455454', 'fee': 1, 'count': 1 ...
- SpringBoot短信验证(云之讯)
1.下载云之讯SDK. 2.将src里的文件拷贝至SpringBoot启动类同级目录. 3.将src里的config.properties剪切至SpringBoot的application.yml同级 ...
- 短信验证的实现(基于云之讯短信验证SDK)
短信验证用途: 进行身份验证,验证手机号码是本人的 短信验证逻辑流程: 发送请求给服务器,根据服务器的返回Json/xml获取 返回码,创建时间. 根据返回码判断是否正确,正确会收到短信.不正确就收不 ...
- ThinkPHP5结合云之讯短信验证简单案例
ThinkPHP5结合云之讯短信验证简单案例 总体思路: 我这里以用户注册短信验证分析: 在用户输入正确的手机号码点击注册按钮时,使用Ajax发送一个我们手动生成的验证码和手机号码一起发 ...
- 阿里和云之讯短信发送服务
目录 1 云之讯短信验证码 1.1 创建应用 1.2 创建短信模板 1.3 发送短信api 1.4 编写代码 1.5 编写测试用例 1.6 编写接口服务 2 阿里云短信服务 2.1 申请签名与模板 2 ...
- java WEB调用秒嘀科技短信验证接口(实现短信验证登录)
java WEB调用秒嘀科技短信验证接口(实现短信验证登录) 前言 注册秒嘀云账号 登录秒嘀云官网 代码 前言 短信验证登咱就不多说了,为什么推荐用秒嘀的呢,应为他会送你10元钱,对于新手来说10元钱 ...
- 云之讯php短信接口,菏泽java云之讯短信接口价格如何计算? 新锐信息科技服务至上...
免费接码验证码接收平台 好用的接码平台有以下几个特征: 1.平台功能设置人性化:语音验证码+短信验证码一体化,方便用户使用.现在很多项目都慢慢开始了语音验证码的步伐. 2.平台稳定经营时间久:接码平台 ...
- 云之讯---短信接收验证码
1.首先,先去注册,登陆后下载自己的SDK 文件内容如下 有三个php一个html 2.下载了SDK先去读取文档内容 进行查找自己的 accountsid(开发者控制台首页上的Account Si ...
- java中短信验证登录_java实现短信验证码功能
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这几天老大让我弄一个发送短信验证码的功能,使用的是大汉云通讯的短信平台接口,调用短信平台提供的接口(遵循短信平台的接口规范即可).具体看代码: impor ...
最新文章
- 9个tcpdump使用实例
- python-django-ORM,常用查询方式
- 机器人统治人类?别逗!现实中的机器人是这样的
- 7-72 功夫传人 (25 分)(深搜)
- 一加8T真机渲染图泄露:后置四摄+双闪光灯
- Object-C 学习笔记(IOS程序设计课程)01
- 磁盘分区需要知道的概念
- spring cloud Eureka server 问题 Spring Cloud java.lang.TypeNotPresentException
- DIY一个VR小钢炮
- MATLAB与STK互联17:卫星对象操作(8)—地面站可见性计算并获取数据
- 利用IE登陆windows 2003 的终端服务器
- C++ 两点之间的距离
- WebRoot到底是什么鬼?我改它的名可以吗?
- 花卉培育信息管理系统设计与实现
- python百度地图显示路径_百度地图获取规划路径信息
- 管理 POP3 和 IMAP4 服务
- 【CF比赛】Educational Codeforces Round 102 (Rated for Div. 2)
- 百度:AI技术哪家强,度厂科大最在行?
- C型电磁阀连接器电磁阀插头,8mm针距
- 博物馆(展览馆)RFID信息化建设管理方案
热门文章
- linux软考常用命令
- 开发错题集(陆续更新...)
- 记录:微信小程序Switch样式调整
- BEA-3XXXXX错误代码
- 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw
- Sun Jan 05 2020 00:00:00 GMT 0800 (中国标准时间) 时间转换为 2020-01-05 08:00:00
- Oracle Java SE高级版
- 华为USG6000系统进入诊断视图调节风扇转速配置
- Apad Qzone项目总结(一)---发布!!!
- 2018沈阳集训day1