热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Android开发腾讯验证码遇到的坑

这篇文章主要介绍了Android开发腾讯验证码遇到的坑,需要的朋友可以参考下

我司为响应有关部门的号召,要求新注册的用户必须提供手机号验证。又为了防范有不怀好意之人故意盗刷短信,我司决定接入验证码。经前端同事调研之后,决定接入腾讯验证码。接入过程中还是踩了一些坑,为此特地写这篇文章 致腾讯令人作呕的开发文档 。

腾讯验证码开发指引

我们是Android端开发,服务器端的开发就交给后端同事吧。移动端的开发只需要从我们的后台请求一个url就可以。

移动端开发首先请阅读APP开发指引,接着阅读不同移动平台的API文档。Android开发者直接阅读Android客户端API就好了。

腾讯验证码的基本使用

基本使用方法可按照Android客户端API文档描述的流程操作。这里我们再重复一遍:

1.接入要求

Android系统2.3以上

2.在AndroidManifest.xml中声明网络权限

3.在AndroidManifest.xml中注册VerifyActivity

4.向我们的后台发请求获取jsurl(参考服务端开发获取验证码JSURL的接口)

5.获取到jsurl后调用接口 VerifyCoder.getVerifyCoder().startVerifyActivityForResult(Context context,String jsurl,int requestCode) 并重写 onActivityResult 来接收是否验证成功的通知。

/*
 * 参数说明:
 * context     调用验证码时当前界面的上下文,
 *         用于(Activity) context).startActivityForResult,
 *         请勿使用application的上下文
 * jsurl      验证码的js链接,从我们后台获取
 * requestCode   对应onActivityResult的requestCode,可自定义
*/
VerifyCoder.getVerifyCoder().startVerifyActivityForResult(Context context,String jsurl,int requestCode)
//onActivityResult实现实例:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == 1) {//此处对应startVerifyActivityForResult的参数值
     if(resultCode==Activity.RESULT_OK){
       Log.e("onActivityResult", "verifysucc");
       Toast.makeText(MainActivity.this, "验证成功",2000).show();
     }
     else{
       Toast.makeText(MainActivity.this, "未验证成功",2000).show();
     }
   }
 }

6.如需混淆,添加如下脚本


Android客户端API 在收尾处还提到了其他接口说明:

public static VerifyCoder getVerifyCoder()   //获取单例
public void release()              //重置参数,释放资源
public void setShowtitle(boolean showtitle)   //是否显示验证码页面标题栏
public void setJson(String json)        //用于扩展参数,如实现自定义样式等
public WebView getWebView(Context context,String jsurl,VerifyListener listener) //获取验证码WebView

如果你按照官方文档描述信息一路走下来,最终的效果是这样的:

 

真想说一句:你长成这样,你们的麻花藤粑粑知道吗? 估计有点审美的程序员都不能容忍自己开发的APP里出现如此Low逼的页面。自给自足,丰衣足食。还是我们自己来吧。

进阶篇

下载VerifyCodeSdk。SDK 的内容如下:

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

一个示例项目和一个jar包。示例项目就别看了,基本就是开发文档的翻版,没有什么有用的信息。把jar包引入我们的项目可以看到内容及其简单,只有两个文件: VerifyActivity.java 和 VerifyCoder.java 。

阅读源码外加Debug后得出以下结论:

可以借助VerifyCoder为腾讯验证码的页面做一些定制化。方法如下:

VerifyActivity就是腾讯验证码页面,显示的内容来自调用 VerifyCoder.getWebView 返回的WebView。最后将验证结果返回给启动VerifyActivity的页面。

实现对话框式的腾讯验证码

腾讯验证码SDK里只有这两个类,并没有为开发者提供对话框形式的UI。为此只能我们自己来了。当然也没那么困难,但为什么腾讯不帮我们做好呢。

我们定义一个DialogFragment: TencentVerifyCoderDialogFragment ,代码是模仿 VerifyActivity 写的。读者可以自行实现,需要源码的读者请移步到 TencentVerifyCoderDialogFragment.java 。

使用 TencentVerifyCoderDialogFragment 的代码如下:

// 显示TencentVerifyCoderDialogFragment
TencentVerifyCoderDialogFragment.newInstance(url).show(getFragmentManager(), "tencent_verify_coder");
// TencentVerifyCoderDialogFragment与宿主Activity交互
public class MainActivity extends AppCompatActivity implements TencentVerifyCoderDialogFragment.OnTencentVerifyCoderListener {
  @Override
  public void onVerifySucc(String ticket, String randstr) {
  }
  @Override
  public void onVerifyFail() {
  }  
}

效果如下:

 

定制腾讯验证码的扩展参数

个人认为这是开发文档里最最坑的部分,没有之一。开发文档里也介绍了如果想扩展参数就需要调用 VerifyCode.setJson 。JSON字符串这里就不用多说了吧,我刚开始的时候是这么调用的:

// 设置样式和语言
String json = "{\"type\": \"popup\",\"lang\": 2052}";
verifyCoder.setJson(json);
// 显示腾讯验证码对话框
TencentVerifyCoderDialogFragment.newInstance(url).show(getFragmentManager(), "tencent_verify_coder");

我觉得写的没错,写这个文档的工程师却偏偏给我们这些苦逼码农开个玩笑,工程师何必为难码农啊。最后还是从源码中找到了答案,上面提到过VerifyCoder.getWebView加载的网页来自VerifyCoder.getContent。那么我们把VerifyCoder.getContent返回的内容打印出来看看:


  
    
    
      
        
          
          
          
        
         

总结

以上所述是小编给大家介绍的Android开发腾讯验证码遇到的坑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
author-avatar
Q457423356
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有