@sohu-bpd/wechat
Advanced tools
+2
-333
@@ -1,334 +0,3 @@ | ||
| var SohuWechat = (function (exports) { | ||
| 'use strict'; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropSymbols = Object.getOwnPropertySymbols; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __propIsEnum = Object.prototype.propertyIsEnumerable; | ||
| var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
| var __spreadValues = (a, b) => { | ||
| for (var prop in b || (b = {})) | ||
| if (__hasOwnProp.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| if (__getOwnPropSymbols) | ||
| for (var prop of __getOwnPropSymbols(b)) { | ||
| if (__propIsEnum.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| } | ||
| return a; | ||
| }; | ||
| var __async = (__this, __arguments, generator) => { | ||
| return new Promise((resolve, reject) => { | ||
| var fulfilled = (value) => { | ||
| try { | ||
| step(generator.next(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var rejected = (value) => { | ||
| try { | ||
| step(generator.throw(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); | ||
| step((generator = generator.apply(__this, __arguments)).next()); | ||
| }); | ||
| }; | ||
| // src/config.ts | ||
| var DEFAULT_DOMAIN_CONFIGS = { | ||
| "https://act.go.sohu.com": { | ||
| endpoint: "/wechat/ticket", | ||
| urlParamKey: "url" | ||
| }, | ||
| "https://test.r.ads.sohu.com": { | ||
| endpoint: "/wechat/ticket", | ||
| urlParamKey: "url" | ||
| } | ||
| }; | ||
| function httpGet(url) { | ||
| return __async(this, null, function* () { | ||
| if (typeof fetch !== "undefined") { | ||
| const response = yield fetch(url); | ||
| if (!response.ok) { | ||
| throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`); | ||
| } | ||
| return yield response.json(); | ||
| } | ||
| return new Promise((resolve, reject) => { | ||
| const xhr = new XMLHttpRequest(); | ||
| xhr.open("GET", url, true); | ||
| xhr.onload = () => { | ||
| if (xhr.status >= 200 && xhr.status < 300) { | ||
| try { | ||
| const result = JSON.parse(xhr.responseText); | ||
| resolve(result); | ||
| } catch (error) { | ||
| reject(new Error(`Failed to parse response: ${error}`)); | ||
| } | ||
| } else { | ||
| reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`)); | ||
| } | ||
| }; | ||
| xhr.onerror = () => { | ||
| reject(new Error("Network error occurred")); | ||
| }; | ||
| xhr.send(); | ||
| }); | ||
| }); | ||
| } | ||
| function defaultTransformResponse(response) { | ||
| if (response.code !== 0) { | ||
| throw new Error(`Signature API error: ${response.message}`); | ||
| } | ||
| return { | ||
| appId: response.data.app_id, | ||
| timestamp: response.data.timestamp, | ||
| nonceStr: response.data.nonce_str, | ||
| signature: response.data.signature | ||
| }; | ||
| } | ||
| function createDomainSignatureGetter(domainConfig) { | ||
| return (url) => __async(null, null, function* () { | ||
| var _a, _b, _c; | ||
| const endpoint = (_a = domainConfig.endpoint) != null ? _a : "/wechat/ticket"; | ||
| const paramKey = (_b = domainConfig.urlParamKey) != null ? _b : "url"; | ||
| const transform = (_c = domainConfig.transformResponse) != null ? _c : defaultTransformResponse; | ||
| const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`; | ||
| const response = yield httpGet(apiUrl); | ||
| return transform(response); | ||
| }); | ||
| } | ||
| function getEffectiveDomainConfigs() { | ||
| var _a; | ||
| return __spreadValues(__spreadValues({}, DEFAULT_DOMAIN_CONFIGS), (_a = globalConfig == null ? void 0 : globalConfig.domainConfigs) != null ? _a : {}); | ||
| } | ||
| function findDomainConfig() { | ||
| var _a; | ||
| if (typeof window === "undefined") return null; | ||
| const origin = window.location.origin; | ||
| const effectiveConfigs = getEffectiveDomainConfigs(); | ||
| return (_a = effectiveConfigs[origin]) != null ? _a : null; | ||
| } | ||
| var globalConfig = null; | ||
| function config(options = {}) { | ||
| if (options.getSignature) { | ||
| globalConfig = options; | ||
| return; | ||
| } | ||
| if (options.domainConfigs && typeof window !== "undefined") { | ||
| const origin = window.location.origin; | ||
| const userDomainConfig = options.domainConfigs[origin]; | ||
| if (userDomainConfig) { | ||
| options.getSignature = createDomainSignatureGetter(userDomainConfig); | ||
| globalConfig = options; | ||
| if (options.debug === void 0) options.debug = false; | ||
| if (options.spa === void 0) options.spa = true; | ||
| return; | ||
| } | ||
| } | ||
| const domainConfig = findDomainConfig(); | ||
| if (domainConfig) { | ||
| options.getSignature = createDomainSignatureGetter(domainConfig); | ||
| globalConfig = options; | ||
| if (options.debug === void 0) options.debug = false; | ||
| if (options.spa === void 0) options.spa = true; | ||
| return; | ||
| } | ||
| const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS); | ||
| throw new Error( | ||
| "\u5F53\u524D\u57DF\u540D\u4E0D\u652F\u6301\u5185\u7F6E\u7B7E\u540D\uFF0C\u8BF7\u63D0\u4F9B getSignature \u51FD\u6570\u6216\u914D\u7F6E domainConfigs\u3002\u5185\u7F6E\u7B7E\u540D\u4EC5\u5728\u4EE5\u4E0B\u57DF\u540D\u4E0B\u53EF\u7528\uFF1A" + supportedDomains.join(", ") | ||
| ); | ||
| } | ||
| function getConfig() { | ||
| if (!globalConfig) { | ||
| const domainConfig = findDomainConfig(); | ||
| if (domainConfig) { | ||
| config({}); | ||
| } else { | ||
| const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS); | ||
| throw new Error( | ||
| "\u8BF7\u5148\u8C03\u7528 config() \u8FDB\u884C\u914D\u7F6E\u3002\u5728 " + supportedDomains.join(", ") + " \u57DF\u540D\u4E0B\u53EF\u4EE5\u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u914D\u7F6E\u3002" | ||
| ); | ||
| } | ||
| } | ||
| return globalConfig; | ||
| } | ||
| function isConfigured() { | ||
| return globalConfig !== null; | ||
| } | ||
| // src/sdk.ts | ||
| var sdkInitPromise = null; | ||
| var currentInitUrl = null; | ||
| var entryUrl = null; | ||
| function isWechat() { | ||
| if (typeof navigator === "undefined") return false; | ||
| const ua = navigator.userAgent.toLowerCase(); | ||
| return /micromessenger/.test(ua); | ||
| } | ||
| function isIOSWechat() { | ||
| if (!isWechat()) return false; | ||
| const ua = navigator.userAgent.toLowerCase(); | ||
| return /iphone|ipad|ipod/.test(ua); | ||
| } | ||
| function getSignatureUrl() { | ||
| if (typeof window === "undefined") return ""; | ||
| const currentUrl = window.location.href.split("#")[0]; | ||
| if (isIOSWechat()) { | ||
| if (!entryUrl) { | ||
| entryUrl = currentUrl; | ||
| } | ||
| return entryUrl; | ||
| } | ||
| return currentUrl; | ||
| } | ||
| function getWx() { | ||
| if (typeof window === "undefined") { | ||
| return null; | ||
| } | ||
| if (!isWechat()) { | ||
| return null; | ||
| } | ||
| const wx = window.wx; | ||
| return wx != null ? wx : null; | ||
| } | ||
| function initSDK(jsApiList) { | ||
| return __async(this, null, function* () { | ||
| if (!isWechat()) { | ||
| return; | ||
| } | ||
| const wx = getWx(); | ||
| if (!wx) { | ||
| return; | ||
| } | ||
| const cfg = getConfig(); | ||
| const signatureUrl = getSignatureUrl(); | ||
| const isSpa = cfg.spa !== false; | ||
| if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) { | ||
| return sdkInitPromise; | ||
| } | ||
| currentInitUrl = signatureUrl; | ||
| sdkInitPromise = (() => __async(null, null, function* () { | ||
| const signatureResult = yield cfg.getSignature(signatureUrl); | ||
| return new Promise((resolve, reject) => { | ||
| var _a; | ||
| wx.config({ | ||
| debug: (_a = cfg.debug) != null ? _a : false, | ||
| appId: signatureResult.appId, | ||
| timestamp: signatureResult.timestamp, | ||
| nonceStr: signatureResult.nonceStr, | ||
| signature: signatureResult.signature, | ||
| jsApiList | ||
| }); | ||
| wx.ready(() => { | ||
| resolve(); | ||
| }); | ||
| wx.error((res) => { | ||
| sdkInitPromise = null; | ||
| currentInitUrl = null; | ||
| reject(new Error(`wx.config failed: ${res.errMsg}`)); | ||
| }); | ||
| }); | ||
| }))(); | ||
| return sdkInitPromise; | ||
| }); | ||
| } | ||
| function resetSDK() { | ||
| sdkInitPromise = null; | ||
| currentInitUrl = null; | ||
| entryUrl = null; | ||
| } | ||
| // src/share.ts | ||
| var SHARE_JS_API_LIST = [ | ||
| "updateAppMessageShareData", | ||
| "updateTimelineShareData" | ||
| ]; | ||
| function share(options) { | ||
| return __async(this, null, function* () { | ||
| var _a; | ||
| if (!isWechat()) { | ||
| return; | ||
| } | ||
| yield initSDK(SHARE_JS_API_LIST); | ||
| const wx = getWx(); | ||
| if (!wx) { | ||
| return; | ||
| } | ||
| const link = (_a = options.link) != null ? _a : typeof window !== "undefined" ? window.location.href : ""; | ||
| yield new Promise((resolve, reject) => { | ||
| var _a2; | ||
| wx.updateAppMessageShareData({ | ||
| title: options.title, | ||
| desc: (_a2 = options.desc) != null ? _a2 : "", | ||
| link, | ||
| imgUrl: options.imgUrl, | ||
| success: () => resolve(), | ||
| fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)) | ||
| }); | ||
| setTimeout(resolve, 500); | ||
| }); | ||
| yield new Promise((resolve, reject) => { | ||
| wx.updateTimelineShareData({ | ||
| title: options.title, | ||
| link, | ||
| imgUrl: options.imgUrl, | ||
| success: () => resolve(), | ||
| fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)) | ||
| }); | ||
| setTimeout(resolve, 500); | ||
| }); | ||
| }); | ||
| } | ||
| // src/init.ts | ||
| function init(config2) { | ||
| if (!isWechat()) { | ||
| return Promise.resolve(); | ||
| } | ||
| if (typeof window === "undefined") { | ||
| return Promise.resolve(); | ||
| } | ||
| const wx = window.wx; | ||
| if (!wx) { | ||
| return Promise.resolve(); | ||
| } | ||
| return new Promise((resolve, reject) => { | ||
| var _a; | ||
| wx.config({ | ||
| debug: (_a = config2.debug) != null ? _a : false, | ||
| appId: config2.appId, | ||
| timestamp: config2.timestamp, | ||
| nonceStr: config2.nonceStr, | ||
| signature: config2.signature, | ||
| jsApiList: config2.jsApiList, | ||
| openTagList: config2.openTagList | ||
| }); | ||
| wx.ready(() => { | ||
| resolve(); | ||
| }); | ||
| wx.error((res) => { | ||
| reject(new Error(`init: ${res.errMsg}`)); | ||
| }); | ||
| }); | ||
| } | ||
| exports.config = config; | ||
| exports.getConfig = getConfig; | ||
| exports.getWx = getWx; | ||
| exports.init = init; | ||
| exports.initSDK = initSDK; | ||
| exports.isConfigured = isConfigured; | ||
| exports.isWechat = isWechat; | ||
| exports.resetSDK = resetSDK; | ||
| exports.share = share; | ||
| return exports; | ||
| })({}); | ||
| //# sourceMappingURL=index.global.js.map | ||
| var SohuWechat=(function(exports){'use strict';var R=Object.defineProperty;var x=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var v=(e,n,t)=>n in e?R(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t,S=(e,n)=>{for(var t in n||(n={}))k.call(n,t)&&v(e,t,n[t]);if(x)for(var t of x(n))I.call(n,t)&&v(e,t,n[t]);return e};var l=(e,n,t)=>new Promise((r,i)=>{var o=s=>{try{g(t.next(s));}catch(f){i(f);}},a=s=>{try{g(t.throw(s));}catch(f){i(f);}},g=s=>s.done?r(s.value):Promise.resolve(s.value).then(o,a);g((t=t.apply(e,n)).next());});var C={"https://act.go.sohu.com":{endpoint:"/common/wechat/ticket",urlParamKey:"url"},"https://test.r.ads.sohu.com":{endpoint:"/common/wechat/ticket",urlParamKey:"url"}};function G(e){return l(this,null,function*(){if(typeof fetch!="undefined"){let n=yield fetch(e);if(!n.ok)throw new Error(`Failed to fetch signature: ${n.status} ${n.statusText}`);return yield n.json()}return new Promise((n,t)=>{let r=new XMLHttpRequest;r.open("GET",e,true),r.onload=()=>{if(r.status>=200&&r.status<300)try{let i=JSON.parse(r.responseText);n(i);}catch(i){t(new Error(`Failed to parse response: ${i}`));}else t(new Error(`Failed to fetch signature: ${r.status} ${r.statusText}`));},r.onerror=()=>{t(new Error("Network error occurred"));},r.send();})})}function T(e){if(e.code!==0)throw new Error(`Signature API error: ${e.message}`);return {appId:e.data.app_id,timestamp:e.data.timestamp,nonceStr:e.data.nonce_str,signature:e.data.signature}}function D(e){return n=>l(null,null,function*(){var g,s,f;let t=(g=e.endpoint)!=null?g:"/common/wechat/ticket",r=(s=e.urlParamKey)!=null?s:"url",i=(f=e.transformResponse)!=null?f:T,o=`${t}?${r}=${encodeURIComponent(n)}`,a=yield G(o);return i(a)})}function A(){var e;return S(S({},C),(e=u==null?void 0:u.domainConfigs)!=null?e:{})}function y(){var t;if(typeof window=="undefined")return null;let e=window.location.origin;return (t=A()[e])!=null?t:null}var u=null;function P(e={}){if(e.getSignature){u=e;return}if(e.domainConfigs&&typeof window!="undefined"){let r=window.location.origin,i=e.domainConfigs[r];if(i){e.getSignature=D(i),u=e,e.debug===void 0&&(e.debug=false),e.spa===void 0&&(e.spa=true);return}}let n=y();if(n){e.getSignature=D(n),u=e,e.debug===void 0&&(e.debug=false),e.spa===void 0&&(e.spa=true);return}let t=Object.keys(C);throw new Error("\u5F53\u524D\u57DF\u540D\u4E0D\u652F\u6301\u5185\u7F6E\u7B7E\u540D\uFF0C\u8BF7\u63D0\u4F9B getSignature \u51FD\u6570\u6216\u914D\u7F6E domainConfigs\u3002\u5185\u7F6E\u7B7E\u540D\u4EC5\u5728\u4EE5\u4E0B\u57DF\u540D\u4E0B\u53EF\u7528\uFF1A"+t.join(", "))}function b(){if(!u)if(y())P({});else {let n=Object.keys(C);throw new Error("\u8BF7\u5148\u8C03\u7528 config() \u8FDB\u884C\u914D\u7F6E\u3002\u5728 "+n.join(", ")+" \u57DF\u540D\u4E0B\u53EF\u4EE5\u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u914D\u7F6E\u3002")}return u}function M(){return u!==null}var c=null,p=null,m=null;function d(){if(typeof navigator=="undefined")return false;let e=navigator.userAgent.toLowerCase();return /micromessenger/.test(e)}function E(){if(!d())return false;let e=navigator.userAgent.toLowerCase();return /iphone|ipad|ipod/.test(e)}function K(){if(typeof window=="undefined")return "";let e=window.location.href.split("#")[0];return E()?(m||(m=e),m):e}function w(){if(typeof window=="undefined"||!d())return null;let e=window.wx;return e!=null?e:null}function h(e){return l(this,null,function*(){if(!d())return;let n=w();if(!n)return;let t=b(),r=K(),i=t.spa!==false;return c&&(!i||p===r)||(p=r,c=l(null,null,function*(){let o=yield t.getSignature(r);return new Promise((a,g)=>{var s;n.config({debug:(s=t.debug)!=null?s:false,appId:o.appId,timestamp:o.timestamp,nonceStr:o.nonceStr,signature:o.signature,jsApiList:e}),n.ready(()=>{a();}),n.error(f=>{c=null,p=null,g(new Error(`wx.config failed: ${f.errMsg}`));});})})),c})}function L(){c=null,p=null,m=null;}var U=["updateAppMessageShareData","updateTimelineShareData"];function W(e){return l(this,null,function*(){var r;if(!d())return;yield h(U);let n=w();if(!n)return;let t=(r=e.link)!=null?r:typeof window!="undefined"?window.location.href:"";yield new Promise((i,o)=>{var a;n.updateAppMessageShareData({title:e.title,desc:(a=e.desc)!=null?a:"",link:t,imgUrl:e.imgUrl,success:()=>i(),fail:g=>o(new Error(`updateAppMessageShareData failed: ${g.errMsg}`))}),setTimeout(i,500);}),yield new Promise((i,o)=>{n.updateTimelineShareData({title:e.title,link:t,imgUrl:e.imgUrl,success:()=>i(),fail:a=>o(new Error(`updateTimelineShareData failed: ${a.errMsg}`))}),setTimeout(i,500);});})}function $(e){if(!d()||typeof window=="undefined")return Promise.resolve();let n=window.wx;return n?new Promise((t,r)=>{var i;n.config({debug:(i=e.debug)!=null?i:false,appId:e.appId,timestamp:e.timestamp,nonceStr:e.nonceStr,signature:e.signature,jsApiList:e.jsApiList,openTagList:e.openTagList}),n.ready(()=>{t();}),n.error(o=>{r(new Error(`init: ${o.errMsg}`));});}):Promise.resolve()} | ||
| exports.config=P;exports.getConfig=b;exports.getWx=w;exports.init=$;exports.initSDK=h;exports.isConfigured=M;exports.isWechat=d;exports.resetSDK=L;exports.share=W;return exports;})({});//# sourceMappingURL=index.global.js.map | ||
| //# sourceMappingURL=index.global.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/config.ts","../src/sdk.ts","../src/share.ts","../src/init.ts"],"names":["_a","config"],"mappings":"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","file":"index.global.js","sourcesContent":["/**\n * 微信 JS-SDK 签名参数\n */\nexport interface SignatureResult {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n}\n\n/**\n * 内置签名接口返回值\n */\ninterface BuiltInSignatureResponse {\n code: number\n data: {\n app_id: string\n timestamp: number\n nonce_str: string\n signature: string\n }\n message: string\n}\n\n/**\n * 域名签名配置\n * 用于自定义特定域名下的签名获取行为\n */\nexport interface DomainSignatureConfig {\n /**\n * 签名接口端点路径,默认 '/wechat/ticket'\n * @example '/api/wechat/signature'\n * @example '/custom/sign'\n */\n endpoint?: string\n\n /**\n * URL 参数的 key 名称,默认 'url'\n * @example 'pageUrl'\n * @example 'target'\n */\n urlParamKey?: string\n\n /**\n * 响应格式转换函数\n * 用于将后端返回的自定义格式转换为标准 SignatureResult\n * 如果未提供,将使用默认的 BuiltInSignatureResponse 格式\n * @param response - 后端返回的原始响应\n * @returns 标准签名结果对象\n * @example\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n */\n transformResponse?: (response: any) => SignatureResult\n}\n\n/**\n * 默认的域名签名配置映射\n */\nconst DEFAULT_DOMAIN_CONFIGS: Record<string, DomainSignatureConfig> = {\n 'https://act.go.sohu.com': {\n endpoint: '/wechat/ticket',\n urlParamKey: 'url',\n },\n 'https://test.r.ads.sohu.com': {\n endpoint: '/wechat/ticket',\n urlParamKey: 'url',\n },\n}\n\n/**\n * 发起 HTTP GET 请求,支持 fetch 和 XMLHttpRequest 回退\n * @returns 任意 JSON 响应(由调用者负责类型转换)\n */\nasync function httpGet(url: string): Promise<any> {\n // 优先使用 fetch API\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`)\n }\n\n return await response.json()\n }\n\n // 回退到 XMLHttpRequest\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, true)\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const result = JSON.parse(xhr.responseText)\n resolve(result)\n } catch (error) {\n reject(new Error(`Failed to parse response: ${error}`))\n }\n } else {\n reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred'))\n }\n\n xhr.send()\n })\n}\n\n/**\n * 默认的响应转换函数(用于 Sohu 内置格式)\n */\nfunction defaultTransformResponse(response: BuiltInSignatureResponse): SignatureResult {\n if (response.code !== 0) {\n throw new Error(`Signature API error: ${response.message}`)\n }\n\n return {\n appId: response.data.app_id,\n timestamp: response.data.timestamp,\n nonceStr: response.data.nonce_str,\n signature: response.data.signature,\n }\n}\n\n/**\n * 创建基于域名配置的签名获取函数\n * @param domainConfig - 域名签名配置\n * @returns 签名获取函数\n */\nfunction createDomainSignatureGetter(\n domainConfig: DomainSignatureConfig,\n): (url: string) => Promise<SignatureResult> {\n return async (url: string): Promise<SignatureResult> => {\n const endpoint = domainConfig.endpoint ?? '/wechat/ticket'\n const paramKey = domainConfig.urlParamKey ?? 'url'\n const transform = domainConfig.transformResponse ?? defaultTransformResponse\n\n const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`\n const response = await httpGet(apiUrl)\n\n return transform(response)\n }\n}\n\n/**\n * 获取有效的域名配置(合并用户配置和默认配置)\n */\nfunction getEffectiveDomainConfigs(): Record<string, DomainSignatureConfig> {\n return {\n ...DEFAULT_DOMAIN_CONFIGS,\n ...(globalConfig?.domainConfigs ?? {}),\n }\n}\n\n/**\n * 根据当前域名查找匹配的签名配置\n */\nfunction findDomainConfig(): DomainSignatureConfig | null {\n if (typeof window === 'undefined') return null\n\n const origin = window.location.origin\n const effectiveConfigs = getEffectiveDomainConfigs()\n\n return effectiveConfigs[origin] ?? null\n}\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig {\n /**\n * 获取签名参数的函数,接收当前页面 URL,返回签名参数\n * - 优先级最高,提供此参数将覆盖所有其他签名获取方式\n * - 在内置支持的域名下,此参数可选\n * - 未提供时将尝试使用 domainConfigs 或内置签名获取函数\n */\n getSignature?: (url: string) => Promise<SignatureResult>\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /**\n * 是否为 SPA 单页应用模式,默认 true\n * - true: 每次调用 API 时检测 URL 变化,变化则重新初始化\n * - false: 仅初始化一次\n */\n spa?: boolean\n /**\n * 域名签名配置映射表\n * 键为域名(如 'https://example.com'),值为该域名的签名配置\n * 优先级低于 getSignature,高于内置默认配置\n * @example\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.app_id,\n * timestamp: res.timestamp,\n * nonceStr: res.nonce_str,\n * signature: res.signature\n * })\n * }\n * }\n */\n domainConfigs?: Record<string, DomainSignatureConfig>\n}\n\nlet globalConfig: GlobalConfig | null = null\n\n/**\n * 设置全局配置\n *\n * 配置优先级(从高到低):\n * 1. 自定义 getSignature 函数(完全覆盖所有其他配置)\n * 2. domainConfigs 中匹配当前域名的配置\n * 3. 内置默认配置(act.go.sohu.com、test.r.ads.sohu.com)\n *\n * @param options - 配置选项\n *\n * @example\n * // 示例 1: 使用自定义签名函数(最高优先级)\n * config({\n * getSignature: async (url) => {\n * const res = await fetch(`/api/signature?url=${encodeURIComponent(url)}`)\n * return res.json()\n * }\n * })\n *\n * @example\n * // 示例 2: 为自定义域名配置签名接口\n * config({\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n * }\n * }\n * })\n *\n * @example\n * // 示例 3: 覆盖内置域名的默认配置\n * config({\n * domainConfigs: {\n * 'https://act.go.sohu.com': {\n * endpoint: '/custom/ticket',\n * urlParamKey: 'targetUrl'\n * }\n * }\n * })\n *\n * @example\n * // 示例 4: 在支持的域名下零配置使用\n * config({}) // 或直接调用 share() 等函数,无需 config\n */\nexport function config(options: GlobalConfig = {}): void {\n // Priority 1: 用户提供的 getSignature(最高优先级)\n if (options.getSignature) {\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n return\n }\n\n // Priority 2: 检查用户自定义的 domainConfigs\n if (options.domainConfigs && typeof window !== 'undefined') {\n const origin = window.location.origin\n const userDomainConfig = options.domainConfigs[origin]\n\n if (userDomainConfig) {\n options.getSignature = createDomainSignatureGetter(userDomainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n }\n\n // Priority 3: 尝试使用默认的域名配置\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n options.getSignature = createDomainSignatureGetter(domainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n\n // 没有找到任何可用的配置\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '当前域名不支持内置签名,请提供 getSignature 函数或配置 domainConfigs。' +\n '内置签名仅在以下域名下可用:' +\n supportedDomains.join(', '),\n )\n}\n\n/**\n * 获取全局配置\n * @returns 全局配置,如果未配置则尝试自动初始化(仅在支持的域名下)\n */\nexport function getConfig(): Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig {\n if (!globalConfig) {\n // 尝试自动初始化(如果当前域名有配置)\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n config({})\n } else {\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '请先调用 config() 进行配置。' +\n '在 ' +\n supportedDomains.join(', ') +\n ' 域名下可以自动使用内置配置。',\n )\n }\n }\n return globalConfig as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n}\n\n/**\n * 检查是否已配置\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null\n}\n\n/**\n * 重置配置(仅用于测试)\n * @internal\n */\nexport function resetConfig(): void {\n globalConfig = null\n}\n","import { getConfig } from './config'\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n updateAppMessageShareData: (options: {\n title: string\n desc: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n updateTimelineShareData: (options: {\n title: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n}\n\nlet sdkInitPromise: Promise<void> | null = null\nlet currentInitUrl: string | null = null\nlet entryUrl: string | null = null // iOS 微信需要用首次进入的 URL\n\n/**\n * 检测是否在微信浏览器中\n * @returns 是否在微信浏览器中\n * @example\n * if (isWechat()) {\n * // 执行微信相关操作\n * }\n */\nexport function isWechat(): boolean {\n if (typeof navigator === 'undefined') return false\n const ua = navigator.userAgent.toLowerCase()\n return /micromessenger/.test(ua)\n}\n\n/**\n * 检测是否为 iOS 微信浏览器\n */\nfunction isIOSWechat(): boolean {\n if (!isWechat()) return false\n const ua = navigator.userAgent.toLowerCase()\n return /iphone|ipad|ipod/.test(ua)\n}\n\n/**\n * 获取用于签名的 URL\n * iOS 微信需要用首次进入页面的 URL,Android 用当前 URL\n */\nfunction getSignatureUrl(): string {\n if (typeof window === 'undefined') return ''\n\n const currentUrl = window.location.href.split('#')[0]\n\n if (isIOSWechat()) {\n // iOS 微信:用首次进入的 URL\n if (!entryUrl) {\n entryUrl = currentUrl\n }\n return entryUrl\n }\n\n // Android 或其他:用当前 URL\n return currentUrl\n}\n\n/**\n * 获取 wx 对象\n * 非微信环境或 wx 对象不存在时返回 null\n * @returns wx 对象或 null\n */\nexport function getWx(): WxSDK | null {\n if (typeof window === 'undefined') {\n return null\n }\n if (!isWechat()) {\n return null\n }\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n return wx ?? null\n}\n\n/**\n * 初始化 SDK(获取签名并调用 wx.config)\n * SPA 模式下,URL 变化时会重新初始化(Android)\n * iOS 微信始终使用首次进入的 URL 进行签名\n * 非微信环境中静默返回,不会产生异常\n * 注意:需要使用者在全局引入微信 JS-SDK,确保 window.wx 可用\n */\nexport async function initSDK(jsApiList: string[]): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const cfg = getConfig()\n const signatureUrl = getSignatureUrl()\n const isSpa = cfg.spa !== false // 默认为 true\n\n // 非 SPA 模式或 URL 没有变化,且已经初始化过,直接返回\n if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) {\n return sdkInitPromise\n }\n\n // URL 变化或首次初始化\n currentInitUrl = signatureUrl\n\n sdkInitPromise = (async () => {\n // 获取签名\n const signatureResult = await cfg.getSignature(signatureUrl)\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: cfg.debug ?? false,\n appId: signatureResult.appId,\n timestamp: signatureResult.timestamp,\n nonceStr: signatureResult.nonceStr,\n signature: signatureResult.signature,\n jsApiList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n // 初始化失败,清除缓存以便下次重试\n sdkInitPromise = null\n currentInitUrl = null\n reject(new Error(`wx.config failed: ${res.errMsg}`))\n })\n })\n })()\n\n return sdkInitPromise\n}\n\n/**\n * 重置 SDK 状态(用于测试或强制重新初始化)\n */\nexport function resetSDK(): void {\n sdkInitPromise = null\n currentInitUrl = null\n entryUrl = null\n}\n","import { initSDK, getWx, isWechat } from './sdk'\n\n/**\n * 分享参数\n */\nexport interface ShareOptions {\n /** 分享标题 */\n title: string\n /** 分享描述(分享给朋友时显示) */\n desc?: string\n /** 分享链接,默认为当前页面 URL */\n link?: string\n /** 分享图标 URL */\n imgUrl: string\n}\n\nconst SHARE_JS_API_LIST = [\n 'updateAppMessageShareData',\n 'updateTimelineShareData',\n]\n\n/**\n * 设置微信分享内容\n * 会自动加载 SDK 并初始化,然后设置分享内容\n * 非微信环境中静默返回,不会产生异常\n * @param options - 分享参数\n */\nexport async function share(options: ShareOptions): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n // 确保 SDK 已初始化\n await initSDK(SHARE_JS_API_LIST)\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const link = options.link ?? (typeof window !== 'undefined' ? window.location.href : '')\n\n // 设置分享给朋友\n await new Promise<void>((resolve, reject) => {\n wx.updateAppMessageShareData({\n title: options.title,\n desc: options.desc ?? '',\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n\n // 设置分享到朋友圈\n await new Promise<void>((resolve, reject) => {\n wx.updateTimelineShareData({\n title: options.title,\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n}\n","import { isWechat } from './sdk'\n\n/**\n * 微信 JS-SDK wx.config 所需的配置参数\n */\nexport interface Config {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n /** 需要使用的 JS 接口列表 */\n jsApiList: string[]\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /** 需要使用的开放标签列表 */\n openTagList?: string[]\n}\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n}\n\n/**\n * 初始化微信 JS-SDK,调用 wx.config 并返回 Promise\n * 非微信环境中静默返回,不会产生异常\n * 注意:使用此函数前,需要在 HTML 中提前引入微信 JS-SDK 脚本,确保 window.wx 可用\n * @param config - 微信 JS-SDK 配置参数\n * @returns Promise,ready 时 resolve,error 时 reject 并携带错误信息\n */\nexport function init(config: Config): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return Promise.resolve()\n }\n\n if (typeof window === 'undefined') {\n return Promise.resolve()\n }\n\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n if (!wx) {\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: config.debug ?? false,\n appId: config.appId,\n timestamp: config.timestamp,\n nonceStr: config.nonceStr,\n signature: config.signature,\n jsApiList: config.jsApiList,\n openTagList: config.openTagList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n reject(new Error(`init: ${res.errMsg}`))\n })\n })\n}\n"]} | ||
| {"version":3,"sources":["../src/config.ts","../src/sdk.ts","../src/share.ts","../src/init.ts"],"names":["DEFAULT_DOMAIN_CONFIGS","httpGet","url","__async","response","resolve","reject","xhr","result","error","defaultTransformResponse","createDomainSignatureGetter","domainConfig","_a","_b","_c","endpoint","paramKey","transform","apiUrl","getEffectiveDomainConfigs","__spreadValues","globalConfig","findDomainConfig","origin","config","options","userDomainConfig","supportedDomains","getConfig","isConfigured","sdkInitPromise","currentInitUrl","entryUrl","isWechat","ua","isIOSWechat","getSignatureUrl","currentUrl","getWx","wx","initSDK","jsApiList","cfg","signatureUrl","isSpa","signatureResult","res","resetSDK","SHARE_JS_API_LIST","share","link","err","init"],"mappings":"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","file":"index.global.js","sourcesContent":["/**\n * 微信 JS-SDK 签名参数\n */\nexport interface SignatureResult {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n}\n\n/**\n * 内置签名接口返回值\n */\ninterface BuiltInSignatureResponse {\n code: number\n data: {\n app_id: string\n timestamp: number\n nonce_str: string\n signature: string\n }\n message: string\n}\n\n/**\n * 域名签名配置\n * 用于自定义特定域名下的签名获取行为\n */\nexport interface DomainSignatureConfig {\n /**\n * 签名接口端点路径,默认 '/wechat/ticket'\n * @example '/api/wechat/signature'\n * @example '/custom/sign'\n */\n endpoint?: string\n\n /**\n * URL 参数的 key 名称,默认 'url'\n * @example 'pageUrl'\n * @example 'target'\n */\n urlParamKey?: string\n\n /**\n * 响应格式转换函数\n * 用于将后端返回的自定义格式转换为标准 SignatureResult\n * 如果未提供,将使用默认的 BuiltInSignatureResponse 格式\n * @param response - 后端返回的原始响应\n * @returns 标准签名结果对象\n * @example\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n */\n transformResponse?: (response: any) => SignatureResult\n}\n\n/**\n * 默认的域名签名配置映射\n */\nconst DEFAULT_DOMAIN_CONFIGS: Record<string, DomainSignatureConfig> = {\n 'https://act.go.sohu.com': {\n endpoint: '/common/wechat/ticket',\n urlParamKey: 'url',\n },\n 'https://test.r.ads.sohu.com': {\n endpoint: '/common/wechat/ticket',\n urlParamKey: 'url',\n },\n}\n\n/**\n * 发起 HTTP GET 请求,支持 fetch 和 XMLHttpRequest 回退\n * @returns 任意 JSON 响应(由调用者负责类型转换)\n */\nasync function httpGet(url: string): Promise<any> {\n // 优先使用 fetch API\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`)\n }\n\n return await response.json()\n }\n\n // 回退到 XMLHttpRequest\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, true)\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const result = JSON.parse(xhr.responseText)\n resolve(result)\n } catch (error) {\n reject(new Error(`Failed to parse response: ${error}`))\n }\n } else {\n reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred'))\n }\n\n xhr.send()\n })\n}\n\n/**\n * 默认的响应转换函数(用于 Sohu 内置格式)\n */\nfunction defaultTransformResponse(response: BuiltInSignatureResponse): SignatureResult {\n if (response.code !== 0) {\n throw new Error(`Signature API error: ${response.message}`)\n }\n\n return {\n appId: response.data.app_id,\n timestamp: response.data.timestamp,\n nonceStr: response.data.nonce_str,\n signature: response.data.signature,\n }\n}\n\n/**\n * 创建基于域名配置的签名获取函数\n * @param domainConfig - 域名签名配置\n * @returns 签名获取函数\n */\nfunction createDomainSignatureGetter(\n domainConfig: DomainSignatureConfig,\n): (url: string) => Promise<SignatureResult> {\n return async (url: string): Promise<SignatureResult> => {\n const endpoint = domainConfig.endpoint ?? '/common/wechat/ticket'\n const paramKey = domainConfig.urlParamKey ?? 'url'\n const transform = domainConfig.transformResponse ?? defaultTransformResponse\n\n const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`\n const response = await httpGet(apiUrl)\n\n return transform(response)\n }\n}\n\n/**\n * 获取有效的域名配置(合并用户配置和默认配置)\n */\nfunction getEffectiveDomainConfigs(): Record<string, DomainSignatureConfig> {\n return {\n ...DEFAULT_DOMAIN_CONFIGS,\n ...(globalConfig?.domainConfigs ?? {}),\n }\n}\n\n/**\n * 根据当前域名查找匹配的签名配置\n */\nfunction findDomainConfig(): DomainSignatureConfig | null {\n if (typeof window === 'undefined') return null\n\n const origin = window.location.origin\n const effectiveConfigs = getEffectiveDomainConfigs()\n\n return effectiveConfigs[origin] ?? null\n}\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig {\n /**\n * 获取签名参数的函数,接收当前页面 URL,返回签名参数\n * - 优先级最高,提供此参数将覆盖所有其他签名获取方式\n * - 在内置支持的域名下,此参数可选\n * - 未提供时将尝试使用 domainConfigs 或内置签名获取函数\n */\n getSignature?: (url: string) => Promise<SignatureResult>\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /**\n * 是否为 SPA 单页应用模式,默认 true\n * - true: 每次调用 API 时检测 URL 变化,变化则重新初始化\n * - false: 仅初始化一次\n */\n spa?: boolean\n /**\n * 域名签名配置映射表\n * 键为域名(如 'https://example.com'),值为该域名的签名配置\n * 优先级低于 getSignature,高于内置默认配置\n * @example\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.app_id,\n * timestamp: res.timestamp,\n * nonceStr: res.nonce_str,\n * signature: res.signature\n * })\n * }\n * }\n */\n domainConfigs?: Record<string, DomainSignatureConfig>\n}\n\nlet globalConfig: GlobalConfig | null = null\n\n/**\n * 设置全局配置\n *\n * 配置优先级(从高到低):\n * 1. 自定义 getSignature 函数(完全覆盖所有其他配置)\n * 2. domainConfigs 中匹配当前域名的配置\n * 3. 内置默认配置(act.go.sohu.com、test.r.ads.sohu.com)\n *\n * @param options - 配置选项\n *\n * @example\n * // 示例 1: 使用自定义签名函数(最高优先级)\n * config({\n * getSignature: async (url) => {\n * const res = await fetch(`/api/signature?url=${encodeURIComponent(url)}`)\n * return res.json()\n * }\n * })\n *\n * @example\n * // 示例 2: 为自定义域名配置签名接口\n * config({\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n * }\n * }\n * })\n *\n * @example\n * // 示例 3: 覆盖内置域名的默认配置\n * config({\n * domainConfigs: {\n * 'https://act.go.sohu.com': {\n * endpoint: '/custom/ticket',\n * urlParamKey: 'targetUrl'\n * }\n * }\n * })\n *\n * @example\n * // 示例 4: 在支持的域名下零配置使用\n * config({}) // 或直接调用 share() 等函数,无需 config\n */\nexport function config(options: GlobalConfig = {}): void {\n // Priority 1: 用户提供的 getSignature(最高优先级)\n if (options.getSignature) {\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n return\n }\n\n // Priority 2: 检查用户自定义的 domainConfigs\n if (options.domainConfigs && typeof window !== 'undefined') {\n const origin = window.location.origin\n const userDomainConfig = options.domainConfigs[origin]\n\n if (userDomainConfig) {\n options.getSignature = createDomainSignatureGetter(userDomainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n }\n\n // Priority 3: 尝试使用默认的域名配置\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n options.getSignature = createDomainSignatureGetter(domainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n\n // 没有找到任何可用的配置\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '当前域名不支持内置签名,请提供 getSignature 函数或配置 domainConfigs。' +\n '内置签名仅在以下域名下可用:' +\n supportedDomains.join(', '),\n )\n}\n\n/**\n * 获取全局配置\n * @returns 全局配置,如果未配置则尝试自动初始化(仅在支持的域名下)\n */\nexport function getConfig(): Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig {\n if (!globalConfig) {\n // 尝试自动初始化(如果当前域名有配置)\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n config({})\n } else {\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '请先调用 config() 进行配置。' +\n '在 ' +\n supportedDomains.join(', ') +\n ' 域名下可以自动使用内置配置。',\n )\n }\n }\n return globalConfig as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n}\n\n/**\n * 检查是否已配置\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null\n}\n\n/**\n * 重置配置(仅用于测试)\n * @internal\n */\nexport function resetConfig(): void {\n globalConfig = null\n}\n","import { getConfig } from './config'\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n updateAppMessageShareData: (options: {\n title: string\n desc: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n updateTimelineShareData: (options: {\n title: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n}\n\nlet sdkInitPromise: Promise<void> | null = null\nlet currentInitUrl: string | null = null\nlet entryUrl: string | null = null // iOS 微信需要用首次进入的 URL\n\n/**\n * 检测是否在微信浏览器中\n * @returns 是否在微信浏览器中\n * @example\n * if (isWechat()) {\n * // 执行微信相关操作\n * }\n */\nexport function isWechat(): boolean {\n if (typeof navigator === 'undefined') return false\n const ua = navigator.userAgent.toLowerCase()\n return /micromessenger/.test(ua)\n}\n\n/**\n * 检测是否为 iOS 微信浏览器\n */\nfunction isIOSWechat(): boolean {\n if (!isWechat()) return false\n const ua = navigator.userAgent.toLowerCase()\n return /iphone|ipad|ipod/.test(ua)\n}\n\n/**\n * 获取用于签名的 URL\n * iOS 微信需要用首次进入页面的 URL,Android 用当前 URL\n */\nfunction getSignatureUrl(): string {\n if (typeof window === 'undefined') return ''\n\n const currentUrl = window.location.href.split('#')[0]\n\n if (isIOSWechat()) {\n // iOS 微信:用首次进入的 URL\n if (!entryUrl) {\n entryUrl = currentUrl\n }\n return entryUrl\n }\n\n // Android 或其他:用当前 URL\n return currentUrl\n}\n\n/**\n * 获取 wx 对象\n * 非微信环境或 wx 对象不存在时返回 null\n * @returns wx 对象或 null\n */\nexport function getWx(): WxSDK | null {\n if (typeof window === 'undefined') {\n return null\n }\n if (!isWechat()) {\n return null\n }\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n return wx ?? null\n}\n\n/**\n * 初始化 SDK(获取签名并调用 wx.config)\n * SPA 模式下,URL 变化时会重新初始化(Android)\n * iOS 微信始终使用首次进入的 URL 进行签名\n * 非微信环境中静默返回,不会产生异常\n * 注意:需要使用者在全局引入微信 JS-SDK,确保 window.wx 可用\n */\nexport async function initSDK(jsApiList: string[]): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const cfg = getConfig()\n const signatureUrl = getSignatureUrl()\n const isSpa = cfg.spa !== false // 默认为 true\n\n // 非 SPA 模式或 URL 没有变化,且已经初始化过,直接返回\n if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) {\n return sdkInitPromise\n }\n\n // URL 变化或首次初始化\n currentInitUrl = signatureUrl\n\n sdkInitPromise = (async () => {\n // 获取签名\n const signatureResult = await cfg.getSignature(signatureUrl)\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: cfg.debug ?? false,\n appId: signatureResult.appId,\n timestamp: signatureResult.timestamp,\n nonceStr: signatureResult.nonceStr,\n signature: signatureResult.signature,\n jsApiList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n // 初始化失败,清除缓存以便下次重试\n sdkInitPromise = null\n currentInitUrl = null\n reject(new Error(`wx.config failed: ${res.errMsg}`))\n })\n })\n })()\n\n return sdkInitPromise\n}\n\n/**\n * 重置 SDK 状态(用于测试或强制重新初始化)\n */\nexport function resetSDK(): void {\n sdkInitPromise = null\n currentInitUrl = null\n entryUrl = null\n}\n","import { initSDK, getWx, isWechat } from './sdk'\n\n/**\n * 分享参数\n */\nexport interface ShareOptions {\n /** 分享标题 */\n title: string\n /** 分享描述(分享给朋友时显示) */\n desc?: string\n /** 分享链接,默认为当前页面 URL */\n link?: string\n /** 分享图标 URL */\n imgUrl: string\n}\n\nconst SHARE_JS_API_LIST = [\n 'updateAppMessageShareData',\n 'updateTimelineShareData',\n]\n\n/**\n * 设置微信分享内容\n * 会自动加载 SDK 并初始化,然后设置分享内容\n * 非微信环境中静默返回,不会产生异常\n * @param options - 分享参数\n */\nexport async function share(options: ShareOptions): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n // 确保 SDK 已初始化\n await initSDK(SHARE_JS_API_LIST)\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const link = options.link ?? (typeof window !== 'undefined' ? window.location.href : '')\n\n // 设置分享给朋友\n await new Promise<void>((resolve, reject) => {\n wx.updateAppMessageShareData({\n title: options.title,\n desc: options.desc ?? '',\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n\n // 设置分享到朋友圈\n await new Promise<void>((resolve, reject) => {\n wx.updateTimelineShareData({\n title: options.title,\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n}\n","import { isWechat } from './sdk'\n\n/**\n * 微信 JS-SDK wx.config 所需的配置参数\n */\nexport interface Config {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n /** 需要使用的 JS 接口列表 */\n jsApiList: string[]\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /** 需要使用的开放标签列表 */\n openTagList?: string[]\n}\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n}\n\n/**\n * 初始化微信 JS-SDK,调用 wx.config 并返回 Promise\n * 非微信环境中静默返回,不会产生异常\n * 注意:使用此函数前,需要在 HTML 中提前引入微信 JS-SDK 脚本,确保 window.wx 可用\n * @param config - 微信 JS-SDK 配置参数\n * @returns Promise,ready 时 resolve,error 时 reject 并携带错误信息\n */\nexport function init(config: Config): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return Promise.resolve()\n }\n\n if (typeof window === 'undefined') {\n return Promise.resolve()\n }\n\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n if (!wx) {\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: config.debug ?? false,\n appId: config.appId,\n timestamp: config.timestamp,\n nonceStr: config.nonceStr,\n signature: config.signature,\n jsApiList: config.jsApiList,\n openTagList: config.openTagList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n reject(new Error(`init: ${res.errMsg}`))\n })\n })\n}\n"]} |
+2
-328
@@ -1,329 +0,3 @@ | ||
| 'use strict'; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropSymbols = Object.getOwnPropertySymbols; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __propIsEnum = Object.prototype.propertyIsEnumerable; | ||
| var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
| var __spreadValues = (a, b) => { | ||
| for (var prop in b || (b = {})) | ||
| if (__hasOwnProp.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| if (__getOwnPropSymbols) | ||
| for (var prop of __getOwnPropSymbols(b)) { | ||
| if (__propIsEnum.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| } | ||
| return a; | ||
| }; | ||
| var __async = (__this, __arguments, generator) => { | ||
| return new Promise((resolve, reject) => { | ||
| var fulfilled = (value) => { | ||
| try { | ||
| step(generator.next(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var rejected = (value) => { | ||
| try { | ||
| step(generator.throw(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); | ||
| step((generator = generator.apply(__this, __arguments)).next()); | ||
| }); | ||
| }; | ||
| // src/config.ts | ||
| var DEFAULT_DOMAIN_CONFIGS = { | ||
| "https://act.go.sohu.com": { | ||
| endpoint: "/wechat/ticket", | ||
| urlParamKey: "url" | ||
| }, | ||
| "https://test.r.ads.sohu.com": { | ||
| endpoint: "/wechat/ticket", | ||
| urlParamKey: "url" | ||
| } | ||
| }; | ||
| function httpGet(url) { | ||
| return __async(this, null, function* () { | ||
| if (typeof fetch !== "undefined") { | ||
| const response = yield fetch(url); | ||
| if (!response.ok) { | ||
| throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`); | ||
| } | ||
| return yield response.json(); | ||
| } | ||
| return new Promise((resolve, reject) => { | ||
| const xhr = new XMLHttpRequest(); | ||
| xhr.open("GET", url, true); | ||
| xhr.onload = () => { | ||
| if (xhr.status >= 200 && xhr.status < 300) { | ||
| try { | ||
| const result = JSON.parse(xhr.responseText); | ||
| resolve(result); | ||
| } catch (error) { | ||
| reject(new Error(`Failed to parse response: ${error}`)); | ||
| } | ||
| } else { | ||
| reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`)); | ||
| } | ||
| }; | ||
| xhr.onerror = () => { | ||
| reject(new Error("Network error occurred")); | ||
| }; | ||
| xhr.send(); | ||
| }); | ||
| }); | ||
| } | ||
| function defaultTransformResponse(response) { | ||
| if (response.code !== 0) { | ||
| throw new Error(`Signature API error: ${response.message}`); | ||
| } | ||
| return { | ||
| appId: response.data.app_id, | ||
| timestamp: response.data.timestamp, | ||
| nonceStr: response.data.nonce_str, | ||
| signature: response.data.signature | ||
| }; | ||
| } | ||
| function createDomainSignatureGetter(domainConfig) { | ||
| return (url) => __async(null, null, function* () { | ||
| var _a, _b, _c; | ||
| const endpoint = (_a = domainConfig.endpoint) != null ? _a : "/wechat/ticket"; | ||
| const paramKey = (_b = domainConfig.urlParamKey) != null ? _b : "url"; | ||
| const transform = (_c = domainConfig.transformResponse) != null ? _c : defaultTransformResponse; | ||
| const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`; | ||
| const response = yield httpGet(apiUrl); | ||
| return transform(response); | ||
| }); | ||
| } | ||
| function getEffectiveDomainConfigs() { | ||
| var _a; | ||
| return __spreadValues(__spreadValues({}, DEFAULT_DOMAIN_CONFIGS), (_a = globalConfig == null ? void 0 : globalConfig.domainConfigs) != null ? _a : {}); | ||
| } | ||
| function findDomainConfig() { | ||
| var _a; | ||
| if (typeof window === "undefined") return null; | ||
| const origin = window.location.origin; | ||
| const effectiveConfigs = getEffectiveDomainConfigs(); | ||
| return (_a = effectiveConfigs[origin]) != null ? _a : null; | ||
| } | ||
| var globalConfig = null; | ||
| function config(options = {}) { | ||
| if (options.getSignature) { | ||
| globalConfig = options; | ||
| return; | ||
| } | ||
| if (options.domainConfigs && typeof window !== "undefined") { | ||
| const origin = window.location.origin; | ||
| const userDomainConfig = options.domainConfigs[origin]; | ||
| if (userDomainConfig) { | ||
| options.getSignature = createDomainSignatureGetter(userDomainConfig); | ||
| globalConfig = options; | ||
| if (options.debug === void 0) options.debug = false; | ||
| if (options.spa === void 0) options.spa = true; | ||
| return; | ||
| } | ||
| } | ||
| const domainConfig = findDomainConfig(); | ||
| if (domainConfig) { | ||
| options.getSignature = createDomainSignatureGetter(domainConfig); | ||
| globalConfig = options; | ||
| if (options.debug === void 0) options.debug = false; | ||
| if (options.spa === void 0) options.spa = true; | ||
| return; | ||
| } | ||
| const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS); | ||
| throw new Error( | ||
| "\u5F53\u524D\u57DF\u540D\u4E0D\u652F\u6301\u5185\u7F6E\u7B7E\u540D\uFF0C\u8BF7\u63D0\u4F9B getSignature \u51FD\u6570\u6216\u914D\u7F6E domainConfigs\u3002\u5185\u7F6E\u7B7E\u540D\u4EC5\u5728\u4EE5\u4E0B\u57DF\u540D\u4E0B\u53EF\u7528\uFF1A" + supportedDomains.join(", ") | ||
| ); | ||
| } | ||
| function getConfig() { | ||
| if (!globalConfig) { | ||
| const domainConfig = findDomainConfig(); | ||
| if (domainConfig) { | ||
| config({}); | ||
| } else { | ||
| const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS); | ||
| throw new Error( | ||
| "\u8BF7\u5148\u8C03\u7528 config() \u8FDB\u884C\u914D\u7F6E\u3002\u5728 " + supportedDomains.join(", ") + " \u57DF\u540D\u4E0B\u53EF\u4EE5\u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u914D\u7F6E\u3002" | ||
| ); | ||
| } | ||
| } | ||
| return globalConfig; | ||
| } | ||
| function isConfigured() { | ||
| return globalConfig !== null; | ||
| } | ||
| // src/sdk.ts | ||
| var sdkInitPromise = null; | ||
| var currentInitUrl = null; | ||
| var entryUrl = null; | ||
| function isWechat() { | ||
| if (typeof navigator === "undefined") return false; | ||
| const ua = navigator.userAgent.toLowerCase(); | ||
| return /micromessenger/.test(ua); | ||
| } | ||
| function isIOSWechat() { | ||
| if (!isWechat()) return false; | ||
| const ua = navigator.userAgent.toLowerCase(); | ||
| return /iphone|ipad|ipod/.test(ua); | ||
| } | ||
| function getSignatureUrl() { | ||
| if (typeof window === "undefined") return ""; | ||
| const currentUrl = window.location.href.split("#")[0]; | ||
| if (isIOSWechat()) { | ||
| if (!entryUrl) { | ||
| entryUrl = currentUrl; | ||
| } | ||
| return entryUrl; | ||
| } | ||
| return currentUrl; | ||
| } | ||
| function getWx() { | ||
| if (typeof window === "undefined") { | ||
| return null; | ||
| } | ||
| if (!isWechat()) { | ||
| return null; | ||
| } | ||
| const wx = window.wx; | ||
| return wx != null ? wx : null; | ||
| } | ||
| function initSDK(jsApiList) { | ||
| return __async(this, null, function* () { | ||
| if (!isWechat()) { | ||
| return; | ||
| } | ||
| const wx = getWx(); | ||
| if (!wx) { | ||
| return; | ||
| } | ||
| const cfg = getConfig(); | ||
| const signatureUrl = getSignatureUrl(); | ||
| const isSpa = cfg.spa !== false; | ||
| if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) { | ||
| return sdkInitPromise; | ||
| } | ||
| currentInitUrl = signatureUrl; | ||
| sdkInitPromise = (() => __async(null, null, function* () { | ||
| const signatureResult = yield cfg.getSignature(signatureUrl); | ||
| return new Promise((resolve, reject) => { | ||
| var _a; | ||
| wx.config({ | ||
| debug: (_a = cfg.debug) != null ? _a : false, | ||
| appId: signatureResult.appId, | ||
| timestamp: signatureResult.timestamp, | ||
| nonceStr: signatureResult.nonceStr, | ||
| signature: signatureResult.signature, | ||
| jsApiList | ||
| }); | ||
| wx.ready(() => { | ||
| resolve(); | ||
| }); | ||
| wx.error((res) => { | ||
| sdkInitPromise = null; | ||
| currentInitUrl = null; | ||
| reject(new Error(`wx.config failed: ${res.errMsg}`)); | ||
| }); | ||
| }); | ||
| }))(); | ||
| return sdkInitPromise; | ||
| }); | ||
| } | ||
| function resetSDK() { | ||
| sdkInitPromise = null; | ||
| currentInitUrl = null; | ||
| entryUrl = null; | ||
| } | ||
| // src/share.ts | ||
| var SHARE_JS_API_LIST = [ | ||
| "updateAppMessageShareData", | ||
| "updateTimelineShareData" | ||
| ]; | ||
| function share(options) { | ||
| return __async(this, null, function* () { | ||
| var _a; | ||
| if (!isWechat()) { | ||
| return; | ||
| } | ||
| yield initSDK(SHARE_JS_API_LIST); | ||
| const wx = getWx(); | ||
| if (!wx) { | ||
| return; | ||
| } | ||
| const link = (_a = options.link) != null ? _a : typeof window !== "undefined" ? window.location.href : ""; | ||
| yield new Promise((resolve, reject) => { | ||
| var _a2; | ||
| wx.updateAppMessageShareData({ | ||
| title: options.title, | ||
| desc: (_a2 = options.desc) != null ? _a2 : "", | ||
| link, | ||
| imgUrl: options.imgUrl, | ||
| success: () => resolve(), | ||
| fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)) | ||
| }); | ||
| setTimeout(resolve, 500); | ||
| }); | ||
| yield new Promise((resolve, reject) => { | ||
| wx.updateTimelineShareData({ | ||
| title: options.title, | ||
| link, | ||
| imgUrl: options.imgUrl, | ||
| success: () => resolve(), | ||
| fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)) | ||
| }); | ||
| setTimeout(resolve, 500); | ||
| }); | ||
| }); | ||
| } | ||
| // src/init.ts | ||
| function init(config2) { | ||
| if (!isWechat()) { | ||
| return Promise.resolve(); | ||
| } | ||
| if (typeof window === "undefined") { | ||
| return Promise.resolve(); | ||
| } | ||
| const wx = window.wx; | ||
| if (!wx) { | ||
| return Promise.resolve(); | ||
| } | ||
| return new Promise((resolve, reject) => { | ||
| var _a; | ||
| wx.config({ | ||
| debug: (_a = config2.debug) != null ? _a : false, | ||
| appId: config2.appId, | ||
| timestamp: config2.timestamp, | ||
| nonceStr: config2.nonceStr, | ||
| signature: config2.signature, | ||
| jsApiList: config2.jsApiList, | ||
| openTagList: config2.openTagList | ||
| }); | ||
| wx.ready(() => { | ||
| resolve(); | ||
| }); | ||
| wx.error((res) => { | ||
| reject(new Error(`init: ${res.errMsg}`)); | ||
| }); | ||
| }); | ||
| } | ||
| exports.config = config; | ||
| exports.getConfig = getConfig; | ||
| exports.getWx = getWx; | ||
| exports.init = init; | ||
| exports.initSDK = initSDK; | ||
| exports.isConfigured = isConfigured; | ||
| exports.isWechat = isWechat; | ||
| exports.resetSDK = resetSDK; | ||
| exports.share = share; | ||
| //# sourceMappingURL=index.js.map | ||
| 'use strict';var R=Object.defineProperty;var x=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var v=(e,n,t)=>n in e?R(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t,S=(e,n)=>{for(var t in n||(n={}))k.call(n,t)&&v(e,t,n[t]);if(x)for(var t of x(n))I.call(n,t)&&v(e,t,n[t]);return e};var l=(e,n,t)=>new Promise((r,i)=>{var o=s=>{try{g(t.next(s));}catch(f){i(f);}},a=s=>{try{g(t.throw(s));}catch(f){i(f);}},g=s=>s.done?r(s.value):Promise.resolve(s.value).then(o,a);g((t=t.apply(e,n)).next());});var C={"https://act.go.sohu.com":{endpoint:"/common/wechat/ticket",urlParamKey:"url"},"https://test.r.ads.sohu.com":{endpoint:"/common/wechat/ticket",urlParamKey:"url"}};function G(e){return l(this,null,function*(){if(typeof fetch!="undefined"){let n=yield fetch(e);if(!n.ok)throw new Error(`Failed to fetch signature: ${n.status} ${n.statusText}`);return yield n.json()}return new Promise((n,t)=>{let r=new XMLHttpRequest;r.open("GET",e,true),r.onload=()=>{if(r.status>=200&&r.status<300)try{let i=JSON.parse(r.responseText);n(i);}catch(i){t(new Error(`Failed to parse response: ${i}`));}else t(new Error(`Failed to fetch signature: ${r.status} ${r.statusText}`));},r.onerror=()=>{t(new Error("Network error occurred"));},r.send();})})}function T(e){if(e.code!==0)throw new Error(`Signature API error: ${e.message}`);return {appId:e.data.app_id,timestamp:e.data.timestamp,nonceStr:e.data.nonce_str,signature:e.data.signature}}function D(e){return n=>l(null,null,function*(){var g,s,f;let t=(g=e.endpoint)!=null?g:"/common/wechat/ticket",r=(s=e.urlParamKey)!=null?s:"url",i=(f=e.transformResponse)!=null?f:T,o=`${t}?${r}=${encodeURIComponent(n)}`,a=yield G(o);return i(a)})}function A(){var e;return S(S({},C),(e=u==null?void 0:u.domainConfigs)!=null?e:{})}function y(){var t;if(typeof window=="undefined")return null;let e=window.location.origin;return (t=A()[e])!=null?t:null}var u=null;function P(e={}){if(e.getSignature){u=e;return}if(e.domainConfigs&&typeof window!="undefined"){let r=window.location.origin,i=e.domainConfigs[r];if(i){e.getSignature=D(i),u=e,e.debug===void 0&&(e.debug=false),e.spa===void 0&&(e.spa=true);return}}let n=y();if(n){e.getSignature=D(n),u=e,e.debug===void 0&&(e.debug=false),e.spa===void 0&&(e.spa=true);return}let t=Object.keys(C);throw new Error("\u5F53\u524D\u57DF\u540D\u4E0D\u652F\u6301\u5185\u7F6E\u7B7E\u540D\uFF0C\u8BF7\u63D0\u4F9B getSignature \u51FD\u6570\u6216\u914D\u7F6E domainConfigs\u3002\u5185\u7F6E\u7B7E\u540D\u4EC5\u5728\u4EE5\u4E0B\u57DF\u540D\u4E0B\u53EF\u7528\uFF1A"+t.join(", "))}function b(){if(!u)if(y())P({});else {let n=Object.keys(C);throw new Error("\u8BF7\u5148\u8C03\u7528 config() \u8FDB\u884C\u914D\u7F6E\u3002\u5728 "+n.join(", ")+" \u57DF\u540D\u4E0B\u53EF\u4EE5\u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u914D\u7F6E\u3002")}return u}function M(){return u!==null}var c=null,p=null,m=null;function d(){if(typeof navigator=="undefined")return false;let e=navigator.userAgent.toLowerCase();return /micromessenger/.test(e)}function E(){if(!d())return false;let e=navigator.userAgent.toLowerCase();return /iphone|ipad|ipod/.test(e)}function K(){if(typeof window=="undefined")return "";let e=window.location.href.split("#")[0];return E()?(m||(m=e),m):e}function w(){if(typeof window=="undefined"||!d())return null;let e=window.wx;return e!=null?e:null}function h(e){return l(this,null,function*(){if(!d())return;let n=w();if(!n)return;let t=b(),r=K(),i=t.spa!==false;return c&&(!i||p===r)||(p=r,c=l(null,null,function*(){let o=yield t.getSignature(r);return new Promise((a,g)=>{var s;n.config({debug:(s=t.debug)!=null?s:false,appId:o.appId,timestamp:o.timestamp,nonceStr:o.nonceStr,signature:o.signature,jsApiList:e}),n.ready(()=>{a();}),n.error(f=>{c=null,p=null,g(new Error(`wx.config failed: ${f.errMsg}`));});})})),c})}function L(){c=null,p=null,m=null;}var U=["updateAppMessageShareData","updateTimelineShareData"];function W(e){return l(this,null,function*(){var r;if(!d())return;yield h(U);let n=w();if(!n)return;let t=(r=e.link)!=null?r:typeof window!="undefined"?window.location.href:"";yield new Promise((i,o)=>{var a;n.updateAppMessageShareData({title:e.title,desc:(a=e.desc)!=null?a:"",link:t,imgUrl:e.imgUrl,success:()=>i(),fail:g=>o(new Error(`updateAppMessageShareData failed: ${g.errMsg}`))}),setTimeout(i,500);}),yield new Promise((i,o)=>{n.updateTimelineShareData({title:e.title,link:t,imgUrl:e.imgUrl,success:()=>i(),fail:a=>o(new Error(`updateTimelineShareData failed: ${a.errMsg}`))}),setTimeout(i,500);});})}function $(e){if(!d()||typeof window=="undefined")return Promise.resolve();let n=window.wx;return n?new Promise((t,r)=>{var i;n.config({debug:(i=e.debug)!=null?i:false,appId:e.appId,timestamp:e.timestamp,nonceStr:e.nonceStr,signature:e.signature,jsApiList:e.jsApiList,openTagList:e.openTagList}),n.ready(()=>{t();}),n.error(o=>{r(new Error(`init: ${o.errMsg}`));});}):Promise.resolve()} | ||
| exports.config=P;exports.getConfig=b;exports.getWx=w;exports.init=$;exports.initSDK=h;exports.isConfigured=M;exports.isWechat=d;exports.resetSDK=L;exports.share=W;//# sourceMappingURL=index.js.map | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/config.ts","../src/sdk.ts","../src/share.ts","../src/init.ts"],"names":["_a","config"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 微信 JS-SDK 签名参数\n */\nexport interface SignatureResult {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n}\n\n/**\n * 内置签名接口返回值\n */\ninterface BuiltInSignatureResponse {\n code: number\n data: {\n app_id: string\n timestamp: number\n nonce_str: string\n signature: string\n }\n message: string\n}\n\n/**\n * 域名签名配置\n * 用于自定义特定域名下的签名获取行为\n */\nexport interface DomainSignatureConfig {\n /**\n * 签名接口端点路径,默认 '/wechat/ticket'\n * @example '/api/wechat/signature'\n * @example '/custom/sign'\n */\n endpoint?: string\n\n /**\n * URL 参数的 key 名称,默认 'url'\n * @example 'pageUrl'\n * @example 'target'\n */\n urlParamKey?: string\n\n /**\n * 响应格式转换函数\n * 用于将后端返回的自定义格式转换为标准 SignatureResult\n * 如果未提供,将使用默认的 BuiltInSignatureResponse 格式\n * @param response - 后端返回的原始响应\n * @returns 标准签名结果对象\n * @example\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n */\n transformResponse?: (response: any) => SignatureResult\n}\n\n/**\n * 默认的域名签名配置映射\n */\nconst DEFAULT_DOMAIN_CONFIGS: Record<string, DomainSignatureConfig> = {\n 'https://act.go.sohu.com': {\n endpoint: '/wechat/ticket',\n urlParamKey: 'url',\n },\n 'https://test.r.ads.sohu.com': {\n endpoint: '/wechat/ticket',\n urlParamKey: 'url',\n },\n}\n\n/**\n * 发起 HTTP GET 请求,支持 fetch 和 XMLHttpRequest 回退\n * @returns 任意 JSON 响应(由调用者负责类型转换)\n */\nasync function httpGet(url: string): Promise<any> {\n // 优先使用 fetch API\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`)\n }\n\n return await response.json()\n }\n\n // 回退到 XMLHttpRequest\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, true)\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const result = JSON.parse(xhr.responseText)\n resolve(result)\n } catch (error) {\n reject(new Error(`Failed to parse response: ${error}`))\n }\n } else {\n reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred'))\n }\n\n xhr.send()\n })\n}\n\n/**\n * 默认的响应转换函数(用于 Sohu 内置格式)\n */\nfunction defaultTransformResponse(response: BuiltInSignatureResponse): SignatureResult {\n if (response.code !== 0) {\n throw new Error(`Signature API error: ${response.message}`)\n }\n\n return {\n appId: response.data.app_id,\n timestamp: response.data.timestamp,\n nonceStr: response.data.nonce_str,\n signature: response.data.signature,\n }\n}\n\n/**\n * 创建基于域名配置的签名获取函数\n * @param domainConfig - 域名签名配置\n * @returns 签名获取函数\n */\nfunction createDomainSignatureGetter(\n domainConfig: DomainSignatureConfig,\n): (url: string) => Promise<SignatureResult> {\n return async (url: string): Promise<SignatureResult> => {\n const endpoint = domainConfig.endpoint ?? '/wechat/ticket'\n const paramKey = domainConfig.urlParamKey ?? 'url'\n const transform = domainConfig.transformResponse ?? defaultTransformResponse\n\n const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`\n const response = await httpGet(apiUrl)\n\n return transform(response)\n }\n}\n\n/**\n * 获取有效的域名配置(合并用户配置和默认配置)\n */\nfunction getEffectiveDomainConfigs(): Record<string, DomainSignatureConfig> {\n return {\n ...DEFAULT_DOMAIN_CONFIGS,\n ...(globalConfig?.domainConfigs ?? {}),\n }\n}\n\n/**\n * 根据当前域名查找匹配的签名配置\n */\nfunction findDomainConfig(): DomainSignatureConfig | null {\n if (typeof window === 'undefined') return null\n\n const origin = window.location.origin\n const effectiveConfigs = getEffectiveDomainConfigs()\n\n return effectiveConfigs[origin] ?? null\n}\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig {\n /**\n * 获取签名参数的函数,接收当前页面 URL,返回签名参数\n * - 优先级最高,提供此参数将覆盖所有其他签名获取方式\n * - 在内置支持的域名下,此参数可选\n * - 未提供时将尝试使用 domainConfigs 或内置签名获取函数\n */\n getSignature?: (url: string) => Promise<SignatureResult>\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /**\n * 是否为 SPA 单页应用模式,默认 true\n * - true: 每次调用 API 时检测 URL 变化,变化则重新初始化\n * - false: 仅初始化一次\n */\n spa?: boolean\n /**\n * 域名签名配置映射表\n * 键为域名(如 'https://example.com'),值为该域名的签名配置\n * 优先级低于 getSignature,高于内置默认配置\n * @example\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.app_id,\n * timestamp: res.timestamp,\n * nonceStr: res.nonce_str,\n * signature: res.signature\n * })\n * }\n * }\n */\n domainConfigs?: Record<string, DomainSignatureConfig>\n}\n\nlet globalConfig: GlobalConfig | null = null\n\n/**\n * 设置全局配置\n *\n * 配置优先级(从高到低):\n * 1. 自定义 getSignature 函数(完全覆盖所有其他配置)\n * 2. domainConfigs 中匹配当前域名的配置\n * 3. 内置默认配置(act.go.sohu.com、test.r.ads.sohu.com)\n *\n * @param options - 配置选项\n *\n * @example\n * // 示例 1: 使用自定义签名函数(最高优先级)\n * config({\n * getSignature: async (url) => {\n * const res = await fetch(`/api/signature?url=${encodeURIComponent(url)}`)\n * return res.json()\n * }\n * })\n *\n * @example\n * // 示例 2: 为自定义域名配置签名接口\n * config({\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n * }\n * }\n * })\n *\n * @example\n * // 示例 3: 覆盖内置域名的默认配置\n * config({\n * domainConfigs: {\n * 'https://act.go.sohu.com': {\n * endpoint: '/custom/ticket',\n * urlParamKey: 'targetUrl'\n * }\n * }\n * })\n *\n * @example\n * // 示例 4: 在支持的域名下零配置使用\n * config({}) // 或直接调用 share() 等函数,无需 config\n */\nexport function config(options: GlobalConfig = {}): void {\n // Priority 1: 用户提供的 getSignature(最高优先级)\n if (options.getSignature) {\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n return\n }\n\n // Priority 2: 检查用户自定义的 domainConfigs\n if (options.domainConfigs && typeof window !== 'undefined') {\n const origin = window.location.origin\n const userDomainConfig = options.domainConfigs[origin]\n\n if (userDomainConfig) {\n options.getSignature = createDomainSignatureGetter(userDomainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n }\n\n // Priority 3: 尝试使用默认的域名配置\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n options.getSignature = createDomainSignatureGetter(domainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n\n // 没有找到任何可用的配置\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '当前域名不支持内置签名,请提供 getSignature 函数或配置 domainConfigs。' +\n '内置签名仅在以下域名下可用:' +\n supportedDomains.join(', '),\n )\n}\n\n/**\n * 获取全局配置\n * @returns 全局配置,如果未配置则尝试自动初始化(仅在支持的域名下)\n */\nexport function getConfig(): Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig {\n if (!globalConfig) {\n // 尝试自动初始化(如果当前域名有配置)\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n config({})\n } else {\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '请先调用 config() 进行配置。' +\n '在 ' +\n supportedDomains.join(', ') +\n ' 域名下可以自动使用内置配置。',\n )\n }\n }\n return globalConfig as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n}\n\n/**\n * 检查是否已配置\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null\n}\n\n/**\n * 重置配置(仅用于测试)\n * @internal\n */\nexport function resetConfig(): void {\n globalConfig = null\n}\n","import { getConfig } from './config'\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n updateAppMessageShareData: (options: {\n title: string\n desc: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n updateTimelineShareData: (options: {\n title: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n}\n\nlet sdkInitPromise: Promise<void> | null = null\nlet currentInitUrl: string | null = null\nlet entryUrl: string | null = null // iOS 微信需要用首次进入的 URL\n\n/**\n * 检测是否在微信浏览器中\n * @returns 是否在微信浏览器中\n * @example\n * if (isWechat()) {\n * // 执行微信相关操作\n * }\n */\nexport function isWechat(): boolean {\n if (typeof navigator === 'undefined') return false\n const ua = navigator.userAgent.toLowerCase()\n return /micromessenger/.test(ua)\n}\n\n/**\n * 检测是否为 iOS 微信浏览器\n */\nfunction isIOSWechat(): boolean {\n if (!isWechat()) return false\n const ua = navigator.userAgent.toLowerCase()\n return /iphone|ipad|ipod/.test(ua)\n}\n\n/**\n * 获取用于签名的 URL\n * iOS 微信需要用首次进入页面的 URL,Android 用当前 URL\n */\nfunction getSignatureUrl(): string {\n if (typeof window === 'undefined') return ''\n\n const currentUrl = window.location.href.split('#')[0]\n\n if (isIOSWechat()) {\n // iOS 微信:用首次进入的 URL\n if (!entryUrl) {\n entryUrl = currentUrl\n }\n return entryUrl\n }\n\n // Android 或其他:用当前 URL\n return currentUrl\n}\n\n/**\n * 获取 wx 对象\n * 非微信环境或 wx 对象不存在时返回 null\n * @returns wx 对象或 null\n */\nexport function getWx(): WxSDK | null {\n if (typeof window === 'undefined') {\n return null\n }\n if (!isWechat()) {\n return null\n }\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n return wx ?? null\n}\n\n/**\n * 初始化 SDK(获取签名并调用 wx.config)\n * SPA 模式下,URL 变化时会重新初始化(Android)\n * iOS 微信始终使用首次进入的 URL 进行签名\n * 非微信环境中静默返回,不会产生异常\n * 注意:需要使用者在全局引入微信 JS-SDK,确保 window.wx 可用\n */\nexport async function initSDK(jsApiList: string[]): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const cfg = getConfig()\n const signatureUrl = getSignatureUrl()\n const isSpa = cfg.spa !== false // 默认为 true\n\n // 非 SPA 模式或 URL 没有变化,且已经初始化过,直接返回\n if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) {\n return sdkInitPromise\n }\n\n // URL 变化或首次初始化\n currentInitUrl = signatureUrl\n\n sdkInitPromise = (async () => {\n // 获取签名\n const signatureResult = await cfg.getSignature(signatureUrl)\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: cfg.debug ?? false,\n appId: signatureResult.appId,\n timestamp: signatureResult.timestamp,\n nonceStr: signatureResult.nonceStr,\n signature: signatureResult.signature,\n jsApiList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n // 初始化失败,清除缓存以便下次重试\n sdkInitPromise = null\n currentInitUrl = null\n reject(new Error(`wx.config failed: ${res.errMsg}`))\n })\n })\n })()\n\n return sdkInitPromise\n}\n\n/**\n * 重置 SDK 状态(用于测试或强制重新初始化)\n */\nexport function resetSDK(): void {\n sdkInitPromise = null\n currentInitUrl = null\n entryUrl = null\n}\n","import { initSDK, getWx, isWechat } from './sdk'\n\n/**\n * 分享参数\n */\nexport interface ShareOptions {\n /** 分享标题 */\n title: string\n /** 分享描述(分享给朋友时显示) */\n desc?: string\n /** 分享链接,默认为当前页面 URL */\n link?: string\n /** 分享图标 URL */\n imgUrl: string\n}\n\nconst SHARE_JS_API_LIST = [\n 'updateAppMessageShareData',\n 'updateTimelineShareData',\n]\n\n/**\n * 设置微信分享内容\n * 会自动加载 SDK 并初始化,然后设置分享内容\n * 非微信环境中静默返回,不会产生异常\n * @param options - 分享参数\n */\nexport async function share(options: ShareOptions): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n // 确保 SDK 已初始化\n await initSDK(SHARE_JS_API_LIST)\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const link = options.link ?? (typeof window !== 'undefined' ? window.location.href : '')\n\n // 设置分享给朋友\n await new Promise<void>((resolve, reject) => {\n wx.updateAppMessageShareData({\n title: options.title,\n desc: options.desc ?? '',\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n\n // 设置分享到朋友圈\n await new Promise<void>((resolve, reject) => {\n wx.updateTimelineShareData({\n title: options.title,\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n}\n","import { isWechat } from './sdk'\n\n/**\n * 微信 JS-SDK wx.config 所需的配置参数\n */\nexport interface Config {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n /** 需要使用的 JS 接口列表 */\n jsApiList: string[]\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /** 需要使用的开放标签列表 */\n openTagList?: string[]\n}\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n}\n\n/**\n * 初始化微信 JS-SDK,调用 wx.config 并返回 Promise\n * 非微信环境中静默返回,不会产生异常\n * 注意:使用此函数前,需要在 HTML 中提前引入微信 JS-SDK 脚本,确保 window.wx 可用\n * @param config - 微信 JS-SDK 配置参数\n * @returns Promise,ready 时 resolve,error 时 reject 并携带错误信息\n */\nexport function init(config: Config): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return Promise.resolve()\n }\n\n if (typeof window === 'undefined') {\n return Promise.resolve()\n }\n\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n if (!wx) {\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: config.debug ?? false,\n appId: config.appId,\n timestamp: config.timestamp,\n nonceStr: config.nonceStr,\n signature: config.signature,\n jsApiList: config.jsApiList,\n openTagList: config.openTagList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n reject(new Error(`init: ${res.errMsg}`))\n })\n })\n}\n"]} | ||
| {"version":3,"sources":["../src/config.ts","../src/sdk.ts","../src/share.ts","../src/init.ts"],"names":["DEFAULT_DOMAIN_CONFIGS","httpGet","url","__async","response","resolve","reject","xhr","result","error","defaultTransformResponse","createDomainSignatureGetter","domainConfig","_a","_b","_c","endpoint","paramKey","transform","apiUrl","getEffectiveDomainConfigs","__spreadValues","globalConfig","findDomainConfig","origin","config","options","userDomainConfig","supportedDomains","getConfig","isConfigured","sdkInitPromise","currentInitUrl","entryUrl","isWechat","ua","isIOSWechat","getSignatureUrl","currentUrl","getWx","wx","initSDK","jsApiList","cfg","signatureUrl","isSpa","signatureResult","res","resetSDK","SHARE_JS_API_LIST","share","link","err","init"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 微信 JS-SDK 签名参数\n */\nexport interface SignatureResult {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n}\n\n/**\n * 内置签名接口返回值\n */\ninterface BuiltInSignatureResponse {\n code: number\n data: {\n app_id: string\n timestamp: number\n nonce_str: string\n signature: string\n }\n message: string\n}\n\n/**\n * 域名签名配置\n * 用于自定义特定域名下的签名获取行为\n */\nexport interface DomainSignatureConfig {\n /**\n * 签名接口端点路径,默认 '/wechat/ticket'\n * @example '/api/wechat/signature'\n * @example '/custom/sign'\n */\n endpoint?: string\n\n /**\n * URL 参数的 key 名称,默认 'url'\n * @example 'pageUrl'\n * @example 'target'\n */\n urlParamKey?: string\n\n /**\n * 响应格式转换函数\n * 用于将后端返回的自定义格式转换为标准 SignatureResult\n * 如果未提供,将使用默认的 BuiltInSignatureResponse 格式\n * @param response - 后端返回的原始响应\n * @returns 标准签名结果对象\n * @example\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n */\n transformResponse?: (response: any) => SignatureResult\n}\n\n/**\n * 默认的域名签名配置映射\n */\nconst DEFAULT_DOMAIN_CONFIGS: Record<string, DomainSignatureConfig> = {\n 'https://act.go.sohu.com': {\n endpoint: '/common/wechat/ticket',\n urlParamKey: 'url',\n },\n 'https://test.r.ads.sohu.com': {\n endpoint: '/common/wechat/ticket',\n urlParamKey: 'url',\n },\n}\n\n/**\n * 发起 HTTP GET 请求,支持 fetch 和 XMLHttpRequest 回退\n * @returns 任意 JSON 响应(由调用者负责类型转换)\n */\nasync function httpGet(url: string): Promise<any> {\n // 优先使用 fetch API\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`)\n }\n\n return await response.json()\n }\n\n // 回退到 XMLHttpRequest\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, true)\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const result = JSON.parse(xhr.responseText)\n resolve(result)\n } catch (error) {\n reject(new Error(`Failed to parse response: ${error}`))\n }\n } else {\n reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred'))\n }\n\n xhr.send()\n })\n}\n\n/**\n * 默认的响应转换函数(用于 Sohu 内置格式)\n */\nfunction defaultTransformResponse(response: BuiltInSignatureResponse): SignatureResult {\n if (response.code !== 0) {\n throw new Error(`Signature API error: ${response.message}`)\n }\n\n return {\n appId: response.data.app_id,\n timestamp: response.data.timestamp,\n nonceStr: response.data.nonce_str,\n signature: response.data.signature,\n }\n}\n\n/**\n * 创建基于域名配置的签名获取函数\n * @param domainConfig - 域名签名配置\n * @returns 签名获取函数\n */\nfunction createDomainSignatureGetter(\n domainConfig: DomainSignatureConfig,\n): (url: string) => Promise<SignatureResult> {\n return async (url: string): Promise<SignatureResult> => {\n const endpoint = domainConfig.endpoint ?? '/common/wechat/ticket'\n const paramKey = domainConfig.urlParamKey ?? 'url'\n const transform = domainConfig.transformResponse ?? defaultTransformResponse\n\n const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`\n const response = await httpGet(apiUrl)\n\n return transform(response)\n }\n}\n\n/**\n * 获取有效的域名配置(合并用户配置和默认配置)\n */\nfunction getEffectiveDomainConfigs(): Record<string, DomainSignatureConfig> {\n return {\n ...DEFAULT_DOMAIN_CONFIGS,\n ...(globalConfig?.domainConfigs ?? {}),\n }\n}\n\n/**\n * 根据当前域名查找匹配的签名配置\n */\nfunction findDomainConfig(): DomainSignatureConfig | null {\n if (typeof window === 'undefined') return null\n\n const origin = window.location.origin\n const effectiveConfigs = getEffectiveDomainConfigs()\n\n return effectiveConfigs[origin] ?? null\n}\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig {\n /**\n * 获取签名参数的函数,接收当前页面 URL,返回签名参数\n * - 优先级最高,提供此参数将覆盖所有其他签名获取方式\n * - 在内置支持的域名下,此参数可选\n * - 未提供时将尝试使用 domainConfigs 或内置签名获取函数\n */\n getSignature?: (url: string) => Promise<SignatureResult>\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /**\n * 是否为 SPA 单页应用模式,默认 true\n * - true: 每次调用 API 时检测 URL 变化,变化则重新初始化\n * - false: 仅初始化一次\n */\n spa?: boolean\n /**\n * 域名签名配置映射表\n * 键为域名(如 'https://example.com'),值为该域名的签名配置\n * 优先级低于 getSignature,高于内置默认配置\n * @example\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.app_id,\n * timestamp: res.timestamp,\n * nonceStr: res.nonce_str,\n * signature: res.signature\n * })\n * }\n * }\n */\n domainConfigs?: Record<string, DomainSignatureConfig>\n}\n\nlet globalConfig: GlobalConfig | null = null\n\n/**\n * 设置全局配置\n *\n * 配置优先级(从高到低):\n * 1. 自定义 getSignature 函数(完全覆盖所有其他配置)\n * 2. domainConfigs 中匹配当前域名的配置\n * 3. 内置默认配置(act.go.sohu.com、test.r.ads.sohu.com)\n *\n * @param options - 配置选项\n *\n * @example\n * // 示例 1: 使用自定义签名函数(最高优先级)\n * config({\n * getSignature: async (url) => {\n * const res = await fetch(`/api/signature?url=${encodeURIComponent(url)}`)\n * return res.json()\n * }\n * })\n *\n * @example\n * // 示例 2: 为自定义域名配置签名接口\n * config({\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n * }\n * }\n * })\n *\n * @example\n * // 示例 3: 覆盖内置域名的默认配置\n * config({\n * domainConfigs: {\n * 'https://act.go.sohu.com': {\n * endpoint: '/custom/ticket',\n * urlParamKey: 'targetUrl'\n * }\n * }\n * })\n *\n * @example\n * // 示例 4: 在支持的域名下零配置使用\n * config({}) // 或直接调用 share() 等函数,无需 config\n */\nexport function config(options: GlobalConfig = {}): void {\n // Priority 1: 用户提供的 getSignature(最高优先级)\n if (options.getSignature) {\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n return\n }\n\n // Priority 2: 检查用户自定义的 domainConfigs\n if (options.domainConfigs && typeof window !== 'undefined') {\n const origin = window.location.origin\n const userDomainConfig = options.domainConfigs[origin]\n\n if (userDomainConfig) {\n options.getSignature = createDomainSignatureGetter(userDomainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n }\n\n // Priority 3: 尝试使用默认的域名配置\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n options.getSignature = createDomainSignatureGetter(domainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n\n // 没有找到任何可用的配置\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '当前域名不支持内置签名,请提供 getSignature 函数或配置 domainConfigs。' +\n '内置签名仅在以下域名下可用:' +\n supportedDomains.join(', '),\n )\n}\n\n/**\n * 获取全局配置\n * @returns 全局配置,如果未配置则尝试自动初始化(仅在支持的域名下)\n */\nexport function getConfig(): Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig {\n if (!globalConfig) {\n // 尝试自动初始化(如果当前域名有配置)\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n config({})\n } else {\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '请先调用 config() 进行配置。' +\n '在 ' +\n supportedDomains.join(', ') +\n ' 域名下可以自动使用内置配置。',\n )\n }\n }\n return globalConfig as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n}\n\n/**\n * 检查是否已配置\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null\n}\n\n/**\n * 重置配置(仅用于测试)\n * @internal\n */\nexport function resetConfig(): void {\n globalConfig = null\n}\n","import { getConfig } from './config'\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n updateAppMessageShareData: (options: {\n title: string\n desc: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n updateTimelineShareData: (options: {\n title: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n}\n\nlet sdkInitPromise: Promise<void> | null = null\nlet currentInitUrl: string | null = null\nlet entryUrl: string | null = null // iOS 微信需要用首次进入的 URL\n\n/**\n * 检测是否在微信浏览器中\n * @returns 是否在微信浏览器中\n * @example\n * if (isWechat()) {\n * // 执行微信相关操作\n * }\n */\nexport function isWechat(): boolean {\n if (typeof navigator === 'undefined') return false\n const ua = navigator.userAgent.toLowerCase()\n return /micromessenger/.test(ua)\n}\n\n/**\n * 检测是否为 iOS 微信浏览器\n */\nfunction isIOSWechat(): boolean {\n if (!isWechat()) return false\n const ua = navigator.userAgent.toLowerCase()\n return /iphone|ipad|ipod/.test(ua)\n}\n\n/**\n * 获取用于签名的 URL\n * iOS 微信需要用首次进入页面的 URL,Android 用当前 URL\n */\nfunction getSignatureUrl(): string {\n if (typeof window === 'undefined') return ''\n\n const currentUrl = window.location.href.split('#')[0]\n\n if (isIOSWechat()) {\n // iOS 微信:用首次进入的 URL\n if (!entryUrl) {\n entryUrl = currentUrl\n }\n return entryUrl\n }\n\n // Android 或其他:用当前 URL\n return currentUrl\n}\n\n/**\n * 获取 wx 对象\n * 非微信环境或 wx 对象不存在时返回 null\n * @returns wx 对象或 null\n */\nexport function getWx(): WxSDK | null {\n if (typeof window === 'undefined') {\n return null\n }\n if (!isWechat()) {\n return null\n }\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n return wx ?? null\n}\n\n/**\n * 初始化 SDK(获取签名并调用 wx.config)\n * SPA 模式下,URL 变化时会重新初始化(Android)\n * iOS 微信始终使用首次进入的 URL 进行签名\n * 非微信环境中静默返回,不会产生异常\n * 注意:需要使用者在全局引入微信 JS-SDK,确保 window.wx 可用\n */\nexport async function initSDK(jsApiList: string[]): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const cfg = getConfig()\n const signatureUrl = getSignatureUrl()\n const isSpa = cfg.spa !== false // 默认为 true\n\n // 非 SPA 模式或 URL 没有变化,且已经初始化过,直接返回\n if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) {\n return sdkInitPromise\n }\n\n // URL 变化或首次初始化\n currentInitUrl = signatureUrl\n\n sdkInitPromise = (async () => {\n // 获取签名\n const signatureResult = await cfg.getSignature(signatureUrl)\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: cfg.debug ?? false,\n appId: signatureResult.appId,\n timestamp: signatureResult.timestamp,\n nonceStr: signatureResult.nonceStr,\n signature: signatureResult.signature,\n jsApiList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n // 初始化失败,清除缓存以便下次重试\n sdkInitPromise = null\n currentInitUrl = null\n reject(new Error(`wx.config failed: ${res.errMsg}`))\n })\n })\n })()\n\n return sdkInitPromise\n}\n\n/**\n * 重置 SDK 状态(用于测试或强制重新初始化)\n */\nexport function resetSDK(): void {\n sdkInitPromise = null\n currentInitUrl = null\n entryUrl = null\n}\n","import { initSDK, getWx, isWechat } from './sdk'\n\n/**\n * 分享参数\n */\nexport interface ShareOptions {\n /** 分享标题 */\n title: string\n /** 分享描述(分享给朋友时显示) */\n desc?: string\n /** 分享链接,默认为当前页面 URL */\n link?: string\n /** 分享图标 URL */\n imgUrl: string\n}\n\nconst SHARE_JS_API_LIST = [\n 'updateAppMessageShareData',\n 'updateTimelineShareData',\n]\n\n/**\n * 设置微信分享内容\n * 会自动加载 SDK 并初始化,然后设置分享内容\n * 非微信环境中静默返回,不会产生异常\n * @param options - 分享参数\n */\nexport async function share(options: ShareOptions): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n // 确保 SDK 已初始化\n await initSDK(SHARE_JS_API_LIST)\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const link = options.link ?? (typeof window !== 'undefined' ? window.location.href : '')\n\n // 设置分享给朋友\n await new Promise<void>((resolve, reject) => {\n wx.updateAppMessageShareData({\n title: options.title,\n desc: options.desc ?? '',\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n\n // 设置分享到朋友圈\n await new Promise<void>((resolve, reject) => {\n wx.updateTimelineShareData({\n title: options.title,\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n}\n","import { isWechat } from './sdk'\n\n/**\n * 微信 JS-SDK wx.config 所需的配置参数\n */\nexport interface Config {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n /** 需要使用的 JS 接口列表 */\n jsApiList: string[]\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /** 需要使用的开放标签列表 */\n openTagList?: string[]\n}\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n}\n\n/**\n * 初始化微信 JS-SDK,调用 wx.config 并返回 Promise\n * 非微信环境中静默返回,不会产生异常\n * 注意:使用此函数前,需要在 HTML 中提前引入微信 JS-SDK 脚本,确保 window.wx 可用\n * @param config - 微信 JS-SDK 配置参数\n * @returns Promise,ready 时 resolve,error 时 reject 并携带错误信息\n */\nexport function init(config: Config): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return Promise.resolve()\n }\n\n if (typeof window === 'undefined') {\n return Promise.resolve()\n }\n\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n if (!wx) {\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: config.debug ?? false,\n appId: config.appId,\n timestamp: config.timestamp,\n nonceStr: config.nonceStr,\n signature: config.signature,\n jsApiList: config.jsApiList,\n openTagList: config.openTagList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n reject(new Error(`init: ${res.errMsg}`))\n })\n })\n}\n"]} |
+2
-318
@@ -1,319 +0,3 @@ | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropSymbols = Object.getOwnPropertySymbols; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __propIsEnum = Object.prototype.propertyIsEnumerable; | ||
| var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
| var __spreadValues = (a, b) => { | ||
| for (var prop in b || (b = {})) | ||
| if (__hasOwnProp.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| if (__getOwnPropSymbols) | ||
| for (var prop of __getOwnPropSymbols(b)) { | ||
| if (__propIsEnum.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| } | ||
| return a; | ||
| }; | ||
| var __async = (__this, __arguments, generator) => { | ||
| return new Promise((resolve, reject) => { | ||
| var fulfilled = (value) => { | ||
| try { | ||
| step(generator.next(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var rejected = (value) => { | ||
| try { | ||
| step(generator.throw(value)); | ||
| } catch (e) { | ||
| reject(e); | ||
| } | ||
| }; | ||
| var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); | ||
| step((generator = generator.apply(__this, __arguments)).next()); | ||
| }); | ||
| }; | ||
| // src/config.ts | ||
| var DEFAULT_DOMAIN_CONFIGS = { | ||
| "https://act.go.sohu.com": { | ||
| endpoint: "/wechat/ticket", | ||
| urlParamKey: "url" | ||
| }, | ||
| "https://test.r.ads.sohu.com": { | ||
| endpoint: "/wechat/ticket", | ||
| urlParamKey: "url" | ||
| } | ||
| }; | ||
| function httpGet(url) { | ||
| return __async(this, null, function* () { | ||
| if (typeof fetch !== "undefined") { | ||
| const response = yield fetch(url); | ||
| if (!response.ok) { | ||
| throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`); | ||
| } | ||
| return yield response.json(); | ||
| } | ||
| return new Promise((resolve, reject) => { | ||
| const xhr = new XMLHttpRequest(); | ||
| xhr.open("GET", url, true); | ||
| xhr.onload = () => { | ||
| if (xhr.status >= 200 && xhr.status < 300) { | ||
| try { | ||
| const result = JSON.parse(xhr.responseText); | ||
| resolve(result); | ||
| } catch (error) { | ||
| reject(new Error(`Failed to parse response: ${error}`)); | ||
| } | ||
| } else { | ||
| reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`)); | ||
| } | ||
| }; | ||
| xhr.onerror = () => { | ||
| reject(new Error("Network error occurred")); | ||
| }; | ||
| xhr.send(); | ||
| }); | ||
| }); | ||
| } | ||
| function defaultTransformResponse(response) { | ||
| if (response.code !== 0) { | ||
| throw new Error(`Signature API error: ${response.message}`); | ||
| } | ||
| return { | ||
| appId: response.data.app_id, | ||
| timestamp: response.data.timestamp, | ||
| nonceStr: response.data.nonce_str, | ||
| signature: response.data.signature | ||
| }; | ||
| } | ||
| function createDomainSignatureGetter(domainConfig) { | ||
| return (url) => __async(null, null, function* () { | ||
| var _a, _b, _c; | ||
| const endpoint = (_a = domainConfig.endpoint) != null ? _a : "/wechat/ticket"; | ||
| const paramKey = (_b = domainConfig.urlParamKey) != null ? _b : "url"; | ||
| const transform = (_c = domainConfig.transformResponse) != null ? _c : defaultTransformResponse; | ||
| const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`; | ||
| const response = yield httpGet(apiUrl); | ||
| return transform(response); | ||
| }); | ||
| } | ||
| function getEffectiveDomainConfigs() { | ||
| var _a; | ||
| return __spreadValues(__spreadValues({}, DEFAULT_DOMAIN_CONFIGS), (_a = globalConfig == null ? void 0 : globalConfig.domainConfigs) != null ? _a : {}); | ||
| } | ||
| function findDomainConfig() { | ||
| var _a; | ||
| if (typeof window === "undefined") return null; | ||
| const origin = window.location.origin; | ||
| const effectiveConfigs = getEffectiveDomainConfigs(); | ||
| return (_a = effectiveConfigs[origin]) != null ? _a : null; | ||
| } | ||
| var globalConfig = null; | ||
| function config(options = {}) { | ||
| if (options.getSignature) { | ||
| globalConfig = options; | ||
| return; | ||
| } | ||
| if (options.domainConfigs && typeof window !== "undefined") { | ||
| const origin = window.location.origin; | ||
| const userDomainConfig = options.domainConfigs[origin]; | ||
| if (userDomainConfig) { | ||
| options.getSignature = createDomainSignatureGetter(userDomainConfig); | ||
| globalConfig = options; | ||
| if (options.debug === void 0) options.debug = false; | ||
| if (options.spa === void 0) options.spa = true; | ||
| return; | ||
| } | ||
| } | ||
| const domainConfig = findDomainConfig(); | ||
| if (domainConfig) { | ||
| options.getSignature = createDomainSignatureGetter(domainConfig); | ||
| globalConfig = options; | ||
| if (options.debug === void 0) options.debug = false; | ||
| if (options.spa === void 0) options.spa = true; | ||
| return; | ||
| } | ||
| const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS); | ||
| throw new Error( | ||
| "\u5F53\u524D\u57DF\u540D\u4E0D\u652F\u6301\u5185\u7F6E\u7B7E\u540D\uFF0C\u8BF7\u63D0\u4F9B getSignature \u51FD\u6570\u6216\u914D\u7F6E domainConfigs\u3002\u5185\u7F6E\u7B7E\u540D\u4EC5\u5728\u4EE5\u4E0B\u57DF\u540D\u4E0B\u53EF\u7528\uFF1A" + supportedDomains.join(", ") | ||
| ); | ||
| } | ||
| function getConfig() { | ||
| if (!globalConfig) { | ||
| const domainConfig = findDomainConfig(); | ||
| if (domainConfig) { | ||
| config({}); | ||
| } else { | ||
| const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS); | ||
| throw new Error( | ||
| "\u8BF7\u5148\u8C03\u7528 config() \u8FDB\u884C\u914D\u7F6E\u3002\u5728 " + supportedDomains.join(", ") + " \u57DF\u540D\u4E0B\u53EF\u4EE5\u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u914D\u7F6E\u3002" | ||
| ); | ||
| } | ||
| } | ||
| return globalConfig; | ||
| } | ||
| function isConfigured() { | ||
| return globalConfig !== null; | ||
| } | ||
| // src/sdk.ts | ||
| var sdkInitPromise = null; | ||
| var currentInitUrl = null; | ||
| var entryUrl = null; | ||
| function isWechat() { | ||
| if (typeof navigator === "undefined") return false; | ||
| const ua = navigator.userAgent.toLowerCase(); | ||
| return /micromessenger/.test(ua); | ||
| } | ||
| function isIOSWechat() { | ||
| if (!isWechat()) return false; | ||
| const ua = navigator.userAgent.toLowerCase(); | ||
| return /iphone|ipad|ipod/.test(ua); | ||
| } | ||
| function getSignatureUrl() { | ||
| if (typeof window === "undefined") return ""; | ||
| const currentUrl = window.location.href.split("#")[0]; | ||
| if (isIOSWechat()) { | ||
| if (!entryUrl) { | ||
| entryUrl = currentUrl; | ||
| } | ||
| return entryUrl; | ||
| } | ||
| return currentUrl; | ||
| } | ||
| function getWx() { | ||
| if (typeof window === "undefined") { | ||
| return null; | ||
| } | ||
| if (!isWechat()) { | ||
| return null; | ||
| } | ||
| const wx = window.wx; | ||
| return wx != null ? wx : null; | ||
| } | ||
| function initSDK(jsApiList) { | ||
| return __async(this, null, function* () { | ||
| if (!isWechat()) { | ||
| return; | ||
| } | ||
| const wx = getWx(); | ||
| if (!wx) { | ||
| return; | ||
| } | ||
| const cfg = getConfig(); | ||
| const signatureUrl = getSignatureUrl(); | ||
| const isSpa = cfg.spa !== false; | ||
| if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) { | ||
| return sdkInitPromise; | ||
| } | ||
| currentInitUrl = signatureUrl; | ||
| sdkInitPromise = (() => __async(null, null, function* () { | ||
| const signatureResult = yield cfg.getSignature(signatureUrl); | ||
| return new Promise((resolve, reject) => { | ||
| var _a; | ||
| wx.config({ | ||
| debug: (_a = cfg.debug) != null ? _a : false, | ||
| appId: signatureResult.appId, | ||
| timestamp: signatureResult.timestamp, | ||
| nonceStr: signatureResult.nonceStr, | ||
| signature: signatureResult.signature, | ||
| jsApiList | ||
| }); | ||
| wx.ready(() => { | ||
| resolve(); | ||
| }); | ||
| wx.error((res) => { | ||
| sdkInitPromise = null; | ||
| currentInitUrl = null; | ||
| reject(new Error(`wx.config failed: ${res.errMsg}`)); | ||
| }); | ||
| }); | ||
| }))(); | ||
| return sdkInitPromise; | ||
| }); | ||
| } | ||
| function resetSDK() { | ||
| sdkInitPromise = null; | ||
| currentInitUrl = null; | ||
| entryUrl = null; | ||
| } | ||
| // src/share.ts | ||
| var SHARE_JS_API_LIST = [ | ||
| "updateAppMessageShareData", | ||
| "updateTimelineShareData" | ||
| ]; | ||
| function share(options) { | ||
| return __async(this, null, function* () { | ||
| var _a; | ||
| if (!isWechat()) { | ||
| return; | ||
| } | ||
| yield initSDK(SHARE_JS_API_LIST); | ||
| const wx = getWx(); | ||
| if (!wx) { | ||
| return; | ||
| } | ||
| const link = (_a = options.link) != null ? _a : typeof window !== "undefined" ? window.location.href : ""; | ||
| yield new Promise((resolve, reject) => { | ||
| var _a2; | ||
| wx.updateAppMessageShareData({ | ||
| title: options.title, | ||
| desc: (_a2 = options.desc) != null ? _a2 : "", | ||
| link, | ||
| imgUrl: options.imgUrl, | ||
| success: () => resolve(), | ||
| fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)) | ||
| }); | ||
| setTimeout(resolve, 500); | ||
| }); | ||
| yield new Promise((resolve, reject) => { | ||
| wx.updateTimelineShareData({ | ||
| title: options.title, | ||
| link, | ||
| imgUrl: options.imgUrl, | ||
| success: () => resolve(), | ||
| fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)) | ||
| }); | ||
| setTimeout(resolve, 500); | ||
| }); | ||
| }); | ||
| } | ||
| // src/init.ts | ||
| function init(config2) { | ||
| if (!isWechat()) { | ||
| return Promise.resolve(); | ||
| } | ||
| if (typeof window === "undefined") { | ||
| return Promise.resolve(); | ||
| } | ||
| const wx = window.wx; | ||
| if (!wx) { | ||
| return Promise.resolve(); | ||
| } | ||
| return new Promise((resolve, reject) => { | ||
| var _a; | ||
| wx.config({ | ||
| debug: (_a = config2.debug) != null ? _a : false, | ||
| appId: config2.appId, | ||
| timestamp: config2.timestamp, | ||
| nonceStr: config2.nonceStr, | ||
| signature: config2.signature, | ||
| jsApiList: config2.jsApiList, | ||
| openTagList: config2.openTagList | ||
| }); | ||
| wx.ready(() => { | ||
| resolve(); | ||
| }); | ||
| wx.error((res) => { | ||
| reject(new Error(`init: ${res.errMsg}`)); | ||
| }); | ||
| }); | ||
| } | ||
| export { config, getConfig, getWx, init, initSDK, isConfigured, isWechat, resetSDK, share }; | ||
| //# sourceMappingURL=index.mjs.map | ||
| var R=Object.defineProperty;var x=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var v=(e,n,t)=>n in e?R(e,n,{enumerable:true,configurable:true,writable:true,value:t}):e[n]=t,S=(e,n)=>{for(var t in n||(n={}))k.call(n,t)&&v(e,t,n[t]);if(x)for(var t of x(n))I.call(n,t)&&v(e,t,n[t]);return e};var l=(e,n,t)=>new Promise((r,i)=>{var o=s=>{try{g(t.next(s));}catch(f){i(f);}},a=s=>{try{g(t.throw(s));}catch(f){i(f);}},g=s=>s.done?r(s.value):Promise.resolve(s.value).then(o,a);g((t=t.apply(e,n)).next());});var C={"https://act.go.sohu.com":{endpoint:"/common/wechat/ticket",urlParamKey:"url"},"https://test.r.ads.sohu.com":{endpoint:"/common/wechat/ticket",urlParamKey:"url"}};function G(e){return l(this,null,function*(){if(typeof fetch!="undefined"){let n=yield fetch(e);if(!n.ok)throw new Error(`Failed to fetch signature: ${n.status} ${n.statusText}`);return yield n.json()}return new Promise((n,t)=>{let r=new XMLHttpRequest;r.open("GET",e,true),r.onload=()=>{if(r.status>=200&&r.status<300)try{let i=JSON.parse(r.responseText);n(i);}catch(i){t(new Error(`Failed to parse response: ${i}`));}else t(new Error(`Failed to fetch signature: ${r.status} ${r.statusText}`));},r.onerror=()=>{t(new Error("Network error occurred"));},r.send();})})}function T(e){if(e.code!==0)throw new Error(`Signature API error: ${e.message}`);return {appId:e.data.app_id,timestamp:e.data.timestamp,nonceStr:e.data.nonce_str,signature:e.data.signature}}function D(e){return n=>l(null,null,function*(){var g,s,f;let t=(g=e.endpoint)!=null?g:"/common/wechat/ticket",r=(s=e.urlParamKey)!=null?s:"url",i=(f=e.transformResponse)!=null?f:T,o=`${t}?${r}=${encodeURIComponent(n)}`,a=yield G(o);return i(a)})}function A(){var e;return S(S({},C),(e=u==null?void 0:u.domainConfigs)!=null?e:{})}function y(){var t;if(typeof window=="undefined")return null;let e=window.location.origin;return (t=A()[e])!=null?t:null}var u=null;function P(e={}){if(e.getSignature){u=e;return}if(e.domainConfigs&&typeof window!="undefined"){let r=window.location.origin,i=e.domainConfigs[r];if(i){e.getSignature=D(i),u=e,e.debug===void 0&&(e.debug=false),e.spa===void 0&&(e.spa=true);return}}let n=y();if(n){e.getSignature=D(n),u=e,e.debug===void 0&&(e.debug=false),e.spa===void 0&&(e.spa=true);return}let t=Object.keys(C);throw new Error("\u5F53\u524D\u57DF\u540D\u4E0D\u652F\u6301\u5185\u7F6E\u7B7E\u540D\uFF0C\u8BF7\u63D0\u4F9B getSignature \u51FD\u6570\u6216\u914D\u7F6E domainConfigs\u3002\u5185\u7F6E\u7B7E\u540D\u4EC5\u5728\u4EE5\u4E0B\u57DF\u540D\u4E0B\u53EF\u7528\uFF1A"+t.join(", "))}function b(){if(!u)if(y())P({});else {let n=Object.keys(C);throw new Error("\u8BF7\u5148\u8C03\u7528 config() \u8FDB\u884C\u914D\u7F6E\u3002\u5728 "+n.join(", ")+" \u57DF\u540D\u4E0B\u53EF\u4EE5\u81EA\u52A8\u4F7F\u7528\u5185\u7F6E\u914D\u7F6E\u3002")}return u}function M(){return u!==null}var c=null,p=null,m=null;function d(){if(typeof navigator=="undefined")return false;let e=navigator.userAgent.toLowerCase();return /micromessenger/.test(e)}function E(){if(!d())return false;let e=navigator.userAgent.toLowerCase();return /iphone|ipad|ipod/.test(e)}function K(){if(typeof window=="undefined")return "";let e=window.location.href.split("#")[0];return E()?(m||(m=e),m):e}function w(){if(typeof window=="undefined"||!d())return null;let e=window.wx;return e!=null?e:null}function h(e){return l(this,null,function*(){if(!d())return;let n=w();if(!n)return;let t=b(),r=K(),i=t.spa!==false;return c&&(!i||p===r)||(p=r,c=l(null,null,function*(){let o=yield t.getSignature(r);return new Promise((a,g)=>{var s;n.config({debug:(s=t.debug)!=null?s:false,appId:o.appId,timestamp:o.timestamp,nonceStr:o.nonceStr,signature:o.signature,jsApiList:e}),n.ready(()=>{a();}),n.error(f=>{c=null,p=null,g(new Error(`wx.config failed: ${f.errMsg}`));});})})),c})}function L(){c=null,p=null,m=null;}var U=["updateAppMessageShareData","updateTimelineShareData"];function W(e){return l(this,null,function*(){var r;if(!d())return;yield h(U);let n=w();if(!n)return;let t=(r=e.link)!=null?r:typeof window!="undefined"?window.location.href:"";yield new Promise((i,o)=>{var a;n.updateAppMessageShareData({title:e.title,desc:(a=e.desc)!=null?a:"",link:t,imgUrl:e.imgUrl,success:()=>i(),fail:g=>o(new Error(`updateAppMessageShareData failed: ${g.errMsg}`))}),setTimeout(i,500);}),yield new Promise((i,o)=>{n.updateTimelineShareData({title:e.title,link:t,imgUrl:e.imgUrl,success:()=>i(),fail:a=>o(new Error(`updateTimelineShareData failed: ${a.errMsg}`))}),setTimeout(i,500);});})}function $(e){if(!d()||typeof window=="undefined")return Promise.resolve();let n=window.wx;return n?new Promise((t,r)=>{var i;n.config({debug:(i=e.debug)!=null?i:false,appId:e.appId,timestamp:e.timestamp,nonceStr:e.nonceStr,signature:e.signature,jsApiList:e.jsApiList,openTagList:e.openTagList}),n.ready(()=>{t();}),n.error(o=>{r(new Error(`init: ${o.errMsg}`));});}):Promise.resolve()} | ||
| export{P as config,b as getConfig,w as getWx,$ as init,h as initSDK,M as isConfigured,d as isWechat,L as resetSDK,W as share};//# sourceMappingURL=index.mjs.map | ||
| //# sourceMappingURL=index.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/config.ts","../src/sdk.ts","../src/share.ts","../src/init.ts"],"names":["_a","config"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 微信 JS-SDK 签名参数\n */\nexport interface SignatureResult {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n}\n\n/**\n * 内置签名接口返回值\n */\ninterface BuiltInSignatureResponse {\n code: number\n data: {\n app_id: string\n timestamp: number\n nonce_str: string\n signature: string\n }\n message: string\n}\n\n/**\n * 域名签名配置\n * 用于自定义特定域名下的签名获取行为\n */\nexport interface DomainSignatureConfig {\n /**\n * 签名接口端点路径,默认 '/wechat/ticket'\n * @example '/api/wechat/signature'\n * @example '/custom/sign'\n */\n endpoint?: string\n\n /**\n * URL 参数的 key 名称,默认 'url'\n * @example 'pageUrl'\n * @example 'target'\n */\n urlParamKey?: string\n\n /**\n * 响应格式转换函数\n * 用于将后端返回的自定义格式转换为标准 SignatureResult\n * 如果未提供,将使用默认的 BuiltInSignatureResponse 格式\n * @param response - 后端返回的原始响应\n * @returns 标准签名结果对象\n * @example\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n */\n transformResponse?: (response: any) => SignatureResult\n}\n\n/**\n * 默认的域名签名配置映射\n */\nconst DEFAULT_DOMAIN_CONFIGS: Record<string, DomainSignatureConfig> = {\n 'https://act.go.sohu.com': {\n endpoint: '/wechat/ticket',\n urlParamKey: 'url',\n },\n 'https://test.r.ads.sohu.com': {\n endpoint: '/wechat/ticket',\n urlParamKey: 'url',\n },\n}\n\n/**\n * 发起 HTTP GET 请求,支持 fetch 和 XMLHttpRequest 回退\n * @returns 任意 JSON 响应(由调用者负责类型转换)\n */\nasync function httpGet(url: string): Promise<any> {\n // 优先使用 fetch API\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`)\n }\n\n return await response.json()\n }\n\n // 回退到 XMLHttpRequest\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, true)\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const result = JSON.parse(xhr.responseText)\n resolve(result)\n } catch (error) {\n reject(new Error(`Failed to parse response: ${error}`))\n }\n } else {\n reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred'))\n }\n\n xhr.send()\n })\n}\n\n/**\n * 默认的响应转换函数(用于 Sohu 内置格式)\n */\nfunction defaultTransformResponse(response: BuiltInSignatureResponse): SignatureResult {\n if (response.code !== 0) {\n throw new Error(`Signature API error: ${response.message}`)\n }\n\n return {\n appId: response.data.app_id,\n timestamp: response.data.timestamp,\n nonceStr: response.data.nonce_str,\n signature: response.data.signature,\n }\n}\n\n/**\n * 创建基于域名配置的签名获取函数\n * @param domainConfig - 域名签名配置\n * @returns 签名获取函数\n */\nfunction createDomainSignatureGetter(\n domainConfig: DomainSignatureConfig,\n): (url: string) => Promise<SignatureResult> {\n return async (url: string): Promise<SignatureResult> => {\n const endpoint = domainConfig.endpoint ?? '/wechat/ticket'\n const paramKey = domainConfig.urlParamKey ?? 'url'\n const transform = domainConfig.transformResponse ?? defaultTransformResponse\n\n const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`\n const response = await httpGet(apiUrl)\n\n return transform(response)\n }\n}\n\n/**\n * 获取有效的域名配置(合并用户配置和默认配置)\n */\nfunction getEffectiveDomainConfigs(): Record<string, DomainSignatureConfig> {\n return {\n ...DEFAULT_DOMAIN_CONFIGS,\n ...(globalConfig?.domainConfigs ?? {}),\n }\n}\n\n/**\n * 根据当前域名查找匹配的签名配置\n */\nfunction findDomainConfig(): DomainSignatureConfig | null {\n if (typeof window === 'undefined') return null\n\n const origin = window.location.origin\n const effectiveConfigs = getEffectiveDomainConfigs()\n\n return effectiveConfigs[origin] ?? null\n}\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig {\n /**\n * 获取签名参数的函数,接收当前页面 URL,返回签名参数\n * - 优先级最高,提供此参数将覆盖所有其他签名获取方式\n * - 在内置支持的域名下,此参数可选\n * - 未提供时将尝试使用 domainConfigs 或内置签名获取函数\n */\n getSignature?: (url: string) => Promise<SignatureResult>\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /**\n * 是否为 SPA 单页应用模式,默认 true\n * - true: 每次调用 API 时检测 URL 变化,变化则重新初始化\n * - false: 仅初始化一次\n */\n spa?: boolean\n /**\n * 域名签名配置映射表\n * 键为域名(如 'https://example.com'),值为该域名的签名配置\n * 优先级低于 getSignature,高于内置默认配置\n * @example\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.app_id,\n * timestamp: res.timestamp,\n * nonceStr: res.nonce_str,\n * signature: res.signature\n * })\n * }\n * }\n */\n domainConfigs?: Record<string, DomainSignatureConfig>\n}\n\nlet globalConfig: GlobalConfig | null = null\n\n/**\n * 设置全局配置\n *\n * 配置优先级(从高到低):\n * 1. 自定义 getSignature 函数(完全覆盖所有其他配置)\n * 2. domainConfigs 中匹配当前域名的配置\n * 3. 内置默认配置(act.go.sohu.com、test.r.ads.sohu.com)\n *\n * @param options - 配置选项\n *\n * @example\n * // 示例 1: 使用自定义签名函数(最高优先级)\n * config({\n * getSignature: async (url) => {\n * const res = await fetch(`/api/signature?url=${encodeURIComponent(url)}`)\n * return res.json()\n * }\n * })\n *\n * @example\n * // 示例 2: 为自定义域名配置签名接口\n * config({\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n * }\n * }\n * })\n *\n * @example\n * // 示例 3: 覆盖内置域名的默认配置\n * config({\n * domainConfigs: {\n * 'https://act.go.sohu.com': {\n * endpoint: '/custom/ticket',\n * urlParamKey: 'targetUrl'\n * }\n * }\n * })\n *\n * @example\n * // 示例 4: 在支持的域名下零配置使用\n * config({}) // 或直接调用 share() 等函数,无需 config\n */\nexport function config(options: GlobalConfig = {}): void {\n // Priority 1: 用户提供的 getSignature(最高优先级)\n if (options.getSignature) {\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n return\n }\n\n // Priority 2: 检查用户自定义的 domainConfigs\n if (options.domainConfigs && typeof window !== 'undefined') {\n const origin = window.location.origin\n const userDomainConfig = options.domainConfigs[origin]\n\n if (userDomainConfig) {\n options.getSignature = createDomainSignatureGetter(userDomainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n }\n\n // Priority 3: 尝试使用默认的域名配置\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n options.getSignature = createDomainSignatureGetter(domainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n\n // 没有找到任何可用的配置\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '当前域名不支持内置签名,请提供 getSignature 函数或配置 domainConfigs。' +\n '内置签名仅在以下域名下可用:' +\n supportedDomains.join(', '),\n )\n}\n\n/**\n * 获取全局配置\n * @returns 全局配置,如果未配置则尝试自动初始化(仅在支持的域名下)\n */\nexport function getConfig(): Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig {\n if (!globalConfig) {\n // 尝试自动初始化(如果当前域名有配置)\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n config({})\n } else {\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '请先调用 config() 进行配置。' +\n '在 ' +\n supportedDomains.join(', ') +\n ' 域名下可以自动使用内置配置。',\n )\n }\n }\n return globalConfig as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n}\n\n/**\n * 检查是否已配置\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null\n}\n\n/**\n * 重置配置(仅用于测试)\n * @internal\n */\nexport function resetConfig(): void {\n globalConfig = null\n}\n","import { getConfig } from './config'\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n updateAppMessageShareData: (options: {\n title: string\n desc: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n updateTimelineShareData: (options: {\n title: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n}\n\nlet sdkInitPromise: Promise<void> | null = null\nlet currentInitUrl: string | null = null\nlet entryUrl: string | null = null // iOS 微信需要用首次进入的 URL\n\n/**\n * 检测是否在微信浏览器中\n * @returns 是否在微信浏览器中\n * @example\n * if (isWechat()) {\n * // 执行微信相关操作\n * }\n */\nexport function isWechat(): boolean {\n if (typeof navigator === 'undefined') return false\n const ua = navigator.userAgent.toLowerCase()\n return /micromessenger/.test(ua)\n}\n\n/**\n * 检测是否为 iOS 微信浏览器\n */\nfunction isIOSWechat(): boolean {\n if (!isWechat()) return false\n const ua = navigator.userAgent.toLowerCase()\n return /iphone|ipad|ipod/.test(ua)\n}\n\n/**\n * 获取用于签名的 URL\n * iOS 微信需要用首次进入页面的 URL,Android 用当前 URL\n */\nfunction getSignatureUrl(): string {\n if (typeof window === 'undefined') return ''\n\n const currentUrl = window.location.href.split('#')[0]\n\n if (isIOSWechat()) {\n // iOS 微信:用首次进入的 URL\n if (!entryUrl) {\n entryUrl = currentUrl\n }\n return entryUrl\n }\n\n // Android 或其他:用当前 URL\n return currentUrl\n}\n\n/**\n * 获取 wx 对象\n * 非微信环境或 wx 对象不存在时返回 null\n * @returns wx 对象或 null\n */\nexport function getWx(): WxSDK | null {\n if (typeof window === 'undefined') {\n return null\n }\n if (!isWechat()) {\n return null\n }\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n return wx ?? null\n}\n\n/**\n * 初始化 SDK(获取签名并调用 wx.config)\n * SPA 模式下,URL 变化时会重新初始化(Android)\n * iOS 微信始终使用首次进入的 URL 进行签名\n * 非微信环境中静默返回,不会产生异常\n * 注意:需要使用者在全局引入微信 JS-SDK,确保 window.wx 可用\n */\nexport async function initSDK(jsApiList: string[]): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const cfg = getConfig()\n const signatureUrl = getSignatureUrl()\n const isSpa = cfg.spa !== false // 默认为 true\n\n // 非 SPA 模式或 URL 没有变化,且已经初始化过,直接返回\n if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) {\n return sdkInitPromise\n }\n\n // URL 变化或首次初始化\n currentInitUrl = signatureUrl\n\n sdkInitPromise = (async () => {\n // 获取签名\n const signatureResult = await cfg.getSignature(signatureUrl)\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: cfg.debug ?? false,\n appId: signatureResult.appId,\n timestamp: signatureResult.timestamp,\n nonceStr: signatureResult.nonceStr,\n signature: signatureResult.signature,\n jsApiList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n // 初始化失败,清除缓存以便下次重试\n sdkInitPromise = null\n currentInitUrl = null\n reject(new Error(`wx.config failed: ${res.errMsg}`))\n })\n })\n })()\n\n return sdkInitPromise\n}\n\n/**\n * 重置 SDK 状态(用于测试或强制重新初始化)\n */\nexport function resetSDK(): void {\n sdkInitPromise = null\n currentInitUrl = null\n entryUrl = null\n}\n","import { initSDK, getWx, isWechat } from './sdk'\n\n/**\n * 分享参数\n */\nexport interface ShareOptions {\n /** 分享标题 */\n title: string\n /** 分享描述(分享给朋友时显示) */\n desc?: string\n /** 分享链接,默认为当前页面 URL */\n link?: string\n /** 分享图标 URL */\n imgUrl: string\n}\n\nconst SHARE_JS_API_LIST = [\n 'updateAppMessageShareData',\n 'updateTimelineShareData',\n]\n\n/**\n * 设置微信分享内容\n * 会自动加载 SDK 并初始化,然后设置分享内容\n * 非微信环境中静默返回,不会产生异常\n * @param options - 分享参数\n */\nexport async function share(options: ShareOptions): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n // 确保 SDK 已初始化\n await initSDK(SHARE_JS_API_LIST)\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const link = options.link ?? (typeof window !== 'undefined' ? window.location.href : '')\n\n // 设置分享给朋友\n await new Promise<void>((resolve, reject) => {\n wx.updateAppMessageShareData({\n title: options.title,\n desc: options.desc ?? '',\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n\n // 设置分享到朋友圈\n await new Promise<void>((resolve, reject) => {\n wx.updateTimelineShareData({\n title: options.title,\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n}\n","import { isWechat } from './sdk'\n\n/**\n * 微信 JS-SDK wx.config 所需的配置参数\n */\nexport interface Config {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n /** 需要使用的 JS 接口列表 */\n jsApiList: string[]\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /** 需要使用的开放标签列表 */\n openTagList?: string[]\n}\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n}\n\n/**\n * 初始化微信 JS-SDK,调用 wx.config 并返回 Promise\n * 非微信环境中静默返回,不会产生异常\n * 注意:使用此函数前,需要在 HTML 中提前引入微信 JS-SDK 脚本,确保 window.wx 可用\n * @param config - 微信 JS-SDK 配置参数\n * @returns Promise,ready 时 resolve,error 时 reject 并携带错误信息\n */\nexport function init(config: Config): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return Promise.resolve()\n }\n\n if (typeof window === 'undefined') {\n return Promise.resolve()\n }\n\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n if (!wx) {\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: config.debug ?? false,\n appId: config.appId,\n timestamp: config.timestamp,\n nonceStr: config.nonceStr,\n signature: config.signature,\n jsApiList: config.jsApiList,\n openTagList: config.openTagList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n reject(new Error(`init: ${res.errMsg}`))\n })\n })\n}\n"]} | ||
| {"version":3,"sources":["../src/config.ts","../src/sdk.ts","../src/share.ts","../src/init.ts"],"names":["DEFAULT_DOMAIN_CONFIGS","httpGet","url","__async","response","resolve","reject","xhr","result","error","defaultTransformResponse","createDomainSignatureGetter","domainConfig","_a","_b","_c","endpoint","paramKey","transform","apiUrl","getEffectiveDomainConfigs","__spreadValues","globalConfig","findDomainConfig","origin","config","options","userDomainConfig","supportedDomains","getConfig","isConfigured","sdkInitPromise","currentInitUrl","entryUrl","isWechat","ua","isIOSWechat","getSignatureUrl","currentUrl","getWx","wx","initSDK","jsApiList","cfg","signatureUrl","isSpa","signatureResult","res","resetSDK","SHARE_JS_API_LIST","share","link","err","init"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 微信 JS-SDK 签名参数\n */\nexport interface SignatureResult {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n}\n\n/**\n * 内置签名接口返回值\n */\ninterface BuiltInSignatureResponse {\n code: number\n data: {\n app_id: string\n timestamp: number\n nonce_str: string\n signature: string\n }\n message: string\n}\n\n/**\n * 域名签名配置\n * 用于自定义特定域名下的签名获取行为\n */\nexport interface DomainSignatureConfig {\n /**\n * 签名接口端点路径,默认 '/wechat/ticket'\n * @example '/api/wechat/signature'\n * @example '/custom/sign'\n */\n endpoint?: string\n\n /**\n * URL 参数的 key 名称,默认 'url'\n * @example 'pageUrl'\n * @example 'target'\n */\n urlParamKey?: string\n\n /**\n * 响应格式转换函数\n * 用于将后端返回的自定义格式转换为标准 SignatureResult\n * 如果未提供,将使用默认的 BuiltInSignatureResponse 格式\n * @param response - 后端返回的原始响应\n * @returns 标准签名结果对象\n * @example\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n */\n transformResponse?: (response: any) => SignatureResult\n}\n\n/**\n * 默认的域名签名配置映射\n */\nconst DEFAULT_DOMAIN_CONFIGS: Record<string, DomainSignatureConfig> = {\n 'https://act.go.sohu.com': {\n endpoint: '/common/wechat/ticket',\n urlParamKey: 'url',\n },\n 'https://test.r.ads.sohu.com': {\n endpoint: '/common/wechat/ticket',\n urlParamKey: 'url',\n },\n}\n\n/**\n * 发起 HTTP GET 请求,支持 fetch 和 XMLHttpRequest 回退\n * @returns 任意 JSON 响应(由调用者负责类型转换)\n */\nasync function httpGet(url: string): Promise<any> {\n // 优先使用 fetch API\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch signature: ${response.status} ${response.statusText}`)\n }\n\n return await response.json()\n }\n\n // 回退到 XMLHttpRequest\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, true)\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const result = JSON.parse(xhr.responseText)\n resolve(result)\n } catch (error) {\n reject(new Error(`Failed to parse response: ${error}`))\n }\n } else {\n reject(new Error(`Failed to fetch signature: ${xhr.status} ${xhr.statusText}`))\n }\n }\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred'))\n }\n\n xhr.send()\n })\n}\n\n/**\n * 默认的响应转换函数(用于 Sohu 内置格式)\n */\nfunction defaultTransformResponse(response: BuiltInSignatureResponse): SignatureResult {\n if (response.code !== 0) {\n throw new Error(`Signature API error: ${response.message}`)\n }\n\n return {\n appId: response.data.app_id,\n timestamp: response.data.timestamp,\n nonceStr: response.data.nonce_str,\n signature: response.data.signature,\n }\n}\n\n/**\n * 创建基于域名配置的签名获取函数\n * @param domainConfig - 域名签名配置\n * @returns 签名获取函数\n */\nfunction createDomainSignatureGetter(\n domainConfig: DomainSignatureConfig,\n): (url: string) => Promise<SignatureResult> {\n return async (url: string): Promise<SignatureResult> => {\n const endpoint = domainConfig.endpoint ?? '/common/wechat/ticket'\n const paramKey = domainConfig.urlParamKey ?? 'url'\n const transform = domainConfig.transformResponse ?? defaultTransformResponse\n\n const apiUrl = `${endpoint}?${paramKey}=${encodeURIComponent(url)}`\n const response = await httpGet(apiUrl)\n\n return transform(response)\n }\n}\n\n/**\n * 获取有效的域名配置(合并用户配置和默认配置)\n */\nfunction getEffectiveDomainConfigs(): Record<string, DomainSignatureConfig> {\n return {\n ...DEFAULT_DOMAIN_CONFIGS,\n ...(globalConfig?.domainConfigs ?? {}),\n }\n}\n\n/**\n * 根据当前域名查找匹配的签名配置\n */\nfunction findDomainConfig(): DomainSignatureConfig | null {\n if (typeof window === 'undefined') return null\n\n const origin = window.location.origin\n const effectiveConfigs = getEffectiveDomainConfigs()\n\n return effectiveConfigs[origin] ?? null\n}\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig {\n /**\n * 获取签名参数的函数,接收当前页面 URL,返回签名参数\n * - 优先级最高,提供此参数将覆盖所有其他签名获取方式\n * - 在内置支持的域名下,此参数可选\n * - 未提供时将尝试使用 domainConfigs 或内置签名获取函数\n */\n getSignature?: (url: string) => Promise<SignatureResult>\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /**\n * 是否为 SPA 单页应用模式,默认 true\n * - true: 每次调用 API 时检测 URL 变化,变化则重新初始化\n * - false: 仅初始化一次\n */\n spa?: boolean\n /**\n * 域名签名配置映射表\n * 键为域名(如 'https://example.com'),值为该域名的签名配置\n * 优先级低于 getSignature,高于内置默认配置\n * @example\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.app_id,\n * timestamp: res.timestamp,\n * nonceStr: res.nonce_str,\n * signature: res.signature\n * })\n * }\n * }\n */\n domainConfigs?: Record<string, DomainSignatureConfig>\n}\n\nlet globalConfig: GlobalConfig | null = null\n\n/**\n * 设置全局配置\n *\n * 配置优先级(从高到低):\n * 1. 自定义 getSignature 函数(完全覆盖所有其他配置)\n * 2. domainConfigs 中匹配当前域名的配置\n * 3. 内置默认配置(act.go.sohu.com、test.r.ads.sohu.com)\n *\n * @param options - 配置选项\n *\n * @example\n * // 示例 1: 使用自定义签名函数(最高优先级)\n * config({\n * getSignature: async (url) => {\n * const res = await fetch(`/api/signature?url=${encodeURIComponent(url)}`)\n * return res.json()\n * }\n * })\n *\n * @example\n * // 示例 2: 为自定义域名配置签名接口\n * config({\n * domainConfigs: {\n * 'https://example.com': {\n * endpoint: '/api/wechat/sign',\n * urlParamKey: 'pageUrl',\n * transformResponse: (res) => ({\n * appId: res.appid,\n * timestamp: res.ts,\n * nonceStr: res.nonce,\n * signature: res.sign\n * })\n * }\n * }\n * })\n *\n * @example\n * // 示例 3: 覆盖内置域名的默认配置\n * config({\n * domainConfigs: {\n * 'https://act.go.sohu.com': {\n * endpoint: '/custom/ticket',\n * urlParamKey: 'targetUrl'\n * }\n * }\n * })\n *\n * @example\n * // 示例 4: 在支持的域名下零配置使用\n * config({}) // 或直接调用 share() 等函数,无需 config\n */\nexport function config(options: GlobalConfig = {}): void {\n // Priority 1: 用户提供的 getSignature(最高优先级)\n if (options.getSignature) {\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n return\n }\n\n // Priority 2: 检查用户自定义的 domainConfigs\n if (options.domainConfigs && typeof window !== 'undefined') {\n const origin = window.location.origin\n const userDomainConfig = options.domainConfigs[origin]\n\n if (userDomainConfig) {\n options.getSignature = createDomainSignatureGetter(userDomainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n }\n\n // Priority 3: 尝试使用默认的域名配置\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n options.getSignature = createDomainSignatureGetter(domainConfig)\n globalConfig = options as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n\n // Set defaults if not provided\n if (options.debug === undefined) options.debug = false\n if (options.spa === undefined) options.spa = true\n\n return\n }\n\n // 没有找到任何可用的配置\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '当前域名不支持内置签名,请提供 getSignature 函数或配置 domainConfigs。' +\n '内置签名仅在以下域名下可用:' +\n supportedDomains.join(', '),\n )\n}\n\n/**\n * 获取全局配置\n * @returns 全局配置,如果未配置则尝试自动初始化(仅在支持的域名下)\n */\nexport function getConfig(): Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig {\n if (!globalConfig) {\n // 尝试自动初始化(如果当前域名有配置)\n const domainConfig = findDomainConfig()\n if (domainConfig) {\n config({})\n } else {\n const supportedDomains = Object.keys(DEFAULT_DOMAIN_CONFIGS)\n throw new Error(\n '请先调用 config() 进行配置。' +\n '在 ' +\n supportedDomains.join(', ') +\n ' 域名下可以自动使用内置配置。',\n )\n }\n }\n return globalConfig as Required<Pick<GlobalConfig, 'getSignature'>> & GlobalConfig\n}\n\n/**\n * 检查是否已配置\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null\n}\n\n/**\n * 重置配置(仅用于测试)\n * @internal\n */\nexport function resetConfig(): void {\n globalConfig = null\n}\n","import { getConfig } from './config'\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n updateAppMessageShareData: (options: {\n title: string\n desc: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n updateTimelineShareData: (options: {\n title: string\n link: string\n imgUrl: string\n success?: () => void\n fail?: (err: { errMsg: string }) => void\n }) => void\n}\n\nlet sdkInitPromise: Promise<void> | null = null\nlet currentInitUrl: string | null = null\nlet entryUrl: string | null = null // iOS 微信需要用首次进入的 URL\n\n/**\n * 检测是否在微信浏览器中\n * @returns 是否在微信浏览器中\n * @example\n * if (isWechat()) {\n * // 执行微信相关操作\n * }\n */\nexport function isWechat(): boolean {\n if (typeof navigator === 'undefined') return false\n const ua = navigator.userAgent.toLowerCase()\n return /micromessenger/.test(ua)\n}\n\n/**\n * 检测是否为 iOS 微信浏览器\n */\nfunction isIOSWechat(): boolean {\n if (!isWechat()) return false\n const ua = navigator.userAgent.toLowerCase()\n return /iphone|ipad|ipod/.test(ua)\n}\n\n/**\n * 获取用于签名的 URL\n * iOS 微信需要用首次进入页面的 URL,Android 用当前 URL\n */\nfunction getSignatureUrl(): string {\n if (typeof window === 'undefined') return ''\n\n const currentUrl = window.location.href.split('#')[0]\n\n if (isIOSWechat()) {\n // iOS 微信:用首次进入的 URL\n if (!entryUrl) {\n entryUrl = currentUrl\n }\n return entryUrl\n }\n\n // Android 或其他:用当前 URL\n return currentUrl\n}\n\n/**\n * 获取 wx 对象\n * 非微信环境或 wx 对象不存在时返回 null\n * @returns wx 对象或 null\n */\nexport function getWx(): WxSDK | null {\n if (typeof window === 'undefined') {\n return null\n }\n if (!isWechat()) {\n return null\n }\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n return wx ?? null\n}\n\n/**\n * 初始化 SDK(获取签名并调用 wx.config)\n * SPA 模式下,URL 变化时会重新初始化(Android)\n * iOS 微信始终使用首次进入的 URL 进行签名\n * 非微信环境中静默返回,不会产生异常\n * 注意:需要使用者在全局引入微信 JS-SDK,确保 window.wx 可用\n */\nexport async function initSDK(jsApiList: string[]): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const cfg = getConfig()\n const signatureUrl = getSignatureUrl()\n const isSpa = cfg.spa !== false // 默认为 true\n\n // 非 SPA 模式或 URL 没有变化,且已经初始化过,直接返回\n if (sdkInitPromise && (!isSpa || currentInitUrl === signatureUrl)) {\n return sdkInitPromise\n }\n\n // URL 变化或首次初始化\n currentInitUrl = signatureUrl\n\n sdkInitPromise = (async () => {\n // 获取签名\n const signatureResult = await cfg.getSignature(signatureUrl)\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: cfg.debug ?? false,\n appId: signatureResult.appId,\n timestamp: signatureResult.timestamp,\n nonceStr: signatureResult.nonceStr,\n signature: signatureResult.signature,\n jsApiList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n // 初始化失败,清除缓存以便下次重试\n sdkInitPromise = null\n currentInitUrl = null\n reject(new Error(`wx.config failed: ${res.errMsg}`))\n })\n })\n })()\n\n return sdkInitPromise\n}\n\n/**\n * 重置 SDK 状态(用于测试或强制重新初始化)\n */\nexport function resetSDK(): void {\n sdkInitPromise = null\n currentInitUrl = null\n entryUrl = null\n}\n","import { initSDK, getWx, isWechat } from './sdk'\n\n/**\n * 分享参数\n */\nexport interface ShareOptions {\n /** 分享标题 */\n title: string\n /** 分享描述(分享给朋友时显示) */\n desc?: string\n /** 分享链接,默认为当前页面 URL */\n link?: string\n /** 分享图标 URL */\n imgUrl: string\n}\n\nconst SHARE_JS_API_LIST = [\n 'updateAppMessageShareData',\n 'updateTimelineShareData',\n]\n\n/**\n * 设置微信分享内容\n * 会自动加载 SDK 并初始化,然后设置分享内容\n * 非微信环境中静默返回,不会产生异常\n * @param options - 分享参数\n */\nexport async function share(options: ShareOptions): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return\n }\n\n // 确保 SDK 已初始化\n await initSDK(SHARE_JS_API_LIST)\n\n const wx = getWx()\n if (!wx) {\n return\n }\n\n const link = options.link ?? (typeof window !== 'undefined' ? window.location.href : '')\n\n // 设置分享给朋友\n await new Promise<void>((resolve, reject) => {\n wx.updateAppMessageShareData({\n title: options.title,\n desc: options.desc ?? '',\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateAppMessageShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n\n // 设置分享到朋友圈\n await new Promise<void>((resolve, reject) => {\n wx.updateTimelineShareData({\n title: options.title,\n link,\n imgUrl: options.imgUrl,\n success: () => resolve(),\n fail: (err) => reject(new Error(`updateTimelineShareData failed: ${err.errMsg}`)),\n })\n // 微信 SDK 有时不会调用 success/fail,设置超时自动 resolve\n setTimeout(resolve, 500)\n })\n}\n","import { isWechat } from './sdk'\n\n/**\n * 微信 JS-SDK wx.config 所需的配置参数\n */\nexport interface Config {\n /** 公众号的 appId */\n appId: string\n /** 生成签名的时间戳 */\n timestamp: number | string\n /** 生成签名的随机字符串 */\n nonceStr: string\n /** 签名 */\n signature: string\n /** 需要使用的 JS 接口列表 */\n jsApiList: string[]\n /** 是否开启调试模式,默认 false */\n debug?: boolean\n /** 需要使用的开放标签列表 */\n openTagList?: string[]\n}\n\ninterface WxSDK {\n config: (cfg: {\n debug: boolean\n appId: string\n timestamp: number | string\n nonceStr: string\n signature: string\n jsApiList: string[]\n openTagList?: string[]\n }) => void\n ready: (fn: () => void) => void\n error: (fn: (res: { errMsg: string }) => void) => void\n}\n\n/**\n * 初始化微信 JS-SDK,调用 wx.config 并返回 Promise\n * 非微信环境中静默返回,不会产生异常\n * 注意:使用此函数前,需要在 HTML 中提前引入微信 JS-SDK 脚本,确保 window.wx 可用\n * @param config - 微信 JS-SDK 配置参数\n * @returns Promise,ready 时 resolve,error 时 reject 并携带错误信息\n */\nexport function init(config: Config): Promise<void> {\n // 非微信环境静默返回\n if (!isWechat()) {\n return Promise.resolve()\n }\n\n if (typeof window === 'undefined') {\n return Promise.resolve()\n }\n\n const wx = (window as unknown as Record<string, unknown>).wx as WxSDK | undefined\n if (!wx) {\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve, reject) => {\n wx.config({\n debug: config.debug ?? false,\n appId: config.appId,\n timestamp: config.timestamp,\n nonceStr: config.nonceStr,\n signature: config.signature,\n jsApiList: config.jsApiList,\n openTagList: config.openTagList,\n })\n\n wx.ready(() => {\n resolve()\n })\n\n wx.error((res: { errMsg: string }) => {\n reject(new Error(`init: ${res.errMsg}`))\n })\n })\n}\n"]} |
+1
-1
| { | ||
| "name": "@sohu-bpd/wechat", | ||
| "version": "0.1.1", | ||
| "version": "0.1.2", | ||
| "description": "WeChat JS-SDK utility library", | ||
@@ -5,0 +5,0 @@ "main": "./dist/index.js", |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
128301
-11.68%315
-74.14%5
150%7
16.67%