微信小程序实现微信登录(Java后台)

这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。

需要的材料

1:一个可以测试的微信小程序

2:此微信小程序的APPID和APPscret

流程

微信用户对应一个小程序都有一个唯一的openid,微信授权登录,微信授权登录的核心就是获取这个openid并存在数据库作为用户存在的唯一标识。微信授权登录的流程大体分为两步

1.微信小程序前端获取code并发送到后台

在微信小程序的前端调用wx.login()获取一个code,这个code就像是我们去微信后台服务器获取用户信息的一个钥匙,微信通过获取这个code的过程给用户一个选择是否授权的选择,如果用户选择了授权就会返回一个code。这个code是一次性的,也是有时限的,代码如下。

复制代码
    //请求code
    wx.login({
      success(res) {
        if (res.code) {
             //把获取到的code通过一个request的请求发给java服务器
            wx.request({
            url:你的url地址,
            data: {
              code: res.code
            },  
            method: 'POST',
            dataType: 'json',
            success: function (res) {
                //请求成功的处理
            }
        }
      },
      fail: function () {
        console.log("发送code失败:", res.data);  
      }
    })

2.后台接收code并通过code拉取用户的openid

后台接受了code以后通过建立一个http请求去访问微信后台服务器拉取这个用户的openid,

如果一切正常就会得到这个用户对应这个小程序的openid和用户个人的Access_token(和微信小程序的Access_Token不一样)。

请求的地址:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

通过GET方式访问,其中的参数分别是:

appid:小程序的appid

secret:小程序的appsecret

js_code:小程序前端传来的code

grant_type:这个不用修改,表示授权的类型

需要用到的包

复制代码
<!-- http请求工具包依赖 -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.5.2</version>
</dependency>

public Map<String, Object> hqToken(String code, String APPID, String APPSecret) {
        StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");
        url.append("appid=");//appid设置
        url.append(APPID);
        url.append("&secret=");//secret设置
        url.append(APPSecret);
        url.append("&js_code=");//code设置
        url.append(code);
        url.append("&grant_type=authorization_code");
        Map<String, Object> map = null;
        try {
            HttpClient client = HttpClientBuilder.create().build();//构建一个Client
            HttpGet get = new HttpGet(url.toString());    //构建一个GET请求
            HttpResponse response = client.execute(get);//提交GET请求
            HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
            String content = EntityUtils.toString(result);
            System.out.println(content);//打印返回的信息
            JSONObject res = JSONUtil.parseObj(content);//把信息封装为json
            //把信息封装到map
            System.out.println("------dasasdasdasdasd");
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

返回的数据

通过上面的代码,我们就可以拿到返回的数据转为的Map返回了。之后的逻辑代码我就不贴了,每个人的都不同,我说一下我的思路。这里我只用到了openid,在业务代码中从map中获取openid,如果成功获取就通过这个openid查询数据库,如果没有找到相应的记录,就说明这个用户第一次登录,我就为他创建一个新账户,并把账户的userid和这个openi做一个关联存到另外一张表中,为什么不把openid也存到账户的信息表中呢?把openid和用户信息分开保存,以后如果项目做平台移植时更方便。存完表之后把这个openid对应的账户标记为登录状态,然后把相应的用户信息和sessionid(或者token,根据你具体的实现方式)返回。

这就是用户微信第一次授权,相当于是一个注册的过程。

如果从Map中得到的openid已经在数据库中有记录的话,说明此用户已经注册过了,这时就把openid对应的用户信息和sessionid返回并把这个用户标记为登录状态就ok了。

这时用户微信非第一次授权,相当于一个登录的过程。此次授权是是登录还是注册,我通过一个建立一个标识位给前端判断,前端如果通过这个标识位判断这次是注册,就继续通过wx.getUserInfo()方法拉取用户头像昵称等信息,然后通过修改用户信息的接口传到后端进行一个修改的操作。建议不要每次获取code之后就调用getUserInfo方法拉取信息然后一次性把code和用户信息传到后端,一来是用户如果进行的登录操作,微信个人信息时没有用的,增加了获取数据时间和传输时间。二是我们如果每次获取到用户信息就给他设置个人信息,这样就会覆盖用户之前的操作(比如用户之前已经修改一次头像,这时微信头像和小程序内部头像是不同的,然后用户重新登录了一下,两者的头像又一样了,这样是错误的),如果不想得到这样的结果就得再进行一次判断,增加了代码耦合度。所以登录注册应该只传code,用户的信息设置应该用另外一个接口。

最后

微信官方这方面的文档写的比较详细:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

只是我在做的时候也踩了不少坑,这次把微信授权登录的流程做了详细的记录

相关推荐
2501_915921431 小时前
HTTP和HTTPS协议全面解析:技术原理与安全应用
安全·http·ios·小程序·https·uni-app·iphone
double_eggm11 小时前
微信小程序2
微信小程序·小程序
是江迪呀20 小时前
实时看大家都在干嘛?我靠一行监听函数,做了个轻互动小程序
前端·微信小程序
码视野20 小时前
课后报名小程序 — 从需求到原型的全栈实践
小程序
打瞌睡的朱尤1 天前
微信小程序1~25
微信小程序·小程序
hnxaoli1 天前
win10小程序(十八)剪切板循环粘贴
python·小程序
Crazy CodeCrafter1 天前
现在做服装,实体和电商怎么选?
大数据·数据库·人工智能·微信·开源软件·零售
拖孩1 天前
我用 AI 搓了一个"比谁更持久"的微信小游戏,AI实现只用了一天,微信审核却用了一个月!!!
微信小程序·ai编程·游戏开发
河北清兮网络科技2 天前
短剧 APP 产品说明
小程序·uni-app·短剧
宠友信息2 天前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app