H5与企业微信jssdk集成

摘要:
因此,H5终端必须配合服务器完成账单获取等操作。access_ token=access_ TOKENH5无法直接访问。服务器需要访问//authorbertQQ:464884492getTicket(){returnnewPromise((resolve,reject)=˃{varticket=localStorage.getItem(“ticket”);varexpires=localStorage.getItem(“expires_ticket”);if(expires˃newDate().getTime()-2000){resolve(ticket);return;}letticketUrl=“https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=“+localStorage.getItem;//fetchfetch.then.catch});},生成签名文档地址https://work.weixin.qq.com/api/doc#90000/90136/90506参数需要以以下格式构造:JSAPITICETE&noncestr=noncestr×Stamp=TIMESTAMP&url=url,然后执行SHA1算法以获得字符串哈希值。

一、公众号设置

注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单。可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没有。所以全在H5端还得配合服务端完成票据获取等操作。

二、开发步骤

资源引入

开发文档地址https://work.weixin.qq.com/api/doc#90001/90144/90545

在html引入http://res.wx.qq.com/open/js/jweixin-1.4.0.js

在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:
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
});
广州vi设计http://www.maiqicn.com办公资源网站大全https://www.wode007.com

调用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('版本过低请升级')
}
}
});

广州vi设计http://www.maiqicn.com办公资源网站大全https://www.wode007.com

免责声明:文章转载自《H5与企业微信jssdk集成》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【STM32】MDK中寄存器地址名称映射分析屏蔽文本框的粘贴操作(即,不允许从其他地方复制东西直接粘贴到该文本框中)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【js】了解前端缓存,收获不止于此!

了解前端缓存,收获不止于此! 这次我们来讲一下关于前端缓存的问题。感谢赵欢同学提供doc素材。 首先,开局我画了一张图,你会对文章有一个大局了解。 今天讲的是前端缓存。 前端缓存有3大种:如图,分为HTTP缓存、浏览器缓存、应用程序缓存。 HTTP缓存我们先来看HTTP缓存:(做下了解) 分为强缓存与协商缓存。 首先看强缓存: 强缓存之Expires...

Java~时间戳小知识

大叔对java时间戳使用的总结 Java里的Date对象有方法setTime,主要是将一个时间戳转成一个日期对象,而这个时间戳的标准是unix标准,即当前时间与1970/1/1相差的毫秒数,记得是毫秒! .net里的时间戳与java不同,所有需要特殊处理一个它的其实时间,而且.net里时间戳为double,如何要给java传输,需要转为long! jav...

关于H5本部缓存localStorage,sessionStorage

HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 一直存在除非用户手动清除缓存;是基于域的,任何该域下的所有页面都可访问localStorage sessionStorage - 针对一个 session 的数据存储 浏览器关闭时清除 之前,这些都是由 cookie 完成的。但是 cookie 不适...

java 字符串转日期格式

/*** 字符串转日期格式 * */ public staticDate date(String date_str) { try{ Calendar zcal = Calendar.getInstance(); Timestamp timestampnow = new...

centos下安装wireshark 抓包

centos下安装wireshark相当简单.两条命令就够了.这里.主要是记录写使用方面的东西 安装:1、yum install wireshark。注意这样并无法使用wireshark命令和图形界面。但提供了抓包基本功能。2、yum install wireshark-gnome。这样就可以方便的使用了。 如果能登录图形界面终端.那使用和windows下...

maven引入的jar带了时间戳

正常情况下,我们引入的第三方jar一般都是类似spider-1.0.5-SNAPSHOT.jar的名称,但是有些环境下,我们引入的三方jar会带上了时间戳,如下所示: spider-1.0.5-20161212.095528-2.jar 可通过在pom.xml中包含如下插件的方式解决。 <plugin><artifactId>mav...