知乎程序(微信账号zxcx0101)与大家分享基于Java和SpringMVC在服务器端实现的微信小程序登录系统。
登录功能是很多小程序必备的功能。通过登录系统,我们可以在我们的小程序中记录用户的一些操作,也可以在后台模糊地确认用户。
在小程序中,微信只为开发者提供了获取用户昵称和头像的基础接口。这两个值都不能唯一标识用户。如果需要唯一标识用户,则需要获取额外的OpenID。
虽然获取到的OpenID是唯一的,但无法立即与开发者服务器后台的某个用户关联起来,需要通过开发者服务器进行绑定。
微信官方文档详细介绍了登录流程。从流程中,我们可以提炼出关键流程点:
1、小程序调用wx.login()接口获取登录所需的代码;
2、小程序通过wx.request()与开发者服务器进行通信;
3、开发者获取到code后,与微信服务器通信,获取openid和session_key;
4、使用随机值作为key,以openid和session_key作为值,保存用户的登录状态信息;
5、服务端返回一个随机值给小程序客户端。未来小程序的请求会附带返回的随机值,保证用户的合法性;
首先我们需要构造一个GET请求来实现开发者服务器与微信服务器的通信:
我们获取控制器中code的值,然后检查appid和secret,构建完整的通信接口,通过GET方法完成与微信服务器的通信。
如果通讯正常,我们解析结果,就可以得到openid和session_key。接下来,我们需要保存用户的登录状态信息。
如果我们需要获取登录用户的用户名和昵称,还需要注意一个问题:昵称中的中文可能是乱码。
这是因为微信使用ISO-8859-1编码标准来读取中文,而我们需要的是UTF-8编码的字符。