首页 > 编程语言 >微信小程序实现微信和账号密码同时登录

微信小程序实现微信和账号密码同时登录

时间:2023-10-17 17:03:35浏览次数:30  
标签:String 登录 程序实现 微信 用户 sysUser 账号密码 userInfo

前言

微信小程序是一种轻量级的应用程序,可以在微信中直接使用,无需下载和安装。在微信小程序中,用户可以使用微信账号登录,也可以使用账户密码登录。本文将介绍如何在微信小程序中实现微信和账户密码同时登录。

正文开始

需求分析

要在微信小程序中实现微信和账户密码同时登录,您需要进行以下步骤:

  • 创建一个登录页面,让用户选择使用微信登录还是账户密码登录。
  • 对于微信登录,您可以使用微信开发者工具提供的 API 进行登录。用户在登录页面点击微信登录按钮后,调用微信登录 API,获取到用户的微信 OpenID 和 SessionKey,然后将这些信息发送到您的服务器进行验证和处理。
  • 对于账户密码登录,您需要让用户输入用户名和密码,然后将这些信息发送到您的服务器进行验证和处理。
  • 无论是微信登录还是账户密码登录,您的服务器都需要验证用户的身份,并返回一个登录凭证(例如一个 token)给小程序。
  • 小程序在接收到登录凭证后,可以将其保存在本地,以便用户下次打开小程序时无需再次登录。

需求实现

1、登录界面设计

Snipaste_2023-09-19_11-28-42.png

2、MySql数据库设计

image.png

3、微信登录--前端部分

在微信小程序中,可以使用 wx.login() 方法来获取用户的登录凭证 code。然后,可以将 code 发送到后端服务器端,后端使用微信提供的 API 进行解析,获取用户唯一的openId ,根据openId判断是否存在该用户,存在则登录,反之则进行信息注册,并登录,最后将登录凭证以及登录用户信息返回给前端。

wx.login({
  provider: 'weixin',
  success: (loginRes) => {
    console.log(loginRes);
    wxLogin({
      code: loginRes.code
    }).then((res) => {
      uni.setStorageSync("token", res.data.token);
      uni.setStorageSync("userInfo", res.data.userinfo)
    })
  }
});

4、微信登录--后端部分

在服务器端,获取到前端传递的code,可以使用微信提供的 API 获取用户的 OpenID 和 SessionKey

String url = "https://api.weixin.qq.com/sns/jscode2session";
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("appid", "微信小程序appid");
paramMap.put("secret", "微信小程序secret");
paramMap.put("js_code", code);
paramMap.put("grant_type", "authorization_code");
String result = HttpUtil.get(url, paramMap);
JSONObject json = JSON.parseObject(result);
String openid = json.getString("openid");
String SessionKey = json.getString("SessionKey");

解析出登录用户的openId,使用该 OpenID 查询数据库中是否存在该用户记录。

SysUser sysUser = new SysUser();
sysUser.setOpenid(openid);
List<SysUser> user = sysUserService.list(sysUser);

如果存在该用户记录,表示该用户已经注册过,则进行登录操作,并将登录凭证以及用户信息返回给小程序,如果不存在该用户记录,表示该用户还未注册,则进行注册操作,这里我的做法是,将openid,以及默认用户名作为主要信息,存入数据库,存入成功后,再执行登录操作。

if (user.size() == 0) {
  // 将获取到的信息注册到数据库,然后执行登录操作
  sysUser.setUserName("默认用户");
  sysUserService.save(sysUser);
  SysUser userParams = new SysUser();
  userParams.setOpenid(openid);
  List < SysUser > saveUser = sysUserService.list(userParams);
  if (saveUser.size() == 1) {
    return success(setUserInfo(saveUser.get(0)));
  } else {
    return error("注册信息异常");
  }
} else {
  // 执行登录操作,并返回用户信息和token
  return success(setUserInfo(user.get(0)));
}

注:Java代码中存在的 setUserInfo()为封装的登录流程方法,具体如下:

