[置頂] mob簡訊驗證碼SMSSDK的使用
因為mob 的簡訊驗證碼是完全免費,完~全~免~費~,所以老大就讓我用它
其實,個人感覺mob 的簡訊驗證發生時間很不穩定,會延遲,而且未稽核之前一個手機號一天只允許請求5次,一個mob賬號一天最多傳送20次。
使用起來效率可能會相對比較低,但是,它是完~全~免~費~的~~~
請求流程:
1. 以使用者提供的手機號碼作為引數,請求連線到SMSSDK的伺服器
2. SMSSDK伺服器校驗號碼格式成功,請求簡訊服務商傳送簡訊驗證碼到該手機號
3. 手機終端接收到驗證碼,使用者輸入驗證碼
4. 驗證碼傳入應用後臺服務端,服務端通過SMSSDK介面驗證,再把驗證結果傳回手機端
功能實現過程:
分兩種,第一種是無GUI,第二種是有GUI
有GUI是指,SMSSDK裡面有一個介面,呼叫這個介面可以使用SMSSDK已經為我們寫好的登入註冊佈局,簡訊驗證碼以及簡訊驗證回撥方法;
當不想使用SMSSDK裡面提供的佈局或者只是需要簡訊驗證碼時,呼叫第一種無GUI方法。
一、無GUI整合簡訊驗證碼的SMSSDK
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:
``` python
<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. 新增程式碼
``` python
//初始化
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配套使用,否則可能造成記憶體洩漏。
``` python
// 簡訊回撥程式碼
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. 手機端把驗證結果返回開發者伺服器
以上為個人的總結,疑問或者有不妥當之處,請指出
第一次寫部落格,好激動~~~
接下來會好好努力,堅持下去