微信小程序-微信小程序登录流程(一)

微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用

冷启动:

小程序首次打开或销毁后再次被打开,此时小程序需要重新加载启动,即冷启动。会检查小程序是否有最新版本,如果有则将异步下载最新版本,但是仍将运行当前版本等到下一次冷启动时再运行最新版本。

热启动:

如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。用户下次打开时会先更新最新版本再打开

一、微信小程序登录流程

官网文档

小程序登录 | 微信开放文档

说明

1、调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

2、调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意事项

1、会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥

2、临时登录凭证 code 只能使用一次

(一)wx.login(Object object)

wx.login(Object object) | 微信开放文档

微信小程序通过wx.login()获取微信登录凭证code

code是一个带有时效性的凭证,有效时间是5分钟,它就相当于一个会过期的临时身份证,过期之后需要调用wx.login()重新生成登录凭证。

假如没有这个登录凭证,而是直接通过wx.login()直接拿到微信用户的编号1,再通过wx.request请求接口拉取到微信用户1在我们业务侧的个人信息,那么黑客就可以通过遍历所有的id,把整个业务侧的个人信息全部拉走,甚至相关的其他数据。

wx.login()是限频接口,一天的调用总次数不多于该小程序pv(访问量)的两倍。“限频接口”指的是一个用户在一段时间内不允许频繁调用的 wx 接口,此类接口一般会调用到微信后台系统资源,为了保护系统,同时防止用户资源被滥用,开发者需要对此类接口做适度的频率限制,不能无节制地调用

调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成

参数

Object object

属性 类型 默认值 必填 说明 最低版本
timeout number 超时时间,单位ms 1.9.90
success function 接口调用成功的回调函数
fail function 接口调用失败的回调函数
complete function 接口调用结束的回调函数(调用成功、失败都会执行)

object.success 回调函数

参数

Object res

属性 类型 说明
code string 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 code2Session,使用 code 换取 openid、unionid、session_key 等信息

示例代码

wx.login({
  success (res) {
    if (res.code) {
      //发起网络请求
      wx.request({
        url: 'https://example.com/onLogin',
        data: {
          code: res.code
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

(二) 小程序登录 auth.code2Session

小程序登录 | 微信开放文档

将微信登录凭证code 发送给开发者服务器,也就是我们自己的开发服务器。开发者服务器接收到code 后,将code和 AppID+AppSecret 对接微信接口服务,通过code2Session这个api接口来获取真正需要的微信用户的登录态session_key和 openid 和 unionid

AppID和AppSecret相当于微信小程序的身份证,获取方法:登录微信小程序的管理系统——>开发管理——>开发设置

微信公众平台

 access_token

是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
准确来说session_key才是真正的微信登录态信息,但是把 openid 和 unionid加起来一起理解,也可以笼统地理解为这些都是微信的登录态信息。

AppID和AppSecret,在小程序管理平台-设置-开发设置,他们是微信鉴别开发者身份的重要信息。AppID是公开信息,AppSecret是开发者的隐私数据,生成之后需要开发者保存起来,如果发现泄露需要在小程序管理平台重置AppSecret。

openid是微信用户的唯一标识

session_key是微信服务器给开发者服务器颁发的身份凭证,官方说需要定期使

wx.checkSession检测,但是在实际的场景里面其实也可以不用,用和不用主要看业务需求;早起官方是返回 expire_time 过期时间的,但是后面取消了,这里有一个比较新的官方回复:用户越频繁使用小程序,session_key有效期越长,…… | 微信开放社区,有效期是3天,但是这个不一定是固定的,具体看业务需求,总的原则就是维护一个自定义登录态,自定义登录需要和微信登录态关联。
unionid是用户在微信开放平台的唯一标识符,如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionId是相同的

接口说明

接口英文名

code2Session

功能描述

登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见小程序登录。

调用方式

HTTPS 调用


GET https://api.weixin.qq.com/sns/jscode2session 

请求参数

属性 类型 必填 说明
appid string 小程序 appId
secret string 小程序 appSecret
js_code string 登录时获取的 code,可通过wx.login获取
grant_type string 授权类型,此处只需填写 authorization_code

返回参数

属性 类型 说明
session_key string 会话密钥
unionid string 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回,详见 UnionID 机制说明
errmsg string 错误信息
openid string 用户唯一标识
errcode int32 错误码

调用示例

示例说明: HTTPS请求

请求数据示例


GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 

返回数据示例

{
"openid":"xxxxxx",
"session_key":"xxxxx",
"unionid":"xxxxx",
"errcode":0,
"errmsg":"xxxxx"
}

错误码

错误码 错误码取值 解决方案
40029 code 无效 js_code无效
45011 api minute-quota reach limit  mustslower  retry next minute API 调用太频繁,请稍候再试
40226 code blocked 高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案
-1 system error 系统繁忙,此时请开发者稍候再试

(三) 获取接口调用凭据 getAccessToken

接口应在服务器端调用,详细说明参见服务端API

接口说明

接口英文名

getAccessToken

功能描述

调用方式

HTTPS 调用


GET https://api.weixin.qq.com/cgi-bin/token 

请求参数

属性 类型 必填 说明
grant_type string 填写 client_credential
appid string 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
secret string 小程序唯一凭证密钥,即 AppSecret,获取方式同 appid

返回参数

属性 类型 说明
access_token string 获取到的凭证
expires_in number 凭证有效时间,单位:秒。目前是7200秒之内的值。

其他说明

access_token 的存储与更新

  • access_token 的存储至少要保留 512 个字符空间;
  • access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
  • 建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
  • access_token 的有效期通过返回的 expires_in 来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
  • access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。

详情可参考微信公众平台文档 《获取access_token》

免维护 access_token 的场景

如果使用了云托管云开发,可以免维护 access_token,免鉴权直接调用服务端接口。

云托管:

  • 通过微信令牌免维护 access_token 发起服务端调用,在调用微信服务端接口时,将 URL 上的 access_token 参数改成 cloudbase_access_token,值通过微信令牌取得。
  • 调用微信支付也可以免维护鉴权和支付证书信息,避免证书泄漏风险。

云开发:

  • 通过云开发云调用免维护 access_token 调用。
  • 调用微信支付也可以免维护鉴权和支付证书信息,避免证书泄漏风险。

在线调试

开发者可以使用网页调试工具调试该接口

调用示例

示例说明: HTTPS调用示例

请求数据示例


GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 

返回数据示例


{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
} 

错误码

错误码 错误码取值 解决方案
-1 system error 系统繁忙,此时请开发者稍候再试
40001 invalid credential  access_token isinvalid or not latest 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口
40013 invalid appid 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写

猜你喜欢

转载自blog.csdn.net/MinggeQingchun/article/details/129755830