Node.js 配置微信 JS-SDK 权限验证服务

来源:互联网 发布:java注解用处 编辑:程序博客网 时间:2024/04/29 04:45

前端页面在接入微信 JS-SDK 时需要进行权限验证,这一步通过 wx.config 接口来实现。按照官方要求,config 所需的参数必须从服务器端获取。本文就总结一下服务端如何通过 Node.js 来实现这一点。

实现逻辑

  • 基本配置:nginx 作反向代理, node 起 server

我们先在服务器上用 node 起一个 server, 将 nginx 代理到该 server。 客户端访问时,根据域名进行路由匹配,然后从微信获取签名signature ,再将 appId, timestamp, nonceStr, signature, jsApiList 这五个参数一起返回或注入注入到前端页面。对应页面在渲染时用这些参数来调用 wx.config,即可实现权限验证。

参数说明

  • appId:公众号的唯一标识, 可在 “基本配置” 中获取。
  • timestamp:生成签名的时间戳。
  • nonceStr: 生成签名的随机串。
  • signature:签名,这是相对来说实现最麻烦的一部分,下面主要是讲它的获取方式。
  • jsApiList: 需要使用的JS接口列表, 直接填所需要的接口名。

timestamp

注意时间戳要精确到秒,且为整数。

const getTimestamp = () => parseInt(Date.now() / 1000)

nonceStr

随机字符串嘛,随机就好了。

const getNonceStr = () => Math.random().toString(36).substr(2, 15)

signature

获取签名分3步:

  1. 获取 access_token
    通过 http GET 请求来获取,请求需要 APPIDAPPSECRET,这两个参数可从“基本配置”中获取。

    const getAccessToken = async () => {  const {data} = await axios.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`)  return data.access_token}

    注意:这里采用 axios 进行请求,并采用 async/await 来处理结果,并未做错误处理,可根据自己需求修改。

  2. 获取 jsapi_ticket
    jsapi_ticket是公众号用于调用微信JS接口的临时票据,通过access_token来获取,所以我们通过上一步的方法来获取 token,再用其去获取jsapi_ticket

    const getTicket = async () => {    const token = await getAccessToken()    const {data} = await axios.get(`https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${token}&type=jsapi`)    return data.ticket}
  3. 计算 signature

    签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

    现在参与签名的字段我们都有了,下面就是具体实现了,我们先计算出 string1

    const params = { nonceStr, jsapi_ticket, timestamp, url }const string1 = Object.keys(params).sort().map(key => `${key.toLowerCase()}=${params[key]}`).join('&')

    最后就剩下 sha1 加密了。我们直接调 sha1 这个npm package。

    const sha1 = require('sha1')const signature = sha1(string1)

    到此,我们已经拿到了所有参数,可以进行前端验证了。

nginx 和 node server

node server 可用 express 或 koa 等实现。假设端口号设成3000,
nginx 可修改或添加 nginx.conf 如下配置:

server {    listen 80;    server_name  your.domain.com;    location / {      proxy_pass http://127.0.0.1:3000;    }}

其中 your.domain.com 为你自己的域名。

注意事项

  1. access_tokenjsapi_ticket 的有效期为7200秒,而且这两个 api 调用次数有限,需要在自己的服务进行全局缓存。

  2. 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。

  3. 签名用的url必须是调用JS接口页面的完整URL。



基本实现方式就是这样,快来踩坑吧!

原创粉丝点击