使用手机号登录、注册、重置密码

在移动开发的过程中,我们通常会看到许多的应用都是使用手机号注册进行登录的,这样做可以让注册账号和登录的用户体验变得更加简单,读取通讯录后能更加容易的建立用户关系等等优点。当然有优点必然也会存在缺点,用手机号的最大问题就在于手机是可以被更换的(例如你换了城市,或者转网,转套餐,换了手机号)。而换掉的手机号是可能被分配给别人的。这导致有可能一个人拿到一个新的手机号,用XX应用,却发现这个手机号已经注册,这时有两种处理方式:1,如果你使用手机号短信认证来找回帐号的话,那么这个新的手机用户将可以轻易的获得这个手机号相关的原有帐号。2,如果你不允许手机号短信找回,那么将导致这个用户拿着自己新上的手机号无法使用XX应用。

今天我们在这里就先不讨论这个使用手机号注册的利弊问题了,这和今天的标题不符。

唉呀…. 不知道怎么开始写了,先上几张图吧。

登录注册重置密码
登录注册重置密码

是的,其实就一个界面,做三件事情。程序员都爱偷懒,不喜欢做重复的事情,还有就是不爱写文字。^_^

/**
 * 登录
 * @param username
 * @param password
 */
private void login(String username, String password){
    if(TextUtils.isEmpty(username)){
        mUserNameTextInputLayout.setError(getString(R.string.username_is_null));
        return;
    }else if(TextUtils.isEmpty(password)){
        mPasswordTextInputLayout.setError(getString(R.string.password_is_null));
        return;
    }else{
        //否则隐藏上次错误
        mUserNameTextInputLayout.setErrorEnabled(false);
        mPasswordTextInputLayout.setErrorEnabled(false);
    }

    mProgressBar.setVisibility(View.VISIBLE);     // 显示圆形进度条
    mBtnLogin.setEnabled(false);     // 为了避免用户重复点击登录按钮,在开始执行登录请求时将登录按钮设置为不可用状态
    appAction.login(username.replace(" ", ""), password, new ActionCallbackListener<Void>() {
        @Override
        public void onSuccess(Void data) {
            // 登陆成功
            startActivity(new Intent(application, MainActivity.class));
            finish();
        }

        @Override
        public void onFailure(int errorEvent, String message) {
            showToast(message);
            mProgressBar.setVisibility(View.INVISIBLE);  // 隐藏圆形进度条
            mBtnLogin.setEnabled(true);  // 登录失败时,将登录按钮恢复为可用状态
        }
    });
}

以上代码中username.replace(” “,”“)是因为在EditView中用户输入的手机号码,我做了显示格式处理(xxx xxxx xxxx),所以在提交给登录接口时需要将手机号码中的空格去掉再提交。因为项目是采用的MVP架构,以上的代码只是View层的实现,真正的登录实现是在Model层中使用BmobSDK进行的登录操作。

/**
  * Model层-登录
  * @param username  用户名
  * @param password  密码
  * @param listener  回调监听
  */
 @Override
 public void login(String username, String password, final ResponseListener<Void> listener) {
     BmobUser user = new BmobUser();
     user.setUsername(username);
     user.setPassword(password);
     user.login(mContext, new SaveListener() {
         @Override
         public void onSuccess() {
             listener.onSuccess(null);
         }

         @Override
         public void onFailure(int i, String s) {
             listener.onFailure(i, s);
         }
     });
 }

这里只是将手机号码作为了username,所以和前两篇文章使用的登录方法是一样的。接下来是手机号注册的实现,在这篇文章的示例中,手机号注册用到了三个元素(手机号、验证码、密码)。实际上用Bmob SDK提供的手机号注册方法是只需要手机号和验证码即可完成注册过程的,为什么示例中却还有另一个密码值呢?我们先看完代码再说。

/**
  * Model层-手机号注册
  * @param phone_number 手机号码
  * @param password 注册时设置的密码
  * @param security_code 短信验证码
  * @param listener 回调
  */
 @Override
 public void signUp(String phone_number, String password, String security_code, final ResponseListener<Void> listener) {
     User user = new User();
     user.setUsername(phone_number);
     user.setPassword(password);
     user.setMobilePhoneNumber(phone_number);
     user.setNickname(phone_number);
     user.signOrLogin(mContext, security_code, new SaveListener() {
         @Override
         public void onSuccess() {
             listener.onSuccess(null);
         }

         @Override
         public void onFailure(int i, String s) {
             listener.onFailure(i, s);
         }
     });
 }

以上代码中User对象是继承自BmobUser的,并扩展了一个nickname(昵称)属性。BmobUser类有一个静态方法 signOrLoginByMobilePhone(Context context, String phoneNumber, String security_code, LogInListener listener) 是用来做手机号一键注册或登录的。

但是如果注册时需要设置其他属性(如:昵称等等)一同提交就不能用signOrLoginByMobilePhone了。所以为了满足这样的需求,我采用了另一种方法 signOrLogin 来实现。并且将手机号码设置为默认的用户名’user.setUsername(phone_number)‘,默认初始密码为123456 ‘user.setPassword(password)’ 以及用手机号码作为默认的昵称‘user.setNickname(phone_number)’

接下来看看重置密码部分的实现:

/**
  * 验证码重置密码
  * @param security_code 短信验证码
  * @param new_pwd 新密码
  * @param listener 回调
  */
 @Override
 public void resetPasswordBySMSCode(String security_code, String new_pwd, final ResponseListener<Void> listener) {
     BmobUser.resetPasswordBySMSCode(mContext, security_code, new_pwd, new ResetPasswordByCodeListener() {
         @Override
         public void done(BmobException ex) {
             if (ex == null) {
                 listener.onSuccess(null);
             } else {
                 listener.onFailure(ex.getErrorCode(), ex.getLocalizedMessage());
             }
         }
     });
 }

很简单,只需要调用BmobUser的静态方法resetPasswordBySMSCode,传入新密码和短信验证码即可完成重置密码的过程。

最后再说一下注册和重置密码中用到的短信验证码的获取方法:

/**
     * 请求验证码
     * @param phone_number 手机号
     * @param template_name 验证码模板名称
     * @param listener 回调
     */
    @Override
    public void requestSMSCode(String phone_number, String template_name, final ResponseListener<String> listener) {
        BmobSMS.requestSMSCode(mContext, phone_number, template_name, new RequestSMSCodeListener() {
            @Override
            public void done(Integer integer, BmobException e) {
                if (e == null) {
                    listener.onSuccess(integer.toString());
                } else {
                    listener.onFailure(e.getErrorCode(), e.getMessage());
                }
            }
        });
    }

验证码模板名称是在Bmob后台创建短信内容模板定义的名称,可以为注册、重置密码创建不同的短信模板,比如:”xx应用,您的注册验证码为xxxxxx。”,”xx应用,您正在重置密码,验证码为xxxxxx,如非本人操作,请忽略。”

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值