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

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

需要的材料

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

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

流程

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

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

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

    //请求codewx.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();//构建一个ClientHttpGet 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//把信息封装到mapSystem.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

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

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/157115.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scala基本数据类型和运算符

1.数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型&#xff0c;其中 Byte、Short、Int、Long 和 Char 类型统称为整数类型&#xff0c;整数类型加上 Float 和 Double 统称为数值类型。Scala 数值类型的取值范围和 Java 对应类型的取值范围相同。 数据类型 描述 Byte 8 …

0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)

大纲 Tumbling Count WindowsmapreduceWindow Size为2Window Size为3Window Size为4Window Size为5Window Size为6 完整代码参考资料 之前的案例中&#xff0c;我们的Source都是确定内容的数据。而Flink是可以处理流式&#xff08;Streaming&#xff09;数据的&#xff0c;就是…

关于Kubernetes——cka认证含金量怎么样?

2019年和2020年&#xff0c;Rancher分别对近1,000名专业人员展开了调查。调查结果表明&#xff0c;Kubernetes在不同行业连续两年保持了90%以上的采用率&#xff0c;而生产环境中的容器采用率从2019年的85%增长至2020年的87%。 SUSE大中华区总裁秦小康表示&#xff1a;“从调研…

进阶|HDR-ISP支持ROS2以及GPU实时处理啦!

引言 之前我们开源了一份HDR-ISP代码供大家入门学习&#xff0c;但很多后台同学反馈CPU版本是实时性不够、对于相机无法实时处理。没关系&#xff0c;今天Cuda加速、支持ROS2可以实时处理的的HDR-ISP GPU版本来啦&#xff01; 此次GPU版本开源版本只提供lib供学习测试&#x…

使用LWP::UserAgent库程序

使用LWP::UserAgent库的下载器程序&#xff0c;它使用Perl下载图片。以下是代码&#xff1a; #!/usr/bin/perl -w use strict; use LWP::UserAgent; ​ # 创建对象 my $proxy LWP::UserAgent->new(proxies > {http > ""}); ​ # 加载网页 my $response $…

arcpy.message实现探索

arcpy 位置D:\Program Files\GeoScene\Pro\Resources\ArcPy\arcpy\__init__.py ”““AddMessage(消息) 创建可以使用任何GetMessages函数访问的地理处理信息消息(Severity0)。 message(字符串):要添加的消息。”“ arcpy.geoprocessing D:\Program Files\GeoScene\Pro\Re…

容斥原理,多步容斥

容斥意义法 设计状态表示容斥的过程。比较简单的容斥题目一般可以容斥意义。 如果我们要求方案数的话&#xff0c;通常情况下我们的把限制视为两个方面&#xff0c;一方面是总限制&#xff0c;一方面是对于每个物品的限制&#xff0c;这样设集合 S i S_i Si​表示满足总限制以及…

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…

《Generic Dynamic Graph Convolutional Network for traffic flow forecasting》阅读笔记

论文标题 《Generic Dynamic Graph Convolutional Network for traffic flow forecasting》 干什么活&#xff1a;交通流预测&#xff08;traffic flow forecasting &#xff09;方法&#xff1a;动态图卷积网络&#xff08;Dynamic Graph Convolutional Network&#xff09;…

2. 网络之网络编程

网络编程 文章目录 网络编程1. UDP1.1 DatagramSocket1.1.1 DatagramSocket 构造方法1.1.2 DatagramSocket 方法&#xff1a; 1.2 DatagramPacket1.2.1 DatagramPacket构造方法1.2.2 DaragramPacket方法1.2.3InetSocketAddress API 1.3 UDP回显服务器1.3.1 框架结构1.3.2 读取请…

miniconda快速安装

目录 一、Linux下miniconda安装 1.1、安装 1.2、miniconda初始化 二、Windows下miniconda安装 三、maOS下miniconda安装 3.1、安装 3.2、miniconda初始化 四、参考&#xff1a; 本文给出windows、macos、linux下快速安装miniconda方法。 对比conda&#xff0c;minicond…

Maven Repository使用

1.Maven Repository网站 https://mvnrepository.com/https://mvnrepository.com/ 2.查询需要的依赖 3.参考例子 <!-- https://mvnrepository.com/artifact/org.freeswitch.esl.client/org.freeswitch.esl.client --> <dependency> <groupId>org.freesw…