微信小程序学习之路——API登陆
登陆
在小程序中,登陆分为2步,第一步需要获取登陆凭证,第二步用用户凭证获取用户登陆态信息,登陆态信息可用于后续支付等流程。
1.wx.login(Object)
调用接口获取登陆凭证(code)进而换取用户登陆信息,包括用户唯一表示(openid)及本次登陆的会话**(session_key),用户数据的加解密通信需要依赖会话**完成,Object参数属性如下:
属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|---|
timeout | number | 否 | 超时时间,单位ms | 1.9.90 | |
success | function | 否 | 接口调用成功的回调函数 | ||
fail | function | 否 | 接口调用失败的回调函数 | ||
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例如下:
wx.login({
success:function(res){
if(!res.code){
return;
}
//这里建议调用后台接口进行登陆转换、保存工作
wx.request({
url: 'https://myserver.com/login',
data: {
code: res.code
},
success: function (loginInfo) {
console.log('登陆成功');
}
});
}
});
2.code换取session_key,获取用户信息
调用wx.login()获取code后我们需要在5分钟内用code换取session_key、openid等用户信息,为此官方暴露了一个HTTP接口,尽管我们可以直接通过wx.request()调用接口,获取用户信息,但是由于session_key是对用户数据进行加密签名的**,为了自身应用安全,尽量使用后台服务器调用这个接口,保存登陆信息,返回给小程序前台,接口地址如下:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
接口的请求参数:
参数 | 必填 | 说明 |
---|---|---|
appid | 是 | 小程序唯一标识 |
secret | 是 | 小程序的 app secret |
js_code | 是 | 登录时获取的 code |
grant_type | 是 | 填写为 authorization_code |
返回参数:
参数 | 说明 |
---|---|
openid | 用户唯一标识 |
session_key | 会话** |
expires_in | 会话有效期,以秒为单位,如2592000代表会话有效期为30天 |
返回值示例如下:
//正常返回的JSON数据包
{
"openid":"OPENID",
"session_key":"SESSIONKEY"
"expires_in":2592000
}
//错误时返回JSON数据包(示例为code无效)
{
"errcode":40029,
"errmsg":"invalid code"
}
3.登陆态维护
开发中,每个项目应该利用后台维护登陆态,不能直接把session_key、openid等字段作为用户的标识或者session的标识,通过 wx.login 接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。开发者只需要调用 wx.checkSession 接口检测当前用户登录态是否有效。
4.wx.checkSession(Object)
检查登录态是否过期,参数属性如下:
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码如下:
wx.checkSession({
success:function(){
//登陆态未过期
},
fail:function(){
//登陆态过期
}
})
登录流程时序
更多内容请参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html