Node Express微信公众号jssdk签名服务
开发公众号的过程中,会使用jssdk提供的微信公众号原生功能,使用过程中微信需要确认使用者身份,所以使用前需要现通过config接口注入权限验证配置,这时就需要用到签名服务,根据微信官方要求
对于不会开发后台服务的前端开发人员可以使用node来写服务端签名服务
相关依赖
package.json
有几个没用的依赖,用来调试别的功能的,可自行删除
{"name": "wechat-sign-service","version": "1.0.0","description": "","main": "7001","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "saryz","license": "ISC","dependencies": {"baidu-aip-sdk": "^2.3.9","body-parser": "^1.19.0","cookie-parser": "~1.4.4","crypto": "^1.0.1","debug": "~2.6.9","express": "^4.17.1","fs": "0.0.1-security","http": "0.0.0","http-errors": "~1.6.3","jade": "~1.11.0","mime-types": "^2.1.24","morgan": "~1.9.1","multer": "^1.4.1","path": "^0.12.7","request": "^2.88.0","sha1": "^1.1.1","urlencode": "^1.1.0","xunfeisdk": "^1.0.1"}
}
核心代码
service.js
// express
var express = require('express')
var request = require('request')
var sha1 = require('sha1')var app = express()
var token = ''
var ticket = ''
var config = nullvar appId = 'xxx'
var secret = 'xxx'
var url = ''/*** token保持服务*/
function keepAccessToken () {var getTokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appId + '&secret=' + secretrequest(reqOption(getTokenUrl), function (error, response, body) {if (!error && response.statusCode == 200) {token = body['access_token']console.log('刷新access_token=>>>', token.substr(0, 3) + '*****' + token.substr(-5)) // 请求成功的处理逻辑console.log('expires_in=>>>', body['expires_in']) // 请求成功的处理逻辑setTimeout(function () {keepAccessToken()}, body['expires_in']*1000)}})
}/*** ticket保持服务*/
function keepJsapiTicket () {if (token) {var getTicketUrl = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' + token + '&type=jsapi'request(reqOption(getTicketUrl), function (error, response, body) {if (!error && response.statusCode == 200) {ticket = body['ticket']console.log('刷新ticket=>>', ticket.substr(0, 3) + '*****' + ticket.substr(-5)) // 请求成功的处理逻辑console.log('expires_in=>>>', body['expires_in']) // 请求成功的处理逻辑setTimeout(function () {keepJsapiTicket()}, body['expires_in']*1000)}})} else {setTimeout(function () {keepJsapiTicket()}, 1000)}}app.get('/wechatSdk/getConfig', function (req, res, next) {console.log('req=>>', req.param('url'))if (req.param('url') !== url) {url = req.param('url')config = null}getConfig(res)
})function reqOption (url) {return {url: url,method: 'GET',json: true}
}/*** 获取配置* @param res*/
function getConfig (res) {var timestamp = Math.round(new Date().getTime() / 1000).toString()var nonceStr = randomString(16)console.log(url)var string = 'jsapi_ticket=' + ticket + '&noncestr=' + nonceStr + '×tamp=' + timestamp + '&url=' + urlvar signature = sha1(string)config = {appId: appId, // 必填,公众号的唯一标识timestamp: timestamp, // 必填,生成签名的时间戳nonceStr: nonceStr, // 必填,生成签名的随机串signature: signature,// 必填,签名,见附录1}console.log('config===', config)res.send(config)
}/*** 随机数* @param len* @returns {string}*/
function randomString (len) {len = len || 32var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'/****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/var maxPos = $chars.lengthvar pwd = ''for (i = 0; i < len; i++) {pwd += $chars.charAt(Math.floor(Math.random() * maxPos))}return pwd
}
keepAccessToken()
keepJsapiTicket()
app.listen(3000)
启动
启动前请确保相关域名已加入微信公众号JS接口安全域名
正常启动
$node service.js
利用forever插件保持服务
// 全局安装forever
sudo npm install forever -g
// 启动服务
forever start service.js
//查看当前服务目录
forever list
// 停止pid下的服务
forever stop [pid]
// 停止所有服务
forever stopall
使用
利用vuex做了持久化,也可以用别的方案替代
const url = location.href.replace(location.hash, '')
const wechatSign = this.$store.state.wechatSignif(wechatSign){wx.config({jsApiList: ['chooseImage'],openTagList: ['wx-open-launch-weapp'], // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']...wechatSign})}else{axios.get('/wechatSdk/getConfig',{params:{url}}).then(data => {console.log('config', data)this.$store.commit('setWechatSign', data)wx.config({jsApiList: ['chooseImage'],openTagList: ['wx-open-launch-weapp'], // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']...data})})}
Node Express微信公众号jssdk签名服务相关推荐
- (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班
(Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班 从零到壹全栈部落 产品:个人独立博客,21点见 Vue + Node + MongoDB支持服务端渲染的博客系统(5天) 开发环境技术 ...
- 微信公众号js-sdk使用步骤总结
微信公众号js-sdk使用步骤总结 1. 域名绑定 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名". 可填写三 ...
- php企业微信号js-sdk,php微信公众号js-sdk开发应用
这篇文章主要为大家详细介绍了php微信公众号js-sdk开发应用的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 测试js的接口功能,我用的是BAE服务器不是SAE服务器.SAE服务器不能 ...
- 七天搞定Node.js微信公众号
[课程介绍] 微信公众号已经1000多万个了,即使不为市场,为自己也应该学会开发它 [环境参数] 技术语言:Node.js 框架:Node.js>= 0.12.Koa1.2.0 课程所需开发系统 ...
- 【Node.js 微信公众号实战】1.Node.js 接入微信公众平台开发
文章目录: 1.Node.js 接入微信公众平台开发 2.Node.js access_token的获取.存储及更新 3.Node.js 自定义微信菜单 ...
- 微信公众号jssdk 分享/App原生应用接入分享开发及应用场景
文章目录 前言 一.应用场景 二.Jssdk 接入准备工作 1.申请企业版微信公众号,并进行认证,并设置成为开发者 2.公众号配置 3.查看appid.设置密钥.并配置ip 白名单等 三.开发接入 1 ...
- vue前端实现微信支付-微信公众号JSSDK
最近在做支付功能,微信支付准备工作之类的请参考官方说明,注意个人申请的测试号不支持,要申请企业号,还要商户号,开通支付权限,配置域名,JSSDK的权限问题,尽可能都开通吧! 官方地址可参考这里:接入准 ...
- 微信公众号,接口服务配置url验证失败的问题
这段时间研究微信公众号,发现了很多坑,现在贴出来做个记录 1.微信公众号在做开发的时候,首先就是对微信的服务接口的配置.让微信能够响应我们的接口.官方的接口文档吧可以这么说,你懂的或者了解他了吧可以说 ...
- jssdk 获取微信收货地址_微信公众号JSSDK 获取经纬度
a代码如下: //重点 引入这句 //测试 引用 function jsSdk() { var baseUrl = '***********'; $.ajax({ cache: false, url: ...
最新文章
- 96.6. Template
- linux 软硬文件类型,linux文件属性和类型、系统链接文件、软链接和硬链接
- 菜渣初探mongodb--笔记篇
- php ob_flush 和flush
- java中的解码和编码_关于java中编码和解码(一)
- 国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?
- ai二维码插件_送你60款AI脚本插件包,已整合成插件面板的形式,方便在AI中调用...
- Linux编程获取本机IP地址
- Futter基础第21篇: 实现普通对话框、列表对话框、单选对话框、Toast提示
- atitit。 hb Hibernate sql 查询使用
- 计算机毕业设计jspm平面设计类众包威客网网站mjmBBmysql程序
- LM393双电压比较器集成电路引脚图及功能_工作原理及应用电路
- log怎么用计算机,手机计算器log怎么用
- Script Control 组件Win7 X64平台运行问题及示例
- python数字及字母的分离_Python 分割文本使得 字母和数字 分开?
- 写互联网文案的新技巧
- 完成一个STM32的USART串口通讯程序
- 软件测试工程师春招薪资20K+,BAT校招薪资表出炉!学弟学妹们看齐...
- linux的lib目录,Linux 目录结构:/lib 分析
- 如何debug没有源代码的class文件—eclipse+jad