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步:
获取 access_token
通过 http GET 请求来获取,请求需要APPID
和APPSECRET
,这两个参数可从“基本配置”中获取。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 来处理结果,并未做错误处理,可根据自己需求修改。
获取 jsapi_ticket
jsapi_ticket是公众号用于调用微信JS接口的临时票据,通过access_token来获取,所以我们通过上一步的方法来获取 token,再用其去获取jsapi_ticketconst 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}
计算 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 为你自己的域名。
注意事项
access_token 和 jsapi_ticket 的有效期为7200秒,而且这两个 api 调用次数有限,需要在自己的服务进行全局缓存。
签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
签名用的url必须是调用JS接口页面的完整URL。
基本实现方式就是这样,快来踩坑吧!
- Node.js 配置微信 JS-SDK 权限验证服务
- ASP.NET WEBAPI实现微信JS-SDK接口注入权限验证配置
- 微信JS-SDK中config接口注入权限验证配置
- 微信JS-SDK调试:config注入权限验证配置报错- invalid signature
- 微信企业号开发之获取jsapi_ticket并生成JS-SDK权限验证签名
- 微信js-sdk config配置
- 微信开发(2):微信js sdk分享朋友圈,朋友,获取config接口注入权限验证(java)
- 微信公众平台开发 Node.js SDK
- 微信JS-SDK
- 微信JS SDK
- 微信JS-SDK
- 微信JS-SDK
- 微信 JS-SDK
- PHP+TP框架生成使用微信JS-SDK所需的配置信息,并验证
- node.js微信公众平台开发之Token验证
- 微信JS SDK使用权限签名算法 jsapi_ticket
- 微信JS SDK使用权限签名算法 jsapi_ticket
- 微信JS SDK使用权限签名算法
- 《MySQL入门很简单》学习笔记(11)之第11章插入、更新与删除数据(关键词:数据库/MySQL/插入数据/更新数据/删除数据)
- struts2笔记(1)——搭建一个HelloWorld
- ARCore:从Android Studio开始
- ubuntu sudo update跟upgrade的作用和区别
- 用u盘安装linux系统
- Node.js 配置微信 JS-SDK 权限验证服务
- 夜神自动重连
- mysql中innodb和myisam的区别
- 操作系统-进程调度(CPU调度算法)
- SpringMVC的Dao层的DaoImpl.java将数据插入数据库
- 20 Newsgroups数据集介绍
- Sublime Text 3 修改应用程序图标
- I can 前端-02 CSS
- Codeforces 854A