UNPKG

@tsdanci/wx-share

Version:

WeChat Share SDK utility for web applications

1 lines 13.6 kB
{"version":3,"sources":["../src/wxShare.ts"],"sourcesContent":["import wx from \"weixin-js-sdk\";\r\n\r\nexport interface ShareConfig {\r\n title?: string;\r\n desc?: string;\r\n link?: string;\r\n imgUrl?: string;\r\n success?: () => void;\r\n fail?: (err: any) => void;\r\n cancel?: () => void;\r\n}\r\n\r\nexport interface SignConfig {\r\n appId: string;\r\n timestamp: string;\r\n nonceStr: string;\r\n signature: string;\r\n}\r\n\r\nexport interface SignConfigResponse {\r\n data: SignConfig;\r\n}\r\n\r\nexport interface SignConfigOptions {\r\n url?: string;\r\n customFetch?: (url: string) => Promise<SignConfigResponse>;\r\n}\r\n\r\ninterface WxError {\r\n errMsg: string;\r\n}\r\n\r\nclass WxShareUtil {\r\n private static instance: WxShareUtil;\r\n private isInit = false;\r\n private isDebug = false;\r\n private signConfig: SignConfig | null = null;\r\n private defaultConfig: Required<ShareConfig> = {\r\n title: document.title,\r\n desc: document.title,\r\n link: this.getCurrentUrl(),\r\n imgUrl: \"\",\r\n success: () => console.log(\"分享成功\"),\r\n fail: (err) => console.error(\"分享失败:\", err),\r\n cancel: () => console.log(\"取消分享\"),\r\n };\r\n private defaultApiUrl = \"/api/v2/wx-share\";\r\n private customFetch?: (url: string) => Promise<SignConfigResponse>;\r\n private shareOptions: ShareConfig | null = null;\r\n\r\n private constructor() {}\r\n\r\n public static getInstance(): WxShareUtil {\r\n if (!WxShareUtil.instance) {\r\n WxShareUtil.instance = new WxShareUtil();\r\n }\r\n return WxShareUtil.instance;\r\n }\r\n\r\n /**\r\n * 设置调试模式\r\n * @param debug 是否开启调试模式\r\n * @returns 当前实例,支持链式调用\r\n */\r\n public setDebug(debug: boolean): WxShareUtil {\r\n this.isDebug = debug;\r\n return this;\r\n }\r\n\r\n /**\r\n * 获取当前页面URL(包含hash)\r\n */\r\n public getCurrentUrl(): string {\r\n return window.location.href;\r\n }\r\n\r\n private isWeixinBrowser(): boolean {\r\n return /micromessenger/i.test(navigator.userAgent);\r\n }\r\n\r\n /**\r\n * 设置分享信息\r\n * @param config 分享配置\r\n * @param useDefault 是否使用默认配置合并(默认false)\r\n * @returns 当前实例,支持链式调用\r\n */\r\n public setShareInfo(\r\n config: ShareConfig,\r\n useDefault: boolean = false\r\n ): WxShareUtil {\r\n if (!this.isInit) {\r\n console.warn(\"请先初始化微信分享配置\");\r\n return this;\r\n }\r\n\r\n // 根据useDefault参数决定是否合并默认配置\r\n const shareConfig = useDefault\r\n ? {\r\n ...this.defaultConfig,\r\n ...config,\r\n link: config.link || this.getCurrentUrl(),\r\n }\r\n : {\r\n ...this.defaultConfig, // 仍然需要默认配置来确保必需字段存在\r\n ...config,\r\n link: config.link || this.getCurrentUrl(),\r\n };\r\n\r\n // 确保所有必需的分享参数都存在\r\n if (!shareConfig.title || !shareConfig.desc || !shareConfig.link) {\r\n console.warn(\"分享参数不完整,可能导致分享失败\");\r\n return this; // 如果参数不完整,直接返回\r\n }\r\n\r\n // 处理分享链接,确保包含hash部分\r\n const shareLink = shareConfig.link.includes(\"#\")\r\n ? shareConfig.link\r\n : `${shareConfig.link}${window.location.hash}`;\r\n\r\n // 基础分享配置\r\n const baseShareConfig = {\r\n title: shareConfig.title,\r\n desc: shareConfig.desc,\r\n link: shareLink,\r\n imgUrl: shareConfig.imgUrl,\r\n success: () => {\r\n console.log(\"分享配置成功\");\r\n shareConfig.success?.();\r\n },\r\n fail: (err: any) => {\r\n console.error(\"分享配置失败:\", err);\r\n shareConfig.fail?.(err);\r\n },\r\n cancel: () => {\r\n console.log(\"取消分享\");\r\n shareConfig.cancel?.();\r\n },\r\n };\r\n\r\n // 分享给朋友\r\n wx.updateAppMessageShareData(baseShareConfig);\r\n\r\n // 分享到朋友圈\r\n wx.updateTimelineShareData(baseShareConfig);\r\n\r\n // 分享到腾讯微博\r\n if (typeof wx.onMenuShareWeibo === \"function\") {\r\n wx.onMenuShareWeibo(baseShareConfig);\r\n }\r\n\r\n // 分享到QQ空间\r\n if (typeof wx.onMenuShareQZone === \"function\") {\r\n wx.onMenuShareQZone(baseShareConfig);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 快速分享(自动初始化并设置分享信息)\r\n * @param signConfig 签名配置\r\n * @param config 分享配置\r\n * @param useDefault 是否使用默认配置合并(默认false)\r\n * @returns Promise<boolean>\r\n */\r\n public async share(\r\n signConfig: SignConfig,\r\n config: ShareConfig,\r\n useDefault: boolean = false\r\n ): Promise<boolean> {\r\n try {\r\n if (!this.isInit) {\r\n // 先进行初始化\r\n const initResult = await this.initWithConfig(signConfig);\r\n if (!initResult) {\r\n return false;\r\n }\r\n }\r\n\r\n // 初始化成功后,设置分享信息\r\n this.setShareInfo(config, useDefault);\r\n return true;\r\n } catch (error) {\r\n console.error(\"分享设置失败:\", error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 初始化微信分享配置\r\n * @param signConfig 签名配置\r\n * @returns Promise<boolean> 初始化是否成功\r\n */\r\n public async initWithConfig(signConfig: SignConfig): Promise<boolean> {\r\n if (this.isInit) {\r\n console.log(\"微信分享已经初始化\");\r\n return true;\r\n }\r\n\r\n if (!this.isWeixinBrowser()) {\r\n console.log(\"非微信浏览器环境\");\r\n return false;\r\n }\r\n\r\n try {\r\n // 确保所有必需的参数都存在\r\n if (\r\n !signConfig.appId ||\r\n !signConfig.timestamp ||\r\n !signConfig.nonceStr ||\r\n !signConfig.signature\r\n ) {\r\n throw new Error(\"签名配置参数不完整\");\r\n }\r\n\r\n return new Promise((resolve) => {\r\n wx.config({\r\n debug: this.isDebug, // 使用实例的调试模式设置\r\n appId: signConfig.appId,\r\n timestamp: parseInt(signConfig.timestamp, 10),\r\n nonceStr: signConfig.nonceStr,\r\n signature: signConfig.signature,\r\n jsApiList: [\r\n \"updateAppMessageShareData\",\r\n \"updateTimelineShareData\",\r\n \"onMenuShareTimeline\",\r\n \"onMenuShareAppMessage\",\r\n ],\r\n });\r\n\r\n wx.ready(() => {\r\n console.log(\"微信JS-SDK初始化成功\");\r\n this.isInit = true;\r\n resolve(true);\r\n });\r\n\r\n wx.error((res: WxError) => {\r\n console.error(\"微信JS-SDK初始化失败:\", res);\r\n this.isInit = false;\r\n resolve(false);\r\n });\r\n });\r\n } catch (error) {\r\n console.error(\"初始化失败:\", error);\r\n this.isInit = false;\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 设置分享配置\r\n * @param options 分享配置\r\n * @returns 当前实例,支持链式调用\r\n */\r\n public setShareOptions(options: ShareConfig): WxShareUtil {\r\n this.shareOptions = options;\r\n return this;\r\n }\r\n\r\n /**\r\n * 从API获取签名配置并初始化分享\r\n * @param options 配置选项\r\n * @returns Promise<WxShareUtil>\r\n */\r\n public async fetchSignConfigAndShare(\r\n options: SignConfigOptions = {}\r\n ): Promise<WxShareUtil> {\r\n try {\r\n // 检查是否为微信浏览器环境\r\n if (!this.isWeixinBrowser()) {\r\n console.log(\"非微信浏览器环境,跳过签名获取\");\r\n return this;\r\n }\r\n\r\n const currentUrl = this.getCurrentUrl();\r\n const apiUrl = options.url || this.defaultApiUrl;\r\n\r\n let response: SignConfigResponse;\r\n if (this.customFetch) {\r\n response = await this.customFetch(apiUrl);\r\n } else {\r\n const res = await fetch(apiUrl, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ url: currentUrl }),\r\n });\r\n response = await res.json();\r\n }\r\n\r\n if (!response.data) {\r\n throw new Error(\"获取签名配置失败: 响应数据为空\");\r\n }\r\n\r\n this.signConfig = response.data;\r\n\r\n if (!this.shareOptions) {\r\n throw new Error(\"请先设置分享配置\");\r\n }\r\n\r\n const success = await this.share(this.signConfig, this.shareOptions);\r\n if (!success) {\r\n throw new Error(\"微信分享初始化失败\");\r\n }\r\n\r\n return this;\r\n } catch (error) {\r\n console.error(\"分享设置失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 设置自定义的签名配置获取方法\r\n * @param customFetch 自定义的fetch方法\r\n * @returns 当前实例,支持链式调用\r\n */\r\n public setCustomFetch(\r\n customFetch: (url: string) => Promise<SignConfigResponse>\r\n ): WxShareUtil {\r\n this.customFetch = customFetch;\r\n return this;\r\n }\r\n}\r\n\r\n// 创建工具实例\r\nexport const createWxShare = () => WxShareUtil.getInstance();\r\n"],"mappings":"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","names":[]}