UNPKG

@tsdanci/wx-share

Version:

WeChat Share SDK utility for web applications

234 lines 7.33 kB
// src/wxShare.ts import wx from "weixin-js-sdk"; var WxShareUtil = class _WxShareUtil { constructor() { this.isInit = false; this.isDebug = false; this.signConfig = null; this.defaultConfig = { title: document.title, desc: document.title, link: this.getCurrentUrl(), imgUrl: "", success: () => console.log("\u5206\u4EAB\u6210\u529F"), fail: (err) => console.error("\u5206\u4EAB\u5931\u8D25:", err), cancel: () => console.log("\u53D6\u6D88\u5206\u4EAB") }; this.defaultApiUrl = "/api/v2/wx-share"; this.shareOptions = null; } static getInstance() { if (!_WxShareUtil.instance) { _WxShareUtil.instance = new _WxShareUtil(); } return _WxShareUtil.instance; } /** * 设置调试模式 * @param debug 是否开启调试模式 * @returns 当前实例,支持链式调用 */ setDebug(debug) { this.isDebug = debug; return this; } /** * 获取当前页面URL(包含hash) */ getCurrentUrl() { return window.location.href; } isWeixinBrowser() { return /micromessenger/i.test(navigator.userAgent); } /** * 设置分享信息 * @param config 分享配置 * @param useDefault 是否使用默认配置合并(默认false) * @returns 当前实例,支持链式调用 */ setShareInfo(config, useDefault = false) { if (!this.isInit) { console.warn("\u8BF7\u5148\u521D\u59CB\u5316\u5FAE\u4FE1\u5206\u4EAB\u914D\u7F6E"); return this; } const shareConfig = useDefault ? { ...this.defaultConfig, ...config, link: config.link || this.getCurrentUrl() } : { ...this.defaultConfig, // 仍然需要默认配置来确保必需字段存在 ...config, link: config.link || this.getCurrentUrl() }; if (!shareConfig.title || !shareConfig.desc || !shareConfig.link) { console.warn("\u5206\u4EAB\u53C2\u6570\u4E0D\u5B8C\u6574\uFF0C\u53EF\u80FD\u5BFC\u81F4\u5206\u4EAB\u5931\u8D25"); return this; } const shareLink = shareConfig.link.includes("#") ? shareConfig.link : `${shareConfig.link}${window.location.hash}`; const baseShareConfig = { title: shareConfig.title, desc: shareConfig.desc, link: shareLink, imgUrl: shareConfig.imgUrl, success: () => { console.log("\u5206\u4EAB\u914D\u7F6E\u6210\u529F"); shareConfig.success?.(); }, fail: (err) => { console.error("\u5206\u4EAB\u914D\u7F6E\u5931\u8D25:", err); shareConfig.fail?.(err); }, cancel: () => { console.log("\u53D6\u6D88\u5206\u4EAB"); shareConfig.cancel?.(); } }; wx.updateAppMessageShareData(baseShareConfig); wx.updateTimelineShareData(baseShareConfig); if (typeof wx.onMenuShareWeibo === "function") { wx.onMenuShareWeibo(baseShareConfig); } if (typeof wx.onMenuShareQZone === "function") { wx.onMenuShareQZone(baseShareConfig); } return this; } /** * 快速分享(自动初始化并设置分享信息) * @param signConfig 签名配置 * @param config 分享配置 * @param useDefault 是否使用默认配置合并(默认false) * @returns Promise<boolean> */ async share(signConfig, config, useDefault = false) { try { if (!this.isInit) { const initResult = await this.initWithConfig(signConfig); if (!initResult) { return false; } } this.setShareInfo(config, useDefault); return true; } catch (error) { console.error("\u5206\u4EAB\u8BBE\u7F6E\u5931\u8D25:", error); return false; } } /** * 初始化微信分享配置 * @param signConfig 签名配置 * @returns Promise<boolean> 初始化是否成功 */ async initWithConfig(signConfig) { if (this.isInit) { console.log("\u5FAE\u4FE1\u5206\u4EAB\u5DF2\u7ECF\u521D\u59CB\u5316"); return true; } if (!this.isWeixinBrowser()) { console.log("\u975E\u5FAE\u4FE1\u6D4F\u89C8\u5668\u73AF\u5883"); return false; } try { if (!signConfig.appId || !signConfig.timestamp || !signConfig.nonceStr || !signConfig.signature) { throw new Error("\u7B7E\u540D\u914D\u7F6E\u53C2\u6570\u4E0D\u5B8C\u6574"); } return new Promise((resolve) => { wx.config({ debug: this.isDebug, // 使用实例的调试模式设置 appId: signConfig.appId, timestamp: parseInt(signConfig.timestamp, 10), nonceStr: signConfig.nonceStr, signature: signConfig.signature, jsApiList: [ "updateAppMessageShareData", "updateTimelineShareData", "onMenuShareTimeline", "onMenuShareAppMessage" ] }); wx.ready(() => { console.log("\u5FAE\u4FE1JS-SDK\u521D\u59CB\u5316\u6210\u529F"); this.isInit = true; resolve(true); }); wx.error((res) => { console.error("\u5FAE\u4FE1JS-SDK\u521D\u59CB\u5316\u5931\u8D25:", res); this.isInit = false; resolve(false); }); }); } catch (error) { console.error("\u521D\u59CB\u5316\u5931\u8D25:", error); this.isInit = false; return false; } } /** * 设置分享配置 * @param options 分享配置 * @returns 当前实例,支持链式调用 */ setShareOptions(options) { this.shareOptions = options; return this; } /** * 从API获取签名配置并初始化分享 * @param options 配置选项 * @returns Promise<WxShareUtil> */ async fetchSignConfigAndShare(options = {}) { try { if (!this.isWeixinBrowser()) { console.log("\u975E\u5FAE\u4FE1\u6D4F\u89C8\u5668\u73AF\u5883\uFF0C\u8DF3\u8FC7\u7B7E\u540D\u83B7\u53D6"); return this; } const currentUrl = this.getCurrentUrl(); const apiUrl = options.url || this.defaultApiUrl; let response; if (this.customFetch) { response = await this.customFetch(apiUrl); } else { const res = await fetch(apiUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ url: currentUrl }) }); response = await res.json(); } if (!response.data) { throw new Error("\u83B7\u53D6\u7B7E\u540D\u914D\u7F6E\u5931\u8D25: \u54CD\u5E94\u6570\u636E\u4E3A\u7A7A"); } this.signConfig = response.data; if (!this.shareOptions) { throw new Error("\u8BF7\u5148\u8BBE\u7F6E\u5206\u4EAB\u914D\u7F6E"); } const success = await this.share(this.signConfig, this.shareOptions); if (!success) { throw new Error("\u5FAE\u4FE1\u5206\u4EAB\u521D\u59CB\u5316\u5931\u8D25"); } return this; } catch (error) { console.error("\u5206\u4EAB\u8BBE\u7F6E\u5931\u8D25:", error); throw error; } } /** * 设置自定义的签名配置获取方法 * @param customFetch 自定义的fetch方法 * @returns 当前实例,支持链式调用 */ setCustomFetch(customFetch) { this.customFetch = customFetch; return this; } }; var createWxShare = () => WxShareUtil.getInstance(); export { createWxShare }; //# sourceMappingURL=index.mjs.map