因为mob 的短信验证码是完全免费,完~全~免~费~,所以老大就让我用它
其实,个人感觉mob 的短信验证发生时间很不稳定,会延迟,而且未审核之前一个手机号一天只允许请求5次,一个mob账号一天最多发送20次。
使用起来效率可能会相对比较低,但是,它是完~全~免~费~的~~~
1. 以用户提供的手机号码作为参数,请求连接到SMSSDK的服务器
2. SMSSDK服务器校验号码格式成功,请求短信服务商发送短信验证码到该手机号
3. 手机终端接收到验证码,用户输入验证码
4. 验证码传入应用后台服务端,服务端通过SMSSDK接口验证,再把验证结果传回手机端
分两种,第一种是无GUI,第二种是有GUI
有GUI是指,SMSSDK里面有一个接口,调用这个接口可以使用SMSSDK已经为我们写好的登录注册布局,短信验证码以及短信验证回调方法;
当不想使用SMSSDK里面提供的布局或者只是需要短信验证码时,调用第一种无GUI方法。
一、无GUI集成短信验证码的SMSSDK
1. 从mob官网下载短信验证码的SDKhttp://www.mob.com/#/downloadDetail/SMS/android
2. 把Android SMSSDK v2.0.1.zip下的jar包放到项目的libs目录下,还有其中的raw文件(包括raw文件中的so文件)拉到项目的res中。如果找不到该文件,可以修改SMSSDK-2.0.1文件的格式为rar再从中获取。
3. 配置AndroidManifest.Xml所需要的权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在<application>下添加activity:
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateHidden|adjustResize"/>
4. 在activity中写代码,分2步执行,一加载,二发送
// appkey和appSecret在mob申请的应用中获取
// 初始化SDK,单例,可以多次调用;任何方法调用前,必须先初始化
SMSSDK.initSDK(this, "您的appkey", "您的appsecret");
// 其中参数第一个代表的是国家代号,86为中国
SMSSDK.getVerificationCode("86","手机号码");
这样就完成一个简单请求短信验证码的功能。
服务器验证短信验证码必须先打开服务器验证的开关,否则无法进行验证。
二、有GUI接口集成调用
1. 有GUI集成大致与无GUI相同,需要在libs目录下多加一个SMSSDKGUI-2.0.1.jar包
2. 集成权限配置(同无GUI接口一致)
3. 添加代码
//初始化
SMSSDK.initSDK(this, "您的appkey", "您的appsecret");
//调用代码打开GUI页面
//打开注册页面
RegisterPage registerPage = new RegisterPage();
registerPage.setRegisterCallback(new EventHandler() {
public void afterEvent(int event, int result, Object data) {
// 解析注册结果
if (result == SMSSDK.RESULT_COMPLETE) {
@SuppressWarnings("unchecked")
HashMap<String,Object> phoneMap = (HashMap<String, Object>) data;
String country = (String) phoneMap.get("country");
String phone = (String) phoneMap.get("phone");
// 提交用户信息
registerUser(country, phone);
}
}
});
registerPage.show(context);
static void |
getSupportedCountries() |
static void |
getVerificationCode(String country, String phone) |
static void |
submitVerificationCode(String country, String phone, String code) |
短信SDK不能支持所有国家的短信验证,调用getSupportedCountries方法能获取到SDK可以支持的国家列表和国家代号。
请求getVerificationCode的时间间隔不应该小于60秒,否则服务端会返回“操作过于频繁”的错误。
submitVerificationCode用于向服务器提交接收到的短信验证码,验证成功后会通过EventHandler返回国家代码和电话号码。
EventHandler是短信回调接口,在使用之前必须先注册,同样,有注册就有注销。
SMSSDK.registerEventHandler(EventHandler handler)注册回调接口
SMSSDK.unregisterEventHandler(EventHandler handler)注销回调接口
registerEventHandler必须和unregisterEventHandler配套使用,否则可能造成内存泄漏。
// 短信回调代码
EventHandler eh=new EventHandler(){
@Override
public void afterEvent(int event, int result, Object data) {
if (result == SMSSDK.RESULT_COMPLETE) {
//回调完成
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
//提交验证码成功
}else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){
//获取验证码成功
}else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){
//返回支持发送验证码的国家列表
}
}else{
((Throwable)data).printStackTrace();
}
}
};
SMSSDK.registerEventHandler(eh); //注册短信回调
引入服务端验证接口走以下流程
1.手机端请求下发短信
2.SMSSDK服务器请求短信服务商
3.短信服务商下发短信
4.手机端发送短信验证码到开发者服务器进行验证
5.开发者服务器发送到SMSSDK服务器进行验证
6.SMSSDK服务器返回开发者服务器验证结果
7.开发者服务器把验证结果返回手机端
在没有短信服务端验证接口的时候,我的服务器需要知道用户是否验证成功是这样走的
1. 手机端请求下发短信
2. SMSSDK服务器请求短信服务商
3. 短信服务商下发短信
4. 手机端发送短信验证码到SMSSDK服务器进行验证
5. SMSSDK服务器返回手机端验证结果
6. 手机端把验证结果返回开发者服务器
以上为个人的总结,疑问或者有不妥当之处,请指出
第一次写博客,好激动~~~
接下来会好好努力,坚持下去