Android開(kāi)發(fā)采坑篇之騰訊驗(yàn)證碼

Android開(kāi)發(fā)采坑篇之騰訊驗(yàn)證碼

我司為響應(yīng)有關(guān)部門(mén)的號(hào)召这难,要求新注冊(cè)的用戶必須提供手機(jī)號(hào)驗(yàn)證。又為了防范有不懷好意之人故意盜刷短信,我司決定接入驗(yàn)證碼嗦随。經(jīng)前端同事調(diào)研之后澡罚,決定接入騰訊驗(yàn)證碼伸但。接入過(guò)程中還是踩了一些坑,為此特地寫(xiě)這篇文章致敬騰訊令人作嘔的開(kāi)發(fā)文檔留搔。

騰訊驗(yàn)證碼開(kāi)發(fā)指引

我們是Android端開(kāi)發(fā)更胖,服務(wù)器端的開(kāi)發(fā)就交給后端同事吧。移動(dòng)端的開(kāi)發(fā)只需要從我們的后臺(tái)請(qǐng)求一個(gè)url就可以。

移動(dòng)端開(kāi)發(fā)首先請(qǐng)閱讀APP開(kāi)發(fā)指引却妨,接著閱讀不同移動(dòng)平臺(tái)的API文檔饵逐。Android開(kāi)發(fā)者直接閱讀Android客戶端API就好了。

騰訊驗(yàn)證碼的基本使用

基本使用方法可按照Android客戶端API文檔描述的流程操作彪标。這里我們?cè)僦貜?fù)一遍:

  1. 接入要求

    Android系統(tǒng)2.3以上

  2. 在AndroidManifest.xml中聲明網(wǎng)絡(luò)權(quán)限

    <uses-permission android:name="android.permission.INTERNET" />
    
  3. 在AndroidManifest.xml中注冊(cè)VerifyActivity

    <activity android:name="com.token.verifysdk.VerifyActivity"/>  
    
  4. 向我們的后臺(tái)發(fā)請(qǐng)求獲取jsurl(參考服務(wù)端開(kāi)發(fā)獲取驗(yàn)證碼JSURL的接口)

  5. 獲取到j(luò)surl后調(diào)用接口
    VerifyCoder.getVerifyCoder().startVerifyActivityForResult(Context context,String jsurl,int requestCode)并重寫(xiě) onActivityResult來(lái)接收是否驗(yàn)證成功的通知梳毙。

    /*
     *  參數(shù)說(shuō)明:
     *  context         調(diào)用驗(yàn)證碼時(shí)當(dāng)前界面的上下文,
     *                  用于(Activity) context).startActivityForResult捐下,
     *                  請(qǐng)勿使用application的上下文
     *  jsurl           驗(yàn)證碼的js鏈接账锹,從我們后臺(tái)獲取
     *  requestCode     對(duì)應(yīng)onActivityResult的requestCode,可自定義
    */
    VerifyCoder.getVerifyCoder().startVerifyActivityForResult(Context context,String jsurl,int requestCode)
    //onActivityResult實(shí)現(xiàn)實(shí)例:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == 1) {//此處對(duì)應(yīng)startVerifyActivityForResult的參數(shù)值
             if(resultCode==Activity.RESULT_OK){
                 Log.e("onActivityResult", "verifysucc");
                 Toast.makeText(MainActivity.this, "驗(yàn)證成功",2000).show();
             }
             else{
                 Toast.makeText(MainActivity.this, "未驗(yàn)證成功",2000).show();
             }
         }
     }
    
  6. 如需混淆坷襟,添加如下腳本

    <arg value="-libraryjars ${lib}/VerifySDK.jar"/>
    <arg value="-keep public class com.token.verifysdk{*; }" />
    

Android客戶端API 在收尾處還提到了其他接口說(shuō)明:

public static VerifyCoder getVerifyCoder()      //獲取單例
public void release()                           //重置參數(shù)奸柬,釋放資源
public void setShowtitle(boolean showtitle)     //是否顯示驗(yàn)證碼頁(yè)面標(biāo)題欄
public void setJson(String json)                //用于擴(kuò)展參數(shù),如實(shí)現(xiàn)自定義樣式等
public WebView getWebView(Context context,String jsurl,VerifyListener listener) //獲取驗(yàn)證碼WebView

如果你按照官方文檔描述信息一路走下來(lái)婴程,最終的效果是這樣的:

image.png

真想說(shuō)一句:你長(zhǎng)成這樣廓奕,你們的麻花藤粑粑知道嗎?
估計(jì)有點(diǎn)審美的程序員都不能容忍自己開(kāi)發(fā)的APP里出現(xiàn)如此Low逼的頁(yè)面。自給自足档叔,豐衣足食桌粉。還是我們自己來(lái)吧。

進(jìn)階篇

