关闭

Android 必知必会 - 极简版 Leancloud 短信验证码功能

标签: android
2275人阅读 评论(0) 收藏 举报
分类:

如果移动端访问不佳,请访问 ==> Github版

使用 LeanCloud 的 REST API 来自定义短信验证码相关功能,不再需要臃肿的 SDK 。

背景

公司的项目仅仅使用了 Leancloud 短信功能来发送验证码,刚开始 Leancloud 的短信 SDK 还会和项目中的 okhttpfastjson 产生冲突,后来使用了独立的命名空间解决了冲突,但这样处理会导致项目中产生大量的冗余库。在仅仅使用短信验证码功能 SDK 的情况下会有下列文件被引入到项目中:

  • avoscloud-sdk-v3.13.8.jar
  • fastjson-1.1.39-leancloud.jar
  • okhttp-2.6.0-leancloud.jar
  • okio-1.6.0-leancloud.jar

本来开发 Android 时,大家都尽量避免触碰 64K 个方法的限制,对于发验证码这样一个简单的事情,还需要引入大量的第三方库实在是难以接受。

在目前开发的新项目中,我尽量控制第三方库的筛选和使用,不想引起启用 Multidex 导致应用启动慢的问题。直到我发现 Leancloud 的 REST API ,顿时觉得里面有搞头,对,大有搞头

搞点事情

首先贴下文档地址:短信服务 REST API 详解 ,建议先进行初步阅读了解基础概念。

REST API 是请求接口,与具体的语言无关,这里仅仅演示 Android 下使用 Java 语言的一个实现。

项目中使用的是 okhttp-3.4.1gson-2.7 ,当然你也可以使用其他网络请求库和JSON 解析库。下面上关键代码:

OkHttpUtil

// Constants.APP_KEY 和 Constants.APP_ID 在 LeanCloud 控制台获取
// String MD5Util.string2MD5(String s); 进行 MD5 加密的一个方法。
// 项目使用了 Logger 日志库,没使用的话请自行删除相关代码...

public class OkHttpUtil {
    private static OkHttpUtil OkHttpUtil = new OkHttpUtil();
    private static OkHttpClient client;

    public static OkHttpUtil getInstance() {
        client = new OkHttpClient().newBuilder().build();
        return OkHttpUtil;
    }
    public Boolean postJson(String target, String json) {
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody requestBody = RequestBody.create(JSON, json);
        long timestamp = System.currentTimeMillis();
        String sign = MD5Util.string2MD5(timestamp + Constants.APP_KEY);
        Request request = new Request.Builder()
                .addHeader("X-LC-Id", Constants.APP_ID)
                .addHeader("X-LC-Sign", sign + "," + timestamp)
                .url(target)
                .post(requestBody)
                .build();
        try {
            Response response = client.newCall(request).execute();
            //判断请求是否成功
            if (response.isSuccessful()) {
                return true;
            } else {
                Logger.e(response.body().string());
            }
        } catch (Exception e) {
            Logger.e(e.toString());
        }
        return false;
    }
}

LoginActivity

    /**
     * 发送短信验证码
     * params : mobilePhoneNumber
     */
    private class SendCodeTask extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... params) {
          //ttl后面的值是短信有效时间(分钟)
            String json = "{\"mobilePhoneNumber\":\"{0}\",\"ttl\":10,\"name\":\"注册\"}";
            json = json.replace("{0}", phone);
            return okHttpUtil.postJson("https://api.leancloud.cn/1.1/requestSmsCode", json);
        }

        @Override
        protected void onPostExecute(Boolean s) {
            super.onPostExecute(s);
            if (s) {
              Toast.makeText(LoginActivity.this,"验证码发送成功",Toast.LENGTH_SHORT).show();
            } else Toast.makeText(LoginActivity.this, "验证码发送失败",Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 验证短信验证码
     * params : mobilePhoneNumber , smsCode
     */
    private class VerifySmsCode extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... params) {
            String json = "{\"mobilePhoneNumber\":\"{0}\"}";
            json = json.replace("{0}", params[0]);
            return okHttpUtil.postJson("https://api.leancloud.cn/1.1/verifySmsCode/" + params[1], json);
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            if {
              //do something
            }
            else Toast.makeText(LoginActivity.this, "验证码不匹配",Toast.LENGTH_SHORT).show();
        }
    }

