@tsdanci/wx-share
Version:
WeChat Share SDK utility for web applications
234 lines • 7.33 kB
JavaScript
// 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