关闭

H5与企业微信jssdk集成

时间: 2019-01-30阅读: 1925标签: h5

一、公众号设置

注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单。可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没有。所以全在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: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

demo地址:https://github.com/464884492/weixin/


来源:https://www.cnblogs.com/yfrs/archive/2019/01/29/weixinh5.html
作者:杨瀚博


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/1907

关闭

H5/web混合开发,js获取android,ios原生应用返回数据的实例方法

在很多应用都采用同H5页面混合开发模式,这篇主要讲解JS中如何获取原生应用返回给js的数据方法,包括android和ios

Android H5秒开方案调研—今日头条H5秒开方案详解

文件下载耗时:包括html、css、js、图片等;页面渲染耗时:页面渲染,解析js、css文件等;WebView创建耗时:首次创建WebView耗时大约需要500ms左右,第二次创建耗时大约需要20ms左右

H5唤醒App之scheme方案

在写移动端页面会遇到唤醒App的需求, 一般都是通过scheme协议唤起的,这里记录一下,以新浪微博为例: 其协议为 sinaweibo://splash; 这些协议需要自己去收集

h5手机摇一摇功能实现:基于html5重力感应DeviceMotionEvent事件监听手机摇晃

DeviceMotionEven是html5提供的一个用来获取设备物理方向及运动的信息(比如陀螺仪、罗盘及加速计)的Dom事件,利用devicemotion实现手机h5页面摇一摇功能

h5通过连接打开本地app_以及常见应用的URL Scheme

在做h5活动页面的时候,有这样的一个需求:点击页面的一个按钮就打开本地的一个app应用,如果该应用未下载,则跳转到app的下载页。这个操作是通过连接跳转的形式来实现的,这篇文章就简单讲解下如何操作的?

h5开发在ios浏览器遇到的坑

click事件;在ios上,最后一个元素加margin-bottom无效;时间转化问题;position: fixed中的input框聚焦软键盘弹出,IOS下会有光标错位问题;滚动穿透问题

常见的H5移动端Web页面Bug问题解决方案总汇

移动web的兼容性bug的解决方法:远程接口的跨域问题,背景图片会模糊问题,图片加载,拨号功能等

H5和原生的职责划分

减少工作量(一套代码,多个平台),以及快速的更新迭代(譬如线上更新),而且还需要考虑Native端的高性能以及系统API调用能力,混合页面导航栏组件由原生实现,一些重要的业务页面、带有复杂动画或交互的页面以及一些固定页面由原生实现

h5通过css实现禁止ios端长按复制选中文字的方法

在ios端默认的长按选择,可以对文字进行复制粘贴。但是在实际开发中,针对一些按钮一般要避免长按时弹出选中文字,或者一些罩层要避免弹出。 这篇文章通过css3实现禁止ios端长按复制选中文字的方法

H5页面中唤起APP的方法

需要在从APP分享出去的H5页面中,带有一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载。这是一个很正常的推广和导流量的策略。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!