微信网页开发相关

July 03, 2020

令人迷惑的口令

暂时梳理一下在微信网页开发中的普通 accessToken, 授权 accessToken, openId, UnionID, jsapiTicket 和各种定义

普通 accessToken

在文档中的开始开发一章中开始谈到, 普通 accessToken 是公众号的全局唯一接口凭据, 简单来说, 这个值是服务器向调用微信官方服务需要带上的, 这个值目前的有效期是两小时, 简单来说, 在前端, 你基本不会用到这个 accessToken, 这个值是微信服务器接口的凭据, 而前端一般是不会直接向微信服务器请求服务的, 一般是下类接口, 我个人理解这个凭据的其中一个目的应该是强制公众号开发架设自己的服务器, 降低官方服务器的压力.

img

所以很明显, 这个 accessToken 和网页开发几乎没有什么关系.

网页开发

在微信内打开的页面其实和普通浏览器打开的页面几乎没有任何区别, 唯一重要的区别在于微信浏览器内置了 JSBridge, 可以通过这个 bridge, 调用微信的一些能力, 注意, 这里很明确, 调用的是微信的能力而不是机器本身的能力, 这有本质上的区别.

在微信客户端访问的第三方网页, 则可以通过 JSBridge, 通过微信网页的授权机制, 来获取用户基本信息.

jsapi_ticket

在使用 JSSDK 中的 config 一步, 需要用到的 timeStamp, nonceStr, signature, 其实都是在后端生成并返回到前端的

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

官方定义中写明, jsapi_ticket 是公众号用于调用微信 JS 接口的临时票据, 注意, 这里说的是公众号, 不是网页, 所以这个 ticket 不是给网页用的, 而是在公众号的服务器上使用的. 但是, 同时网页需要一个对应的 jsapi 票据的签名, 来确认网页调用 JS 接口对应是哪个公众号. 简单来说, 就是只是将公众号的能力赋予网页, 让网页完成接口调用. 再简单点说, 就是再调用 JS 接口时, 微信会询问是哪个公众号允许你这样调用. 所以在微信内部调用 JSBridge 能力, 按这样说, 是都需要公众号支持的.

这样说来, 在任何地方, 调用微信相关的接口都是需要临时票据, 在服务器上, 需要的是 accessToken, 而在前端网页, 需要的是 jsapiticket, 只不过前端网页因为风险问题, 不适宜持有 jsapiticket, 所以给了签名作为代替.

jsapi_ticket 和 accessToken

从上面分析, accessToken 和 jsapiticket 都是调用微信相关接口的临时票据, 一个是服务器使用, 一个是在前端使用, 但是在 JSSDK 权限签名算法一节中有提到, jsapiticket 的生成其实是依附于 accessToken 的, 而且同样是 7200 秒. 所以比较合适的做法是, 服务器在生成 accessToken 的同时, 生成 jsapiticket, 并持久化, 在下一次过期后再次生成. 即不再需要关注 jsapiticket 过期的问题.


Written by 梁伯豪