android 验证码之短信验证(云之讯短信平台)
生活随笔
收集整理的這篇文章主要介紹了
android 验证码之短信验证(云之讯短信平台)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
好久沒(méi)更新過(guò)博客了。這段時(shí)間總算是忙完了,抽點(diǎn)時(shí)間出來(lái)更新下博客。這次跟大家?guī)?lái)的是一個(gè)很簡(jiǎn)單的短信驗(yàn)證碼。相信這個(gè)驗(yàn)證碼的功能基本上99的項(xiàng)目都需要用到,我這里是用的云之迅平臺(tái),為什么要用這個(gè)平臺(tái),因?yàn)樵砗芎?jiǎn)單,用起來(lái)也還不錯(cuò)。
1、這里說(shuō)下云之迅的實(shí)現(xiàn)原理,首先得去云之迅平臺(tái)去申請(qǐng)個(gè)開(kāi)發(fā)者賬號(hào),然后集成云之迅代碼。
2、代碼原理其實(shí)也很簡(jiǎn)單,就是自己在本地生成一個(gè)多少位的驗(yàn)證碼,然后把驗(yàn)證碼等參數(shù)通過(guò)云之迅的接口發(fā)給云之迅,再通過(guò)云之迅給那臺(tái)手機(jī)發(fā)送短信驗(yàn)證碼,然后得到驗(yàn)證碼之后輸入驗(yàn)證碼,跟一開(kāi)始生成的驗(yàn)證碼進(jìn)行對(duì)比,如果匹配的話(huà)就算是驗(yàn)證通過(guò),當(dāng)然也可以本地md5加密,當(dāng)前demo是沒(méi)有進(jìn)行驗(yàn)證碼加密的。
首先看下效果動(dòng)圖(由于隱私問(wèn)題把電話(huà)號(hào)碼擋住了一部分):
好了,下面我們進(jìn)入正題!!!!
1、下面我們先看目錄結(jié)構(gòu)(紅線部分就是云之迅的代碼集成的部分,我們真正寫(xiě)的只有一個(gè)MainActivity)
2、好了,咱們來(lái)看看MainActivity這個(gè)里面的代碼:
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 {// 確認(rèn)按鈕private Button btn_enter;// 發(fā)送驗(yàn)證碼private Button btn_send_code;// 驗(yàn)證碼輸入框private EditText edit_code;// 手機(jī)號(hào)碼輸入框private EditText edit_phone;// 驗(yàn)證碼private String code;/*** 短信平臺(tái) Account sid*/public final static String SMS_SID = "";/*** 短信平臺(tái) Auth Token*/public final static String SMS_TOKEN = "";/*** 短信平臺(tái) SMS_APPID*/public final static String SMS_APPID = "";/*** 短信模板ID SMS_TEMPLATEID*/public final static String SMS_TEMPLATEID = "";//計(jì)時(shí)器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);}/*** 內(nèi)部類(lèi)計(jì)時(shí)器*/private class TimeCount extends CountDownTimer {public TimeCount(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);// 參數(shù)依次為總時(shí)長(zhǎng),和計(jì)時(shí)的時(shí)間間隔}@Overridepublic void onFinish() {// 計(jì)時(shí)完畢時(shí)觸發(fā)btn_send_code.setText("重新發(fā)送驗(yàn)證碼");btn_send_code.setEnabled(true);}@Overridepublic void onTick(long millisUntilFinished) {// 計(jì)時(shí)過(guò)程顯示btn_send_code.setText((millisUntilFinished / 1000) + "后可重新發(fā)送驗(yàn)證碼");btn_send_code.setEnabled(false);}}@Overrideprotected void onDestroy() {super.onDestroy();if (timeCount!=null) {timeCount.cancel();}}@Overridepublic void onClick(View v) {if (btn_enter == v) {//確認(rèn)按鈕String code_lin = edit_code.getText().toString();if (TextUtils.isEmpty(code_lin)) {Toast.makeText(MainActivity.this, "驗(yàn)證碼不能為空", Toast.LENGTH_SHORT).show();return;}if (code != null && code.equals(code_lin)) {Toast.makeText(MainActivity.this, "驗(yàn)證成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "驗(yàn)證失敗,請(qǐng)?zhí)顚?xiě)正確的驗(yàn)證碼", Toast.LENGTH_SHORT).show();}} else if (btn_send_code == v) {//發(fā)送驗(yàn)證碼if (TextUtils.isEmpty(edit_phone.getText().toString())) {Toast.makeText(MainActivity.this, "手機(jī)號(hào)碼不能為空", Toast.LENGTH_SHORT).show();return ;}if (!isMobileNO(edit_phone.getText().toString())) {Toast.makeText(MainActivity.this, "手機(jī)號(hào)碼不合法", Toast.LENGTH_SHORT).show();return ;}sendSMS();}}/*** 驗(yàn)證手機(jī)格式*/public static boolean isMobileNO(String mobiles) {/*移動(dòng):134、135、136、137、138、139、150、151、157(TD)、158、159、187、188聯(lián)通:130、131、132、152、155、156、185、186電信:133、153、180、189、177(1349衛(wèi)通)總結(jié)起來(lái)就是第一位必定為1,第二位必定為3或5或8,其他位置的可以為0-9*/String telRegex = "[1][134578]\\d{9}";//"[1]"代表第1位為數(shù)字1,"[358]"代表第二位可以為3、5、8中的一個(gè),"\\d{9}"代表后面是可以是0~9的數(shù)字,有9位。if (TextUtils.isEmpty(mobiles)) {return false;} else {return mobiles.matches(telRegex);}}/*** 發(fā)送短信驗(yàn)證碼*/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 同一天同一用戶(hù)不能發(fā)超過(guò)10條驗(yàn)證碼(因運(yùn)營(yíng)商限制一般情況下不足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, "短信驗(yàn)證碼發(fā)送成功", Toast.LENGTH_SHORT).show();timeCount = new TimeCount(60000, 1000);timeCount.start();break;case 1:Toast.makeText(MainActivity.this, "短信驗(yàn)證碼發(fā)送失敗", Toast.LENGTH_SHORT).show();break;}}}; }在代碼里面我們可以看到這4個(gè)常量參數(shù),然而這4個(gè)參數(shù)是怎么獲取的呢?請(qǐng)往下看我會(huì)一一解釋!
/*** 短信平臺(tái) Account sid*/public final static String SMS_SID = "";/*** 短信平臺(tái) Auth Token*/public final static String SMS_TOKEN = "";/*** 短信平臺(tái) SMS_APPID*/public final static String SMS_APPID = "";/*** 短信模板ID SMS_TEMPLATEID*/public final static String SMS_TEMPLATEID = "";首先是(短信平臺(tái) Account sid,短信平臺(tái) Auth Token)這2個(gè)參數(shù),請(qǐng)看圖中紅色框框標(biāo)出的部分,就可以知道咱們的這2個(gè)參數(shù)怎么獲得,當(dāng)然前提是你必須得有個(gè)開(kāi)發(fā)者賬號(hào)!!:
接著就是(短信平臺(tái) SMS_APPID)這個(gè)參數(shù)的獲取了,這個(gè)參數(shù)呢你得先去“應(yīng)用管理-應(yīng)用列表”里面去把你的應(yīng)用給添加起來(lái),然后會(huì)出現(xiàn)個(gè)你的應(yīng)用列表,然后點(diǎn)擊該應(yīng)用就能看到該下圖:
最后這個(gè)參數(shù)呢(短信模板ID SMS_TEMPLATEID)也是在“應(yīng)用管理-短信管理”里面有個(gè)創(chuàng)建短信模板的,請(qǐng)先創(chuàng)建短信的模板,我這里會(huì)跟你提供一個(gè)比較大眾的模板,當(dāng)然了如果有不知道模板的規(guī)則是怎樣可以點(diǎn)擊下圖紅框標(biāo)記的查看規(guī)則說(shuō)明。
當(dāng)模板創(chuàng)建成功之后就得到咱們需要的(短信模板ID SMS_TEMPLATEID)這個(gè)參數(shù)啦!請(qǐng)看下圖
這樣我們就拿到所有的參數(shù)了,然后調(diào)用上面代碼的這段代碼(原理也說(shuō)了本地生成一個(gè)多少位的驗(yàn)證碼,然后通過(guò)接口傳給云之迅平臺(tái),由云之迅平臺(tái)發(fā)送短信,收到短信后與本地做驗(yàn)證,當(dāng)前也可以進(jìn)行加密之后的驗(yàn)證):
/*** 發(fā)送短信驗(yàn)證碼*/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 同一天同一用戶(hù)不能發(fā)超過(guò)10條驗(yàn)證碼(因運(yùn)營(yíng)商限制一般情況下不足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();}本篇博客就到這里,如果有有疑問(wèn)的歡迎留言討論。同時(shí)希望大家多多關(guān)注我的博客,多多支持我。
尊重原創(chuàng)轉(zhuǎn)載請(qǐng)注明:(http://blog.csdn.net/u013895206) !
下面是地址傳送門(mén):址:http://download.csdn.net/detail/u013895206/9608223
總結(jié)
以上是生活随笔為你收集整理的android 验证码之短信验证(云之讯短信平台)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 官宣:教父级讲师李明加入尚硅谷
- 下一篇: nodejs短信验证码,基于云之讯