项目h5最开始已经引入了微信的jssdk,有了微信的分享功能,但是最近有个需求需要在企业微信中分享,刚开始拿到需求的时候啥也没看,直接翻开api开始撸。
采用了静默授权的方式,企微环境进入之后微信会重定向到我们的h5并且带了code,我们拿这个code和location.href去服务端换取appId等配置信息。
//企微redirect_url追加的code
//退出登录时 【不要清 不要清 不要清!!!】 localStorage下的code和state
//退出登录后 query.code没有值
if (/wxwork/i.test(navigator.userAgent) && this.$route.query.code) {
localStorage.jweixin_code = this.$route.query.code;
localStorage.jweixin_state = this.$route.query.state;
let oauthData = await oauth();
console.log('--oauthData', oauthData);
if (oauthData.data.authCorpId) {
//存在登录页面强制刷新时,因code只能被消费一次,此时authCorpId会return null
localStorage.jweixin_authCorpId = oauthData.data.authCorpId;
}
}
config配置完成之后,调用分享api,测试的时候发现,卧槽,没生效!
最后发现,企微的sdk和微信sdk时不能同时存在共用的,也是翻到社区大哥的回复才知道的!
总的来说就是企业微信要1.2的版本,微信的目前用的1.6.0,根据环境判断分别引入
大致代码如下:
import { iswxwork } from '@/utils/check.js';
import Vue from 'vue'
let el = {}
if (!iswxwork()) {
el = require('@/utils/wxShare.js');
el.createWxEle();
} else {
el = require('@/utils/wxworkShare.js');
el.createWxworkEle();
}
Vue.prototype.$commonShare = (shareMes) => {
if (!iswxwork()) {
el.getWxConfig(shareMes); //{title, linkUrl, sharePic, sortTitle}
} else {
el.wxwork_init(shareMes);
}
}
/utils/check.js
//判断是企业微信环境
export const iswxwork = () => {
return /wxwork/i.test(navigator.userAgent)
}
- 微信内代码如下:【utils/wxShare.js】
import { wxShare } from '@/api/home.js';
import { Toast } from "vant";
//https://developers.weixin.qq.com/community/develop/doc/000e8a9c5f87f8f52ff9593355d800
export const createWxEle = () => {
window.wx = null;
window.jWeixin = null;
if (document.getElementById("wxScriptId")) {
removeJweixin();
}
appendjweixin();
}
export const getWxConfig = (shareMes) => { // {title, linkUrl, sharePic, sortTitle}
wxShare(location.href)
.then((res) => {
// this.artDetail = res.data.data
let config = res.data;
window.wx.checkJsApi({
jsApiList: [
'updateAppMessageShareData',
'updateTimelineShareData',
'onMenuShareTimeline',
'onMenuShareAppMessage'
], // 需要检测的JS接口列表,所有JS接口列表见附录2,
success: function (res) {
console.log(res);
}
});
window.wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: config.appId, // 必填,公众号的唯一标识
timestamp: config.timestamp, // 必填,生成签名的时间戳
nonceStr: config.nonceStr, // 必填,生成签名的随机串
signature: config.signature, // 必填,签名
jsApiList: [
'updateAppMessageShareData',
'updateTimelineShareData',
'onMenuShareTimeline',
'onMenuShareAppMessage'
] // 必填,需要使用的JS接口列表
});
window.wx.error(function (res) {
// alert('出错了:' + res.errMsg) //这个地方的好处就是window.wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
console.log(res.errMsg);
});
window.wx.ready(() => {
console.log(1111111111111);
wx_share(
shareMes.title,
shareMes.linkUrl,
shareMes.sharePic,
shareMes.sortTitle
);
wx_TimelineShare(
shareMes.title,
shareMes.linkUrl,
shareMes.sharePic,
shareMes.sortTitle
);
});
})
.catch((error) => {
Toast.fail(error);
});
}
function appendjweixin () {
const ele = document.createElement('script');
ele.type = 'text/javascript';
ele.src = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js';
ele.id = "wxScriptId"
document.body.appendChild(ele);
}
function removeJweixin () {
let ele = document.getElementById("wxScriptId")
document.body.removeChild(ele)
}
function wx_share (title, link, imgurl, desc) {
//微信好友
window.wx.updateAppMessageShareData({
title: title, // 分享标题
desc: desc, // 分享描述
link: link, // 分享链接
imgUrl: imgurl, // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
}
function wx_TimelineShare (title, link, imgurl) {
//朋友圈
window.wx.updateTimelineShareData({
title: title, // 分享标题
link: link, // 分享链接
imgUrl: imgurl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
}
- 企业微信代码如下 【utils/wxworkShare.js】
import { jwxShare } from "@/api/home"
export const createWxworkEle = () => {
window.wx = null;
window.jWeixin = null;
if (document.getElementById("wxworkScriptId")) {
removewxwork();
}
appendwxwork();
}
export const wxwork_init = async (params) => { // {title, linkUrl, sharePic, sortTitle}
let res = await getAppId()
console.log('getAppId', res)
wxwork_setConfig(res, {
title: params.title,
desc: params.sortTitle,
link: params.linkUrl,
imgUrl: params.sharePic
});
}
async function getAppId () {
let config = await jwxShare();
console.log("config", config);
return config.data
}
function wxwork_setConfig ({ appId, timestamp, nonceStr, signature }, params) {
const jsApiList = [
"onMenuShareAppMessage",
"onMenuShareWechat",
"onMenuShareTimeline",
]
window.wx.config({
beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId, // 必填,企业微信的corpID
timestamp, // 必填,生成签名的时间戳
nonceStr, // 必填,生成签名的随机串
signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法
jsApiList // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
});
window.wx.checkJsApi({
jsApiList, // 需要检测的JS接口列表
success: (res) => {
console.log("checkJsApi success", res)
// 以键值对的形式返回,可用的api值true,不可用为false
// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
}
});
window.wx.ready((r) => {
console.log('rrr', r)
wxwork_onMenuShareAppMessage(params)
wxwork_onMenuShareWechat(params)
wxwork_onMenuShareTimeline(params)
})
window.wx.error((e) => {
console.log('eee', e)
})
}
// 转发
function wxwork_onMenuShareAppMessage ({ title, desc, link, imgUrl }) {
window.wx.onMenuShareAppMessage({
title, // 分享标题
desc, // 分享描述
link, // 分享链接;在微信上分享时,该链接的域名必须与企业某个应用的可信域名一致
imgUrl, // 分享图标
// enableIdTrans: 1, // 是否开启id转译,不填默认为0
});
}
// 分享到微信
function wxwork_onMenuShareWechat ({ title, desc, link, imgUrl }) {
window.wx.onMenuShareWechat({
title, // 分享标题
desc, // 分享描述
link, // 分享链接
imgUrl, // 分享图标
// enableIdTrans: 1, // 是否开启id转译,不填默认为0
});
}
// 分享到朋友圈
function wxwork_onMenuShareTimeline ({ title, link, imgUrl }) {
window.wx.onMenuShareTimeline({
title, // 分享标题
link, // 分享链接;在微信上分享时,该链接的域名必须与企业某个应用的可信域名一致
imgUrl, // 分享图标
// enableIdTrans: 1, // 是否开启id转译,不填默认为0
});
}
function appendwxwork () {//
const ele = document.createElement('script');
ele.type = 'text/javascript';
ele.src = 'https://res.wx.qq.com/open/js/jweixin-1.2.0.js';
ele.id = "wxworkScriptId"
document.body.appendChild(ele);
}
function removewxwork () {
let ele = document.getElementById("wxworkScriptId")
document.body.removeChild(ele)
}
还有一个坑点会导致企微配置config时签名失败,就是 jwxShare这个接口 url记得转义一下
url: encodeURIComponent(location.href)
遇到的其他问题见官方文档即可~