基于koa实现的微信JS-SDK调用Demo

网友投稿 696 2022-05-30

介绍使用koa框架实现的一个微信 JS-SDK 调用示例

前置准备

koa项目开发

Demo 本地调试

视频演示

注意事项

参考资料

前置准备

一个测试公众号

一台服务器(带域名)

登录测试公众号后台添加JS安全域名

koa项目开发

微信JS-SDK权限验证的签名必须在服务器端实现,签名用的url必须是调用JS接口页面的完整URL,所以这里决定用koa来同时完成页面渲染及生成签名所需验证配置。

基于koa实现的微信JS-SDK调用Demo

项目依赖库如下:

koa-router

request-promise

koa-views

koa-static

koa2-cors

memory-cache

sha1

下面介绍一下核心的签名方法:

主要就是请求全局token后获取jsapi_ticket来获取签名。

const config = require('./config'); async function sign(url) { let sig = {}, noncestr = config.noncestr, timestamp = Math.floor(Date.now() / 1000), //精确到秒 jsapi_ticket; if (cache.get('ticket')) { jsapi_ticket = cache.get('ticket'); sig = { appId: config.appid, noncestr: noncestr, timestamp: timestamp, url: url, jsapi_ticket: jsapi_ticket, signature: sha1( 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url ), }; } else { // 获取 token let tokenRes = await rp({ uri: config.accessTokenUrl + '?grant_type=' + config.grant_type + '&appid=' + config.appid + '&secret=' + config.secret, }); tokenRes = JSON.parse(tokenRes); // 获取 ticket let ticketRes = await rp({ uri: config.ticketUrl + '?access_token=' + tokenRes.access_token + '&type=jsapi', }); var ticketMap = JSON.parse(ticketRes); // 加入缓存 cache.put('ticket', ticketMap.ticket, config.cache_duration); sig = { appId: config.appid, noncestr: noncestr, timestamp: timestamp, url: url, jsapi_ticket: ticketMap.ticket, signature: sha1( 'jsapi_ticket=' + ticketMap.ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url ), }; } return sig; }

之后我们只要在koa的router中定义一个路由去生成签名就行了

router.get('/sig', async (ctx, next) => { try { //获取当前url let url = ctx.request.protocol + '://' + ctx.request.host + ctx.request.originalUrl; if (ctx.query.url) { url = ctx.query.url; } ctx.data = await sign(url); } catch (e) { console.log(e); } await next(); });

demo 页面我们可以使用 koa-views 及 ejs 来渲染:

页面放到 views 目录

页面需要引用的css及js可以放到 static 目录下面

参考代码如下:

const views = require('koa-views'); const static = require('koa-static'); app.use(static(path.join(__dirname, './static'))); app.use( views(path.join(__dirname, './views'), { extension: 'ejs', }) );

views 目录下新建页面 index.ejs,写入 sdk 调用前端 demo 页面,主要内容如下:

引入 jweixin-1.6.0.js 文件

通过config接口注入权限验证配置

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

ready接口处理成功验证

wx.ready(function(){ //config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 });

error接口处理失败验证

wx.error(function(res){ //config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 });

完整页面代码如下:

微信JS-SDK Demo

判断当前客户端是否支持指定JS接口 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 获取“分享给朋友”按钮点击状态及自定义分享内容接口 获取“分享到QQ”按钮点击状态及自定义分享内容接口 获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 获取“分享到QZone”按钮点击状态及自定义分享内容接口 拍照或从手机相册中选图接口 预览图片接口 上传图片接口 下载图片接口 开始录音接口 停止录音接口 播放语音接口 暂停播放接口 停止播放接口 上传语音接口 下载语音接口 识别音频并返回识别结果接口 获取网络状态接口 使用微信内置地图查看位置接口 获取地理位置接口 隐藏右上角菜单接口 显示右上角菜单接口 关闭当前网页窗口接口 批量隐藏功能按钮接口 批量显示功能按钮接口 隐藏所有非基础按钮接口 显示所有功能按钮接口 调起微信扫一扫接口 跳转微信商品页接口 批量添加卡券接口 调起适用于门店的卡券列表并获取用户选择列表 查看微信卡包中的卡券接口 发起一个微信支付请求

至此我们就完成了一个简易的koa版调用Demo了,下面我们来测试一下

Demo 本地调试

一般我们有内网穿透、代理劫持等几种方法去进行本地调试,这里我们使用一个比较常用的方法内网穿透(用你自己熟练的方法就好)来测试。

修改项目根目录下的 config.js,换成自己公众号的appid及secrect

在项目根目录执行node app.js启动服务后浏览器打开如下地址 http://localhost:4000/ 即可看到 Demo 页面

在前置准备中我们设置了一个JS接口安全域名,可以基于这个域名做穿透服务来访问我们本地koa项目,添加公网端口映射本地koa项目的端口(这里的例子是4000),然后浏览器访问JS接口安全域名即可看到 Demo 页面

使用微信打开JS接口安全域名即可测试使用

项目代码获取:极客之路公众号后台回复 koa-wx-js-sdk 即可获取

视频演示

以下是测试视频地址,仅供参考

https://www.bilibili.com/video/BV1N64y1x78m

注意事项

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

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

出于安全考虑,开发者必须在服务器端实现签名的逻辑。

参考资料

JS-SDK说明文档(https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)

官方DEMO页面(https://www.weixinsxy.com/jssdk/)

koa2实现静态资源服务器(http://xuedingmiao.com/blog/koa_static_server.html)

测试公众号后台(https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index)

API/SDK Koa

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Web前端基础(09)
下一篇:CMake构建使用及技巧
相关文章