1. 前言
微信小程序
开发平台,提供有一类 API
,可以让开发者获取到微信登录用户的个人数据。这类 API
统称为 开放接口
。
Tip:微信小程序开发平台,会把微信登录用户的个人信息分为 明文数据 和 敏感数据 。
明文数据也称为公开数据,开发者可以直接获取到,如登录者的昵称、头像……
敏感数据如电话号码、唯一标识符……等数据,只有高级认证开发者和经过登录者授权后才能解密获取到。
这一类 API
较多,且 API
之间功能有重叠之处,相互之间的区别较微小。有的适用于低版本,有的适用于高版本。
为了避免在使用时出现选择混乱,本文将通过具体应用案例介绍几个常用 API
的使用。
2. 开放接口
开放接口
是对一类 API
的统称, 开发者
可以通过调用这类接口得到微信登录用户的 授权
或获取登录者的 个人数据
。
开放接口
又分成几个子类 API
:
- 登录接口: 包括
wx.pluginLogin(Object args)
、wx.login(Object object)
、wx.checkSession(Object object)
几 个API
。 - 账号信息: 包括
Object wx.getAccountInfoSync()
此接口用来获取开发者的账号信息。 - 用户信息: 包括
wx.getUserProfile(Object object)
、wx.getUserInfo(Object object)
、UserInfo
。使用频率非常高的接口,常用于小程序中获取登录者个人公开数据。 - 授权接口:
wx.authorizeForMiniProgram(Object object)
、wx.authorize(Object object)
除上述列出的子类接口,还有收货地址、生物认证……等诸多子类 API
,有兴趣者可以自行了解。
2.1 登录接口
登录
接口中有 3
个 API
,对于开发者来说,使用频率较高的是 login
接口,此环节将重点介绍此接口。
非本文特别关注的接口,会简略带过。
wx.pluginLogin(Object args)
:此接口只能在插件中可以调用,调用此接口获得插件用户的标志凭证 code
,插件可使用此凭证换取用于识别用户的唯一标识 OpenpId
。
用户不同、宿主小程序不同或插件不同的情况下,该标识均不相同,即当且仅当同一个用户在同一个宿主小程序中使用同一个插件时, OpenpId
才会相同。
对于一般开发者,此 接口用的不是很多,具体使用细节在此处也不做过多复述。
什么是 OpenId
?
当微信用户登录公众号或小程序时,微信平台为每一个微信登录者分配的一个唯一标识符号。
2.1.1 wx.login(Object object)
功能描述:
-
开发者使用此接口可以获取到
微信登录者
的登录凭证(code)
。登录凭证
具有临时性,也就是每次调用时都会不一样,所以code
只能使用一次。 -
开发者可以通过临时
code
,再向微信接口服务器索取登录者的唯一标识符OpenId
、微信开发平台账号的唯一标识UnionID
(需要当前小程序已绑定到微信开放平台帐号)、以及会话密钥session_key
。
那么,获取到的 openId
和 session_key
对于开发者而言,有什么实质性的意义?
-
根据
OpenId
的唯一性特点,可以在微信用户第一次登录时,把OpenID
保存在数据库或缓存中,在后续登录时,只需要检查用户的OpenId
是否存在于数据库或缓存中,便能实现自动登录功能。 -
session_key
也称会话密钥,用来解密微信登录者的敏感数据。后文将详细介绍。
如何获取 OpenId
?
现通过一个简单案例,实现微信小程序端与开发者服务器之间的数据交互。以此了解开发者服务器如何通过微信小程序传递过来的用户临时 code
换取到登录者的更多信息。
实现之前,先通过一个简易演示图了解其过程。
简单描述整个请求过程:
- 微信用户打开微信小程序后,开发者在微信小程序中通过调用
wx.login
接口获取到临时登录凭证code
。 - 在微信小程序中调用
wx.request
接口向开发者服务器发送http
请求,需要把登录凭证code
一并发送过去。 - 开发者服务器使用发送过来的
code
以及开发者凭证信息向微信接口服务器
索取微信登录者的openId
和session_key
。
简而言之,就是 3
者(微信小程序、开发者服务器、微信接口服务器)之间的一个击鼓传花游戏。
开发流程:
第一步:项目结构分析
完整的系统由 2
个部分组成:
-
微信小程序端
APP
。如对微信小程序开发不是很了解,请先阅读官方提供的相关文档。
-
服务器端应用程序。
本文的服务器端应用程序基于
Spring Boot
开发平台。
本项目结构是标准的前后端分离模式,微信小程序是前端应用,服务器端应用程序为后台应用。
第二步:新建微信小程序(前端应用)
打开微信开发工具,新建一个名为 guokeai
的小程序项目 ,项目会初始化一个 index
页面。在 index.js
中编写如下代码。
//index.js const app = getApp() const httpRequest = require("../../utils/request.js") Page({ data: { isHasUserInfo: null, userInfo: null }, //启动时 onLoad: function () { let this_ = this /*** * 检查微信用户是否已经登录到后台服务器 * 已经登录的标志,数据库中存在 OPENID */ let code = null //调用 login 接口 wx.login({ success: (res) => { //得到登录用户的临时 code code =