下載VerifyCodeSdk衙四。SDK 的內(nèi)容如下:

ndroidSDK
├── VerifyDemo
│   ├── AndroidManifest.xml
│   ├── assets
│   ├── bin
│   ├── gen
│   ├── ic_launcher-web.png
│   ├── libs
│   ├── lint.xml
│   ├── proguard-project.txt
│   ├── project.properties
│   ├── res
│   └── src
└── VerifySDK.jar

一個(gè)示例項(xiàng)目和一個(gè)jar包铃肯。示例項(xiàng)目就別看了,基本就是開(kāi)發(fā)文檔的翻版传蹈,沒(méi)有什么有用的信息押逼。把jar包引入我們的項(xiàng)目可以看到內(nèi)容及其簡(jiǎn)單,只有兩個(gè)文件:VerifyActivity.javaVerifyCoder.java惦界。

閱讀源碼外加Debug后得出以下結(jié)論:

可以借助VerifyCoder為騰訊驗(yàn)證碼的頁(yè)面做一些定制化挑格。方法如下:

方法名 說(shuō)明
isShowtitle() 是否顯示標(biāo)題
setShowtitle(boolean) 設(shè)置是否顯示標(biāo)題
getJson() 獲取擴(kuò)展參數(shù)
setJon(String) 用于擴(kuò)展參數(shù),如實(shí)現(xiàn)自定義樣式等
getVerifyCoder() 獲取單例
release() 重置參數(shù)沾歪,釋放資源
startVerifyActivityForResult(Context, String, int) 啟動(dòng)VerifyActivity
getWebView(Context, String, VerifyCoder.VerifyListener) 創(chuàng)建一個(gè)WebView實(shí)例
getContent(String) WebView加載的騰訊驗(yàn)證碼頁(yè)面

VerifyActivity就是騰訊驗(yàn)證碼頁(yè)面漂彤,顯示的內(nèi)容來(lái)自調(diào)用 VerifyCoder.getWebView返回的WebView。最后將驗(yàn)證結(jié)果返回給啟動(dòng)VerifyActivity的頁(yè)面灾搏。

實(shí)現(xiàn)對(duì)話框式的騰訊驗(yàn)證碼

騰訊驗(yàn)證碼SDK里只有這兩個(gè)類挫望,并沒(méi)有為開(kāi)發(fā)者提供對(duì)話框形式的UI。為此只能我們自己來(lái)了确镊。當(dāng)然也沒(méi)那么困難士骤,但為什么騰訊不幫我們做好呢。

我們定義一個(gè)DialogFragment: TencentVerifyCoderDialogFragment蕾域,代碼是模仿 VerifyActivity寫(xiě)的拷肌。讀者可以自行實(shí)現(xiàn)到旦,需要源碼的讀者請(qǐng)移步到:https://github.com/JulianAndroid/Android-Tencent-Captcha/blob/master/TencentVerifyCoderDialogFragment.java

顯示TencentVerifyCoderDialogFragment的代碼:

TencentVerifyCoderDialogFragment.newInstance(url).show(getFragmentManager(), "tencent_verify_coder");

TencentVerifyCoderDialogFragment 跟宿主Activity交互需要宿主Activity實(shí)現(xiàn)TencentVerifyCoderDialogFragment.OnTencentVerifyCoderListener接口巨缘。

效果如下:

image.png

定制騰訊驗(yàn)證碼的擴(kuò)展參數(shù)

個(gè)人認(rèn)為這是開(kāi)發(fā)文檔里最最坑的部分添忘,沒(méi)有之一。開(kāi)發(fā)文檔里也介紹了如果想擴(kuò)展參數(shù)就需要調(diào)用VerifyCode.setJson若锁。JSON字符串這里就不用多說(shuō)了吧搁骑,我剛開(kāi)始的時(shí)候是這么調(diào)用的:

// 設(shè)置樣式和語(yǔ)言
String json = "{\"type\": \"popup\",\"lang\": 2052}";
verifyCoder.setJson(json);
// 顯示騰訊驗(yàn)證碼對(duì)話框
TencentVerifyCoderDialogFragment.newInstance(url).show(getFragmentManager(), "tencent_verify_coder");

我覺(jué)得寫(xiě)的沒(méi)錯(cuò),寫(xiě)這個(gè)文檔的工程師卻偏偏給我們這些苦逼碼農(nóng)開(kāi)個(gè)玩笑又固,工程師何必為難碼農(nóng)啊仲器。最后還是從源碼中找到了答案,上面提到過(guò)VerifyCoder.getWebView加載的網(wǎng)頁(yè)來(lái)自VerifyCoder.getContent仰冠。那么我們把VerifyCoder.getContent返回的內(nèi)容打印出來(lái)看看:

<html>
    <head lang="zh-CN">
        <title>驗(yàn)證碼</title>
        <meta charset="UTF-8">
            <meta name="renderer" content="webkit">
                <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
                    <meta name="format-detection" content="address=no; email=no">
                    </head>
                    <body></body>
                </html>
                <script src="https://captcha.guard.qcloud.com/template/TCapIframeApi.js?appid=1252162611&clientype=2&lang=2052&asig=x7mPS8V3qb3QKelOoU_OiyYsOlLuOsRqu2WbNKdwB4pi77sXqyPa5EfmG8QPYTRtE9r2Mf4G6MGD12WNu1pzAGwJgWzPkDvx"></script>
                <script type="text/javascript">
function CapCallBack(resultJson)
{
prompt(JSON.stringify(resultJson));
}
var CapArgs = {
"showHeader":false,
{"type": "popup","lang": 2052},
"callback": CapCallBack
}
window.onload=function(){capInit(document.body,CapArgs);}
</script>

想必讀者應(yīng)該知道錯(cuò)在哪了吧乏冀,說(shuō)好的JSON呢?去掉大括號(hào)洋只,我們就可以自由自在的修改樣式了辆沦。關(guān)于如何修改驗(yàn)證碼樣式,Android客戶端API里也是只字未提识虚,不是所有的Android程序員都懂前端肢扯。。担锤。修改驗(yàn)證碼樣式請(qǐng)移步H5網(wǎng)頁(yè)API查看 javascript 接口說(shuō)明小節(jié)蔚晨。

我把驗(yàn)證碼的樣式改成了彈窗式,正確設(shè)置樣式的代碼如下:

VerifyCoder verifyCoder = VerifyCoder.getVerifyCoder();
// 設(shè)置樣式和語(yǔ)言
String json = "\"type\":\"popup\", \"lang\":" + (isZnCn ? 2052 : 1033);
verifyCoder.setJson(json);
TencentVerifyCoderDialogFragment.newInstance(url).show(getFragmentManager(), "tencent_verify_coder");

效果如下:

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妻献,一起剝皮案震驚了整個(gè)濱河市蛛株,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌育拨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欢摄,死亡現(xiàn)場(chǎng)離奇詭異熬丧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)怀挠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)析蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绿淋,你說(shuō)我怎么就攤上這事闷畸。” “怎么了吞滞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵佑菩,是天一觀的道長(zhǎng)盾沫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)殿漠,這世上最難降的妖魔是什么赴精? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绞幌,結(jié)果婚禮上蕾哟,老公的妹妹穿的比我還像新娘。我一直安慰自己莲蜘,他們只是感情好谭确,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著票渠,像睡著了一般琼富。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庄新,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天鞠眉,我揣著相機(jī)與錄音,去河邊找鬼择诈。 笑死械蹋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的羞芍。 我是一名探鬼主播哗戈,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荷科!你這毒婦竟也來(lái)了唯咬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤畏浆,失蹤者是張志新(化名)和其女友劉穎胆胰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刻获,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜀涨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝎毡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厚柳。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沐兵,靈堂內(nèi)的尸體忽然破棺而出别垮,到底是詐尸還是另有隱情,我是刑警寧澤扎谎,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布碳想,位于F島的核電站烧董,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏移袍。R本人自食惡果不足惜解藻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葡盗。 院中可真熱鬧螟左,春花似錦、人聲如沸觅够。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喘先。三九已至钳吟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窘拯,已是汗流浹背红且。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涤姊,地道東北人暇番。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像思喊,于是被迫代替她去往敵國(guó)和親壁酬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • date: 2017-02-14 17:05:03 一個(gè)完整的(大)數(shù)據(jù)處理可以分為這幾個(gè)階段: 數(shù)據(jù)收集 數(shù)據(jù)存...
    樸有天虹閱讀 331評(píng)論 0 0
  • 百日寫(xiě)作已經(jīng)進(jìn)入第30天了恨课,回想第一天舆乔,那還是我工作不忙的時(shí)候,仿佛已經(jīng)是上個(gè)世紀(jì)的感覺(jué)剂公,那時(shí)候我陽(yáng)光希俩、悠閑、有抱...
    神煩閱讀 385評(píng)論 0 0
  • 該死的暴雨诬留,毫無(wú)征兆斜纪,早上還一副不曬死你我就不配叫盛夏的傲嬌,到了下午就沒(méi)脾氣地下起了暴雨文兑,走在路上直接傾盆而下,...
    linyata閱讀 255評(píng)論 5 2
  • 死磕 Fragment 的生命周期 本文原創(chuàng)腺劣,轉(zhuǎn)載請(qǐng)注明出處绿贞。歡迎關(guān)注我的 簡(jiǎn)書(shū) ,關(guān)注我的專題 Android ...
    MeloDev閱讀 6,997評(píng)論 43 105