|
|
@@ -0,0 +1,225 @@
|
|
|
+import jsonp from "jsonp";
|
|
|
+/**
|
|
|
+ * 微信 JS-SDK 分享配置
|
|
|
+ * 通过 JSONP 请求签名,配置朋友圈 / 好友分享
|
|
|
+ */
|
|
|
+
|
|
|
+// 正在加载中标记
|
|
|
+let loading = false;
|
|
|
+// wx.config 是否已完成
|
|
|
+let configured = false;
|
|
|
+// 等待队列
|
|
|
+let resolveQueue = [];
|
|
|
+
|
|
|
+// /**
|
|
|
+// * JSONP 请求
|
|
|
+// * @param {string} url - 接口地址
|
|
|
+// * @param {object} params - 查询参数
|
|
|
+// * @returns {Promise<any>}
|
|
|
+// */
|
|
|
+// function jsonp(url, params = {}) {
|
|
|
+// return new Promise((resolve, reject) => {
|
|
|
+// const callbackName =
|
|
|
+// "wx_jsonp_cb_" +
|
|
|
+// Date.now() +
|
|
|
+// "_" +
|
|
|
+// Math.random().toString(36).slice(2, 8);
|
|
|
+// params.jsonp = callbackName;
|
|
|
+
|
|
|
+// const query = Object.keys(params)
|
|
|
+// .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)
|
|
|
+// .join("&");
|
|
|
+
|
|
|
+// const sep = url.includes("?") ? "&" : "?";
|
|
|
+// const src = url + sep + query;
|
|
|
+
|
|
|
+// const script = document.createElement("script");
|
|
|
+// script.src = src;
|
|
|
+
|
|
|
+// // 超时保护
|
|
|
+// const timer = setTimeout(() => {
|
|
|
+// cleanup();
|
|
|
+// reject(new Error("JSONP timeout"));
|
|
|
+// }, 10000);
|
|
|
+
|
|
|
+// function cleanup() {
|
|
|
+// clearTimeout(timer);
|
|
|
+// delete window[callbackName];
|
|
|
+// if (script.parentNode) script.parentNode.removeChild(script);
|
|
|
+// }
|
|
|
+
|
|
|
+// window[callbackName] = (data) => {
|
|
|
+// cleanup();
|
|
|
+// resolve(data);
|
|
|
+// };
|
|
|
+
|
|
|
+// script.onerror = () => {
|
|
|
+// cleanup();
|
|
|
+// reject(new Error("JSONP error"));
|
|
|
+// };
|
|
|
+
|
|
|
+// document.head.appendChild(script);
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+/**
|
|
|
+ * 加载微信 JS-SDK 脚本
|
|
|
+ */
|
|
|
+function loadJSSDK() {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ if (window.wx) {
|
|
|
+ resolve();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const script = document.createElement("script");
|
|
|
+ script.src = "https://res.wx.qq.com/open/js/jweixin-1.6.0.js";
|
|
|
+ script.onload = () => resolve();
|
|
|
+ script.onerror = () => reject(new Error("加载 jweixin SDK 失败"));
|
|
|
+ document.head.appendChild(script);
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 初始化微信分享配置(签名 + wx.config)
|
|
|
+ * 仅移动端微信环境需要调用
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+export async function initWxShare() {
|
|
|
+ // 非微信浏览器直接返回
|
|
|
+ // if (!/MicroMessenger/i.test(navigator.userAgent)) return;
|
|
|
+ // 已经在加载中 / 已完成,返回 promise
|
|
|
+ if (loading || configured) {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ if (configured) {
|
|
|
+ resolve();
|
|
|
+ } else {
|
|
|
+ resolveQueue.push(resolve);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ loading = true;
|
|
|
+
|
|
|
+ try {
|
|
|
+ await loadJSSDK();
|
|
|
+
|
|
|
+ const shareUrl = window.location.href.split("#")[0];
|
|
|
+ let name = "厦门四维时代微信公众号";
|
|
|
+ let uri = encodeURIComponent(location.href.split("#")[0]);
|
|
|
+ // const data = await jsonp(
|
|
|
+ // "//www.4dage.com/wechat/jssdk/share?name=" + name + "&uri=" + uri,
|
|
|
+ // {
|
|
|
+ // param: "callback",
|
|
|
+ // },
|
|
|
+ // );
|
|
|
+ jsonp(
|
|
|
+ "//www.4dage.com/wechat/jssdk/share?name=" + name + "&uri=" + uri,
|
|
|
+ {
|
|
|
+ param: "callback",
|
|
|
+ },
|
|
|
+ function (err, data) {
|
|
|
+ console.log(data);
|
|
|
+ const { appId, timestamp, nonceStr, signature } = data;
|
|
|
+
|
|
|
+ window.wx.config({
|
|
|
+ debug: false,
|
|
|
+ appId,
|
|
|
+ timestamp,
|
|
|
+ nonceStr,
|
|
|
+ signature,
|
|
|
+ jsApiList: [
|
|
|
+ "checkJsApi",
|
|
|
+ "onMenuShareTimeline",
|
|
|
+ "onMenuShareAppMessage",
|
|
|
+ "updateTimelineShareData",
|
|
|
+ "updateAppMessageShareData",
|
|
|
+ "onMenuShareQQ",
|
|
|
+ "onMenuShareWeibo",
|
|
|
+ "hideMenuItems",
|
|
|
+ "showMenuItems",
|
|
|
+ "hideAllNonBaseMenuItem",
|
|
|
+ "showAllNonBaseMenuItem",
|
|
|
+ "translateVoice",
|
|
|
+ "startRecord",
|
|
|
+ "stopRecord",
|
|
|
+ "onRecordEnd",
|
|
|
+ "playVoice",
|
|
|
+ "pauseVoice",
|
|
|
+ "stopVoice",
|
|
|
+ "uploadVoice",
|
|
|
+ "downloadVoice",
|
|
|
+ "chooseImage",
|
|
|
+ "previewImage",
|
|
|
+ "uploadImage",
|
|
|
+ "downloadImage",
|
|
|
+ "getNetworkType",
|
|
|
+ "openLocation",
|
|
|
+ "getLocation",
|
|
|
+ "hideOptionMenu",
|
|
|
+ "showOptionMenu",
|
|
|
+ "closeWindow",
|
|
|
+ "scanQRCode",
|
|
|
+ "chooseWXPay",
|
|
|
+ "openProductSpecificView",
|
|
|
+ "addCard",
|
|
|
+ "chooseCard",
|
|
|
+ "openCard",
|
|
|
+ ],
|
|
|
+ });
|
|
|
+
|
|
|
+ window.wx.ready(() => {
|
|
|
+ configured = true;
|
|
|
+ loading = false;
|
|
|
+ resolveQueue.forEach((fn) => fn());
|
|
|
+ resolveQueue = [];
|
|
|
+
|
|
|
+ setShareData({
|
|
|
+ title: '快来云打卡“考神”魁星,祝所有考生金榜题名',
|
|
|
+ desc: "",
|
|
|
+ imgUrl: `https://www.4dkankan.com/test/gzh/static/images/mobile/logo.png`,
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ window.wx.error(() => {
|
|
|
+ loading = false;
|
|
|
+ resolveQueue.forEach((fn) => fn());
|
|
|
+ resolveQueue = [];
|
|
|
+ });
|
|
|
+ },
|
|
|
+ );
|
|
|
+ } catch (e) {
|
|
|
+ console.warn("微信分享初始化失败:", e);
|
|
|
+ loading = false;
|
|
|
+ resolveQueue.forEach((fn) => fn());
|
|
|
+ resolveQueue = [];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 设置分享内容
|
|
|
+ * @param {object} options
|
|
|
+ * @param {string} options.title - 分享标题
|
|
|
+ * @param {string} options.desc - 分享描述(仅好友可见)
|
|
|
+ * @param {string} options.link - 分享链接(默认当前页)
|
|
|
+ * @param {string} options.imgUrl - 分享图标(200×200 以上)
|
|
|
+ */
|
|
|
+export function setShareData({ title, desc, link, imgUrl }) {
|
|
|
+ if (!window.wx) return;
|
|
|
+
|
|
|
+ const shareLink = link || window.location.href;
|
|
|
+ const shareImgUrl = imgUrl || "";
|
|
|
+ // 分享给朋友
|
|
|
+ window.wx.onMenuShareAppMessage({
|
|
|
+ title,
|
|
|
+ desc,
|
|
|
+ link: shareLink,
|
|
|
+ imgUrl: shareImgUrl,
|
|
|
+ });
|
|
|
+
|
|
|
+ // 分享到朋友圈
|
|
|
+ window.wx.onMenuShareTimeline({
|
|
|
+ title,
|
|
|
+ link: shareLink,
|
|
|
+ imgUrl: shareImgUrl,
|
|
|
+ });
|
|
|
+}
|