H5与企业微信jssdk集成
H5与企业微信jssdk集成
一、公众号设置
注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单。可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没有。所以全在H5端还得配合服务端完成票据获取等操作。
二、开发步骤
-
资源引入
-
在html引入SHA1 库为初始SDK提供签名算法 https://www.npmjs.com/package/sha1
-
初始流程基本流程(https://work.weixin.qq.com/api/doc#90001/90144/90547)
-
获取accesstoken
接口地址 https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET , 获取到的token的有效时间为2小时
H5不能直接访问,需要服务端通过代理访问//author herbert QQ:464884492 getAccessToken() { // 判断是否缓存有 return new Promise((resolve, reject) => { var access_token = localStorage.getItem("accessToken"); var expires = localStorage.getItem("expires_accessToken"); if (expires > new Date().getTime() - 2000) { resolve(access_token); return; } let accessTokenUrl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + this.groupId + "&corpsecret=" + this.secretId; // fetch(accessTokenUrl, { method: "GET" }) fetch(this.porxyUrl, { method: "POST", body: JSON.stringify({ method: "GET", url: accessTokenUrl }) }).then(resp => { return resp.json() }).then(data => { if (data.errcode == 0) { //保存本次获取的accessToken localStorage.setItem("accessToken", data.access_token); localStorage.setItem("expires_accessToken", new Date().getTime() + data.expires_in * 1000); resolve(data.access_token); } }).catch(data => { reject(); }) }); },
-
获取ticket
使用上一步骤获取到的access_token获取ticket,接口地址https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN
H5不能直接访问,需要服务端通过代理访问//author herbert QQ:464884492 getTicket() { return new Promise((resolve, reject) => { var ticket = localStorage.getItem("ticket"); var expires = localStorage.getItem("expires_ticket"); if (expires > new Date().getTime() - 2000) { resolve(ticket); return; } let ticketUrl = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + localStorage.getItem("accessToken"); //fetch(ticketUrl, { method: "GET" }) fetch(this.porxyUrl, { method: "POST", body: JSON.stringify({ method: "GET", url: ticketUrl }) }).then(resp => { return resp.json() }).then(data => { if (data.errcode == 0) { //保存本次获取的accessToken localStorage.setItem("ticket", data.ticket); localStorage.setItem("expires_ticket", new Date().getTime() + data.expires_in * 1000); resolve(data.ticket); } }).catch(data => { reject(); }) }); },
-
生成签名
文档地址 https://work.weixin.qq.com/api/doc#90000/90136/90506
需要将参数构造如下格式JSAPITICKET&noncestr=NONCESTR×tamp=TIMESTAMP&url=URL,然后做SHA1算法获取字符串哈希值。其中NONCESTR是一个随机字符串,URL不能包含#以及后边的部分//author herbert QQ:464884492 getSignature(timestamp, ticket) { let url = window.location.href.split("#")[0]; let jsapi_ticket = "jsapi_ticket=" + ticket + "&noncestr=" + timestamp + "×tamp=" + timestamp.substr(0, 10) + "&url=" + url; this.printStatuInfo("签名原始信息:" + jsapi_ticket); let sha1Str = new jsSHA(decodeURIComponent(jsapi_ticket), "TEXT"); return sha1Str.getHash("SHA-1", "HEX"); }
-
初始微信配置信息
根据前边几个步骤获取的参数,初始微信配置信息//author herbert QQ:464884492 wx.config({ beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: wxUtils.groupId, // 必填,企业微信的corpID timestamp: timestamp.substr(0, 10), // 必填,生成签名的时间戳 nonceStr: timestamp, // 必填,生成签名的随机串 signature: sig,// 必填,签名,见附录1 jsApiList: ["scanQRCode"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 });
-
调用api
初始完成后,需要立即调用api需要在 wx.ready函数中注册回调函数,如果是不立即调用可以忽略。以下为调用微信扫一扫功能//author herbert QQ:464884492 wx.scanQRCode({ desc: 'scanQRCode desc', needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果, scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有 success: function (res) { // 回调 wxUtils.printStatuInfo("扫描信息:" + JSON.stringify(res)); lblCostTime.innerText = "单次扫码总共花费:【" + (new Date().getTime() - timeStar) + "】ms"; }, error: function (res) { if (res.errMsg.indexOf('function_not_exist') > 0) { alert('版本过低请升级') } } });
三、总结
H5集成微信JSSDK功能虽然简单,但是该有的步骤一个都不能少。在最初开发中遇到了以下几个问题:
-
获取token与ticket存在跨域问题,需要配置一个代理完成
-
有时生成的签名与官方有差别,官方提供了一个测试地址https://work.weixin.qq.com/api/jsapisign
有喜欢聊技术朋友也欢迎入群,若二维码失效可加我微信回复**前端**
- 转载请注明来源
- 作者:杨瀚博
- QQ:464884492
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