public Map < String, Object > setUserInfo(SysUser userInfo) {
  String jwt = JwtUtil.createToken(userInfo.getUserId(),userInfo.getUserName(),userInfo.getOpenid()); //jwt包含了当前登录的信息
  loginInfo.setUserId(userInfo.getUserId());
  Map < String, Object > map = new HashMap <> ();
  map.put("userinfo", userInfo);
  map.put("token", jwt);
  return map;
}

完整代码

@ApiOperation("微信登录")
@GetMapping("/wxLogin")
public AjaxResult wxLogin(@RequestParam String code) {
    String url = "https://api.weixin.qq.com/sns/jscode2session";
    HashMap<String, Object> paramMap = new HashMap<>();
    paramMap.put("appid", "微信小程序appid");
    paramMap.put("secret", "微信小程序secret");
    paramMap.put("js_code", code);
    paramMap.put("grant_type", "authorization_code");
    String result = HttpUtil.get(url, paramMap);
    JSONObject json = JSON.parseObject(result);
    String openid = json.getString("openid");
    SysUser sysUser = new SysUser();
    sysUser.setOpenid(openid);
    List<SysUser> user = sysUserService.list(sysUser);
    System.out.println(user.size());
    if (user.size() == 0) {
        // 将获取到的信息注册到数据库,然后执行登录操作
        sysUser.setUserName("IT Tool用户");
        sysUserService.save(sysUser);
        SysUser userParams = new SysUser();
        userParams.setOpenid(openid);
        List<SysUser> saveUser = sysUserService.list(userParams);
        if (saveUser.size() == 1) {
            return success(setUserInfo(saveUser.get(0)));
        } else {
            return error("微信登录注册信息异常");
        }
    } else {
        // 执行登录操作,并返回用户信息和token
        return success(setUserInfo(user.get(0)));
    }
}

public Map<String, Object> setUserInfo(SysUser userInfo) {
    String jwt = JwtUtil.createToken(userInfo.getUserId(), userInfo.getUserName(), userInfo.getOpenid()); //jwt包含了当前登录的员工信息
    loginInfo.setUserId(userInfo.getUserId());
    Map<String, Object> map = new HashMap<>();
    map.put("userinfo", userInfo);
    map.put("token", jwt);
    return map;
}

5、账号密码登录--前端部分

对于账号密码登录,相比对于程序员来说,是很熟悉的,我们向后端传递账号密码进行登录即可。

let res = await login(user);
if (res.code == "200") {
  uni.setStorageSync("token", res.data.token);
  uni.setStorageSync("userInfo", res.data.userinfo)
} else {
  uni.showToast({
    title: res.msg,
    icon: "error",
    duration: 2000
  });
}

6、账号密码登录--前端部分

在服务器端,获取到前端传递的账号和密码,进行查询数据库操作,如果找到该用户,即可登录成功,并返回相关用户信息。

@ApiOperation("账号密码登录")
@GetMapping("/login")
public AjaxResult login(@RequestParam String userName, @RequestParam String password) {
    if (userName != null && password != null) {
        SysUser sysUser = new SysUser();
        String newPassword = new Md5Hash("IT TOOL" + password).toHex();
        sysUser.setUserName(userName);
        sysUser.setPassword(newPassword);
        List<SysUser> user = sysUserService.list(sysUser);
        if (user.size() == 1) {
            return success(setUserInfo(user.get(0)));
        } else {
            return error("用户名或密码错误");
        }
    } else {
        return error("用户名或密码不能为空");
    }
}

7、微信登陆和账号密码进行关联

在实际需求中,同一用户即可使用微信登陆,也能使用账号密码登录,那么如何实现呢,方法很简单。 1、用户首次进行微信登录时,当登录成功后,可进行弹框提示,提示用户,设置用户头像以及用户名,而在用户设置中,可设置当前微信账户密码,此时,微信登录以及账号密码关联成功。

2、用户首次进行账号密码登录,判断该用户openId是否为空,如果为空,提示用户,绑定当前用户微信,实现原理为当前用户的账号密码和openId都存在。

8、安全性考虑

为了保护用户的隐私和安全,需要采取一些措施来保护用户的登录信息。例如:

  • 使用 HTTPS 加密传输数据,防止数据被窃听和篡改。
  • 使用安全的存储方式保存用户的密码,例如使用哈希算法加密密码。
  • 对于微信登录,需要验证用户的 OpenID 和 SessionKey 是否合法,防止伪造登录信息。
  • 对于账户密码登录,需要使用验证码等方式防止暴力破解密码。