总结

自己动手,丰衣足食啊。

顺便吐槽下:国内的很多第三方 SDK 封装的时候,基本上没怎么考虑使用者项目中已经使用了什么类库。对于大部分常见的类库(图片加载库,网络请求库等)进行进一步的抽象,可以大大减少开发者的负担。

如果你不明白我的意思,可以看看 GalleryFinal 这个开源图片选择器对于图片加载库的封装,使得它可以适应多种图片加载库而不需要你修改项目中已有的图片库。

如果你有更好的或者其他想法,欢迎和我交流。

PS:你可以通过下面的方式和我联系

0
0
查看评论

LeanCloud android sdk安装指南

获取 SDK 获取 SDK 有多种方式,较为推荐的方式是通过包依赖管理工具下载最新版本。 包依赖管理工具安装 Gradle Gradle 是 Google 官方推荐的构建 Android 程序的工具,使用 Android Studio 进行开发的时候,它会自动在新建的项目中包...
  • qq_26122557
  • qq_26122557
  • 2017-08-16 15:38
  • 412

SQL必知必会 第4版pdf

下载地址:网盘下载 内容简介  · · · · · · SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺...
  • cf406061841
  • cf406061841
  • 2017-06-03 23:18
  • 5033

《SQL必知必会》(1-7)

《SQL必知必会》读书笔记 说明:本书SQL语句均使用PLSQL Developer客户端,在oracle数据库中实践。 1. 基本概念 表(table):某种特定类型数据的结构化清单。 模式(schema):用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系) 主键(pr...
  • Regina_niu
  • Regina_niu
  • 2016-12-21 09:33
  • 519

SQL必知必会第4版读书笔记

SQL必知必会_4 前言 @author 鲁伟林 在读电子版> 第4版时,做了下笔记。供以后自己或者其他学习者参考。 电子版>和书中使用的数据库和表的源代码, 请参看地址:https://github.com/thinkingfioa/Notes/tree/master/Read...
  • thinking_fioa
  • thinking_fioa
  • 2017-10-17 20:21
  • 10746

sql必知必会(第四版) 学习笔记一

温习一遍简单的sql语法,把自己掌握还不够的地方,做了些笔记.... 1 去重复关键词,distinct     select distinct sname from student;   2 限制结果top的用法    ...
  • Dreamworker007
  • Dreamworker007
  • 2013-10-26 23:02
  • 8153

正则表达式必知必会(修订版)整理教程

正则表达式必知必会(修订版)整理教程 1.   正则表达式入门 1.1  用途:是一种工具,主要用途是搜索变化多端的文本。匹配       到我们想要的信息。 1.2  使用正则表达式:在线测试工具:...
  • T1DMzks
  • T1DMzks
  • 2016-07-03 01:33
  • 10557

《电子电气工程师必知必会》

《Electrical Engineering 101—Everything You Should Have Learned in School but Probably Didn’t》 ...
  • To_dreams
  • To_dreams
  • 2013-01-11 08:33
  • 1273

《SQL必知必会》学习笔记(一):实验数据初始化

摘要:本文主要提供《SQL必知必会》一书中实验所用的数据库,以及创建数据库、表、约束和初始化的SQL语句。
  • zwxtfqd
  • zwxtfqd
  • 2015-11-18 16:00
  • 2209

《MySQL必知必会》全书总结

知识点回顾
  • sinat_28978689
  • sinat_28978689
  • 2017-02-21 21:08
  • 1794

SQL必知必会(MySQL)

SQL复习
  • pokerface_lx
  • pokerface_lx
  • 2016-08-02 18:07
  • 306
    个人资料
    • 访问:304816次
    • 积分:3555
    • 等级:
    • 排名:第11006名
    • 原创:68篇
    • 转载:8篇
    • 译文:3篇
    • 评论:140条
    博客专栏
    文章分类
    最新评论
    样式调整