Java 实现微信自动登录

需求: 用户通过微信进行登录,如果是第一次登录,则进入绑定界面,需要用户输入用户名和密码保存到数据库;如果不是第一次登录,则直接跳过绑定界面,实现微信自动登录。

思路: 每个微信用户请求某个微信服务号都会产生一个 code 值,通过该 code 值能够解析出用户唯一的 openid 值。将第一次登录的用户的 code 值和 openid 值保存到数据库中,以后如果再次请求该服务号,则先去判断 code 和 openid 是否在数据库中,如果在,就能够实现微信的自动登录。

注意: 微信的 code 值每 5 分钟就会失效,但一个微信用户的 openid 是不变的。如果 code 值不在数据库中,但 openid 在,也说明该用户之前已经登录过,这个时候要更新数据库中的 code,同时自动登录。

具体流程如下图:

那么问题来了:如何获取 code 值?

在测试的时候,如何构造一个 code 参数呢?首先我们可以注册一个微信公众号,然后在左侧【开发中工具】中找到【公众平台测试账号】的选项,能得到 appID 和 appsecret 两个值,这两个值可以帮助我们从 code 中解析出该用户的 openid。往下滑动,我们还需要关注测试号二维码,可以看到我们的 openid 值(下图中打马赛克的那个),该 openid 值就是通过 code 值能够解析出的该用户的 openid 值。

再往下滑,找到 【网页服务】-> 【网页账号】,点击修改,里面填入我们的回调域名(如果是测试工具,填 ip 地址也行),但是不能加上 http:// 或者 https://(回调域名随便设置一个可以访问到的网址)。

之后我们可以用接下来的网址产生一个 code 参数: https://open.weixin.qq.com/connect/oauth2/authorize?appid=appID&redirect_uri=URI&response_type=code&scope=snsapi_base&state=123#wechat_redirect

注意点:其中,将 appID 换成你的测试号的 appID,URI 换成你的回调域名,而且一定要加上 http:// 或者 https:// ,这个链接要在微信客户端打开,然后再在浏览器中打开,在浏览器的 URL 地址栏中就可以找到 code 参数值,如下返回的链接: http://URI/?code=061nPiaw13KHu90vlw7w1WO4aw1nPiax&state=123,其中 URI 是你的回调域名,061nPiaw13KHu90vlw7w1WO4aw1nPiax 就是生成的 code 参数。

在测试的时候,一个 code 只能使用一次,下次还用产生 code 参数的链接生成新 code 参数即可。

后记:如果项目最后要上线的话,记得把该测试号用到的所有参数更新为服务号对应的参数(如appID、appsecret、回调域名等等)。

由于是公司项目,Java 实现的代码就不贴出了。网上有类似的,改一改就可以用。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

[WCF 4.0新特性] 默认绑定和行为配置

对于传统的WCF配置系统,无论是绑定的配置还是行为(服务行为和终结点行为)都必须具有一个名称。而正是通过整个配置名称,它们才能被应用到目标对象(终结点或者服务)...

201100
来自专栏机器学习从入门到成神

Spring使用p名称空间配置属性

Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式。

19110
来自专栏Java 技术分享

Hibernate Session总结

35980
来自专栏Java 技术分享

Hibernate Session总结

15060
来自专栏Micro_awake web

es6(六):module模块(export,import)

es6之前,社区模块加载方案,主要是CommonJS(用于服务器)和AMD(用于浏览器) 而es6实现的模块解决方案完全可以替代CommonJS和AMD ES6...

21970
来自专栏王二麻子IT技术交流园地

CentOS yum安装Apache + PHP + Tomcat7 + MySQL

可以参考下文在CentOS安装Apache + PHP + Tomcat7 + MySQL。 ---------------------------------...

97950
来自专栏极客生活

数据分析Excel之去重

默认是所有列对比,也就是将所有列看成一个元组,全都相同才算重复。 比如上图中,由于「全选」,只有一个重复值就是20行和21行,点击「删除重复项」即可。

9110
来自专栏Golang语言社区

Golang语言--select

Golang语言--select golang的select与channel配合使用。它用于等待一个或者多个channel的输出。 应用场景:主goroutin...

36570
来自专栏Django Scrapy

jupyter notebook下mongodb的使用

1 首先插一嘴,如何导入.json文件 命令行窗口打开 mongo.exe 创建数据库 db.createCollection('the_filena...

596140
来自专栏JavaEdge

JVM性能调优实战(一) - 基于JDK命令行的监控1 JVM的参数类型2 查看JVM运行时参数3 jstat查看JVM统计信息GC

7910

扫码关注云+社区

领取腾讯云代金券