Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 驗證碼之短信驗證(雲之訊短信平台)

android 驗證碼之短信驗證(雲之訊短信平台)

編輯:關於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;

    @Override
    protected 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);// 參數依次為總時長,和計時的時間間隔
        }

        @Override
        public void onFinish() {// 計時完畢時觸發
            btn_send_code.setText("重新發送驗證碼");
            btn_send_code.setEnabled(true);
        }

        @Override
        public void onTick(long millisUntilFinished) {// 計時過程顯示
            btn_send_code.setText((millisUntilFinished / 1000) + "後可重新發送驗證碼");
            btn_send_code.setEnabled(false);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (timeCount!=null) {
            timeCount.cancel();
        }
    }

    @Override
    public 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() {
        @Override
        public 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();
    }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved