基于vue2开发的html5页面实现微信分享卡片(微信好友+朋友圈+qq好友+qq空间)
首先附上文档链接:
1.微信官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#111
2.免费生成二维码的草料官网:https://cli.im/text/other
需求:
在浏览器分享链接时携带用户id(因为是拉人活动,需要给用户积分),并且在微信中分享为卡片模式
具体实现:
首先需要去公众号进行配置,具体步骤网上很多,大致就是填写ip、安全域名白名单、下载微信官方用于运行的txt文件并且放到项目根目录这些最关键。
然后是前端代码实现
重点:传给接口的地址必须跟当前路由完全一致,不能有一个地方不一样,否测config校验都会失效!!!
重点:传给接口的地址必须跟当前路由完全一致,不能有一个地方不一样,否测config校验都会失效!!!
重点:传给接口的地址必须跟当前路由完全一致,不能有一个地方不一样,否测config校验都会失效!!!
1.引入微信的js sdk文件:npm install weixin-js-sdk --save
2.在utils.js中书写代码:
import wx from "weixin-js-sdk"; /* * 微信分享 * 获取微信加签信息 * @param{data}:获取的微信加签 * @param{shareData}:分享配置参数 */ export const wxShare = (data, shareData) => { let appId = data.appId; let timestamp = data.timestamp; let nonceStr = data.nonceStr; let signature = data.signature; wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。(测试记得关掉) appId: appId, // 必填,公众号的唯一标识 timestamp: timestamp, // 必填,生成签名的时间戳 nonceStr: nonceStr, // 必填,生成签名的随机串 signature: signature, // 必填,签名,见附录1 jsApiList: [ // 必填,需要使用的JS接口列表 // "checkJsApi", "updateAppMessageShareData", //分享到微信及QQ(新接口) "updateTimelineShareData", //分享到朋友圈”及“分享到QQ空间(新接口) ], }); // wx.checkJsApi({ // jsApiList: ["chooseImage", "updateAppMessageShareData"], // 需要检测的JS接口列表,所有JS接口列表见附录2, // success: function (res) { // // 以键值对的形式返回,可用的api值true,不可用为false // // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} // console.log(res, "checkJsApi"); // }, // }); wx.ready(function () { // //分享到朋友圈”及“分享到QQ空间” wx.updateTimelineShareData({ ...shareData, link: shareData.link + "&t=" + timestamp, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 success: function (res) { console.log("分享朋友圈成功返回的信息为:", res); }, }); //“分享给朋友”及“分享到QQ” wx.updateAppMessageShareData({ ...shareData, link: shareData.link + "&t=" + timestamp + "&Content=1", // 分享链接 该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 success: function (res) { console.log("分享朋友成功返回的信息为:", res); }, }); }); wx.error(function (res) { // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 console.log("验证失败返回的信息:", res); }); };
具体细节配置可以参考官方文档,不赘述。
3.在App.vue中进行使用:
<template> <section> <div class="app-container app-container-e"> xxx </div> </section> </template> <script> import { wxShare } from "@/utils/utils.js"; export default { name: "App", components: { }, data() { return {}; }, computed: { }, mounted() { // 当token存在时请求用户数据 if (this.token) { this.initUser(); } else { this.setUser({}); } }, methods: { async initUser() { const { data = {} } = await api.fetchUserInfo(); if (Object.keys(data).length > 0) { // 设置用户基本信息 this.setUser(data); const browser = window.navigator.userAgent.toLowerCase(); //匹配browser中是否含有MicroMessenger字符串 if (browser.match(/MicroMessenger/i) == "micromessenger") { this.weixin(data); } else { const params = new URLSearchParams(window.location.search); const id = params.get("id"); if (!id || (id && id !== data.uid)) { // 如果不是微信浏览器,则跳转页面带id后缀 const url_a = window.location.origin; window.location.href = url_a + "?id=" + data.uid; } } } }, async weixin(info) { //请求微信配置参数接口(获取签名),由后台给接口给 const url_a = window.location.href.split("#")[0]; try { const { code, msg, data } = await api.shareWx(url_a); if (code === 0 && data) { //微信加签 var obj = { appId: data.appid, nonceStr: data.nonceStr, signature: data.signature, timestamp: data.timestamp, } //分享数据,这段主要是为了在hash模式下分享出去的链接不被浏览器截取,保证完全把链接分享出去(link的链接可以自己拼,无须与当前页面的后缀参数之类的内容完全一致) let shareData = { title: process.env.VUE_APP_TITLE, desc: process.env.VUE_APP_DESCRIPTION, imgUrl: process.env.VUE_APP_IMAGE, link: data.url + "?id=" + info.uid, }; //引用 wxShare(obj, shareData); } else { this.$toast(msg || "获取sdk参数失败"); } } catch (err) { // } finally { // } }, }, }; </script> <style lang="less"> .app-container-e { overflow: hidden; } </style>
这里需要后端去获取签名,前端不用管,叮嘱后端在微信开发者工具里把config初始化调试到没有问题,再去联调就好。
需要注意的是,我们请求接口是发的地址,不能带后缀,必须与网页的域名是一致的,如果有#,则需要用encodeURIComponent进行加密。
4.因为是h5页面,所以直接发送链接,微信是不会识别为卡片的,能够分享为卡片模式的条件为如下:
因此我们可以用草料生成二维码,进行测试,会发现成功成为卡片模式了~
ps 至于其他浏览器,一般自带卡片,所以无需太多关注,只需要注意登录后获取到用户信息后,跳转一下链接拼接好用户id就可以正常分享拉人啦