微信小程序,小程序的一种,英文名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

属性类型默认值必填说明最低版本
timeoutnumber超时时间,单位ms1.9.90
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)

object.success 回调函数

参数

Object res

属性类型说明
codestring用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 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 

请求参数

属性类型必填说明
appidstring小程序 appId
secretstring小程序 appSecret
js_codestring登录时获取的 code,可通过wx.login获取
grant_typestring授权类型,此处只需填写 authorization_code

返回参数

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

调用示例

示例说明: 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"
}

错误码

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

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

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

接口说明

接口英文名

getAccessToken

功能描述

调用方式

HTTPS 调用


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

请求参数

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

返回参数

属性类型说明
access_tokenstring获取到的凭证
expires_innumber凭证有效时间,单位:秒。目前是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,值通过微信令牌取得。
  • 调用微信支付也可以免维护鉴权和支付证书信息,避免证书泄漏风险。

云开发:

在线调试

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

调用示例

示例说明: 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
} 

错误码

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

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