前端vue+后台node实现获取微信用户基本信息+调用微信JS-SDK(下篇)

如果没有接入JS-SDK的话,呈现方式则是这种:

观感有明显的区别,除此之外,接入微信的JS_SDK还可以方便的调用微信给第三方接口提供的功能,比如:拍照、定位、获取网络状态等等…

接下来我们就正式开始实践吧~

在微信官方文档里找到JS-SDK说明文档

链接如下:

概述 | 微信开放文档

页面如下:

阅读文档,了解到项目接入微信JS-SDK的流程为:

测试公众号端准备工作:

在JS接口安全域名模块填入服务器域名。如果没有注册过域名或者项目处于本地开发阶段,建议使用内网穿透工具生成的临时域名来代替(推荐这种方式,内网穿透网址及配置详见上一篇文档)。

后台工作:

  1. 根据公众号的AppID和APPSecret获取微信服务器给微信第三方网页提供的accessToken.

// 从微信服务器获取新的AccessToken

function getAccessTokenFromWechatServer() {

return new Promise(async (resolve, reject) => {

try {

const uri = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${CONFIG.appID}&secret=${CONFIG.appSecret};

resolve(await getRequest(uri));

} catch (err) {

reject(err);

}

})

}

// 微信JSAPI调用示例

app.get(‘/jsApi’,async (req,res) => {

const url = req.query.pageUrl;

console.log(url);

//获取accessToken–有效期2小时

const accessToken = await getAccessTokenFromWechatServer();

console.log(accessToken);

// 将生成的accessToken保存至数据库

})

2. 用第一步获取的access_token去向微信服务器请求js_ticket,用于后续生成前端调用JS_SDK时需要的config参数

// 从微信服务器获取新的jsapi_ticket

function getJSAPITicketFromWechatServer() {

return new Promise(async (resolve, reject) => {

try {

const AccessToken = webAccessToken;

const uri = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${AccessToken}&type=jsapi;

resolve(await getRequest(uri));

} catch (err) {

reject(err);

}

})

}

// 微信JSAPI调用示例

app.get(‘/jsApi’,async (req,res) => {

// 获取ticket–有效期2小时

const jsTicket = await getJSAPITicketFromWechatServer();

console.log(jsTicket);

// 将获取到的jsTicket保存至数据库

})

3. 第三步就是生成 前端调用微信接口时需要的 wx相关参数了。

相关参数包括appId、timestamp、nonceStr和signature:

appId就是公众号的appId.

timestamp是时间戳,由Date.now()生成,js的写法

nonceStr是生成签名的随机串,由官网文档的示例,应该是由数字、小写字母、大写字母组成的不定长字符串。

signature这个略微复杂一些,微信官方提供了签名算法:

签名算法

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

签名由jsapi_ticket、nonceStr、timestamp、url生成。

假设这四个参数值分别为:

noncestr=Wm3WZYTPz0wzccnW

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg

timestamp=1414587457

url=http://mp.weixin.qq.com?params=value

签名具体步骤为:

步骤1:对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value

步骤2:对string1进行sha1签名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

使用node.js编写生成签名的算法为:

// 生成随机字符串,长度定为16

let getRandomWord = (randomFlag, min) => {

let str = “”;

let range = min;

let arr = [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’];

for (let i = 0; i < range; i++) {

let pos = Math.round(Math.random() * (arr.length - 1))

str += arr[pos]

}

return str;

}

// url为前端页面#之前的完整页面地址

async function getConfig(url) {

return new Promise(async (resolve, reject) => {

try {

// 获取数据库中的jsapi_ticket

const TICKET = jsTicket;

// 此刻时间戳

const timestamp = Date.now();

// 随机字符串

const nonceStr = getRandomWord(false, 16);

// 按字典序排序

const str = jsapi_ticket=${TICKET}&noncestr=${nonceStr}&timestamp=${timestamp}&url=${url};

// sha1加密后获得signature

const signature = crypto.createHash(‘sha1’).update(str, ‘utf-8’).digest(‘hex’);

resolve({

timestamp,

nonceStr,

signature,

appId: CONFIG.appID

});

} catch (e) {

reject(e);

}

})

}

最后将生成的参数config返回给前台即可

// 微信JSAPI调用示例

app.get(‘/jsApi’,async (req,res) => {

const jsConfig = await getConfig(url);

let result = {

statusCode: ‘200’,

msg: ‘请求成功’,

data:{

‘wxJDK’:jsConfig

}

}

res.send(JSON.stringify(result));

})

至此后台部分要处理的任务结束,开启后台服务,等待前台发起请求即可。

接下来是前端部分:

以vue2.6.12项目为例:

步骤1:

按微信官方文档,我们需要在项目的index.html文件里引入如下Js文件:

如需进一步提升服务稳定性,当上述资源不可访问时,可改引入

步骤2:

建议单独把微信js-sdk配置文件单独抽成一个模块,暴露接口供相关页面访问:

在src目录下新建utils文件夹,在该文件夹下新建wxApi.js文件:

文件内容为:

//utils.js

const wxApi = {

wxRegister(data, option) {

console.log(“hello”);

console.log(data)

console.log(option)

wx.config({

debug: true, // 开启调试模式

appId: data.appId, // 必填,公众号的唯一标识

timestamp: data.timestamp, // 必填,生成签名的时间戳

nonceStr: data.nonceStr, // 必填,生成签名的随机串

signature: data.signature, // 必填,签名

jsApiList: [

“updateTimelineShareData”, //最新的分享朋友圈

“updateAppMessageShareData”, //最新的分享好友

] // 必填,需要使用的JS接口列表,所有JS接口列表见微信文档里的附录2

});
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里获取,先到先得哦。


yg1m5pD6-1711681263660)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-BL9rVzXU-1711681263661)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里获取,先到先得哦。

[外链图片转存中…(img-jufbZEX3-1711681263661)]
[外链图片转存中…(img-UyoU2p12-1711681263661)]

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值