总结

在微信小程序中实现微信和账户密码同时登录,需要创建登录页面,使用微信提供的 API 获取用户的 OpenID 和 SessionKey,使用账户密码登录时需要验证用户的用户名和密码,保存登录凭证时需要注意安全性问题。通过以上步骤,可以实现微信和账户密码同时登录的功能。

标签:String,登录,程序实现,微信,用户,sysUser,账号密码,userInfo
From: https://blog.51cto.com/u_16203259/7907769

相关文章

  • 【Python微信机器人】第一篇:在windows11上编译python
    前言我打算写一个系列,内容是将python注入到其他进程实现inlinehook和主动调用。本篇文章是这个系列的第一篇,后面用到的案例是注入python到PC微信实现基本的收发消息。文章着重于python方面的内容,所以对于微信找收发消息的call不会去讲过程,有兴趣的可以直接百度搜PC微信逆向。我......
  • 企业微信群机器人发送消息(三)java端如何控制
    1.先在群里添加机器人,然后获取机器人的webhook地址:假设webhook是:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa2.有多种方式发送群消息,可以采用curl,也可以采用发送http请求的方式,我这里采用okhttp发送http请求,pom如下:<!--ht......
  • 企业微信群机器人发送消息(二)机器人配置说明
    如何使用群机器人在终端某个群组添加机器人之后,创建者可以在机器人详情页看的该机器人特有的webhookurl。开发者可以按以下说明a向这个地址发起HTTPPOST请求,即可实现给该群组发送消息。下面举个简单的例子.假设webhook是:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key......
  • 微信里写周报添加到公司办公平台的方法
    概要微信和公司用的办公平台互通,我们已经说过几篇。这次将给大家介绍,如何在微信里写周报内容,添加到公司办公平台的周报应用里。工作中,如果出差在外,或者回到家想要汇报一周的工作情况的时候,不用下载额外的app,只需要通过常用的微信就可以向办公系统里添加记录,是不是很酷?由于正式......
  • 万户OA域控集成企业微信-删除离职用户
    OA与域控集成后,在域控中禁用/删除用户后,OA同步禁用,但是对接的企业微信并未删除用户。Quartz计划任务classDeleteWeiXinUserJob:IJob{publicstaticstringcorpid=ConfigurationManager.AppSettings["corpid"];publicstaticstringsecrect=Configu......
  • 程序实现--对外接口可不仅仅是“给大佬递餐”,前置工作还是要做滴
    我们来看一个案例。前端页面上,用户在订单详情页确认完信息后,点击“确认支付”,发起余额支付。这里,我们做如下3项假定。1)后台程序暴露的“支付”Rest接口名为order/pay。2)后台程序对于“支付”的处理逻辑,我们简化成下面的业务流程。 3)后台程序是微服务结构,包括提供RestAPI......
  • 【移动开发学习】 Android Studio 编写一个简单的微信界面
    AndroidStudio简单还原微信ui目标实现3-4个tab的切换效果技术需求activity,xdm,fragment,recyclerview成果展示其中联系人界面通过recyclerview实现了可以滑动列表      仓库地址https://github.com/SmileEX/wecaht.git实现过程主要ui第......
  • 微信小程序开发1
    index.wxml文件中:根据我们前面说的官方文档学习可以大概知道,这个文件里主要涉及到的是前端代码,所以这里就比较简单了,写上你要展示的前端代码就行:在微信页面中的视图容器<view>标签来写,这个标签相当于html页面中的<div>标签,我们看看官方文档介绍主要还是负责一些位置控制啥的,理解起......
  • 基于微信小程序的明星应援小程序设计与实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......
  • 小工具 -- 微信/QQ防撤回
    RevokeMsgPatcher软件的名字叫RevokeMsgPatcher,在GitHub上开源。软件截图如下:功能包括微信&QQ&TIM&QQ轻聊版防撤回、多开等。使用方法也非常简单(以微信为例)先关闭软件,然后打开工具选择软件路径,点击安装补丁即可。注意事项:升级或者重新安装微信后需要RevokeMsg......