🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@sohu-bpd/wechat

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sohu-bpd/wechat - npm Package Compare versions

Comparing version
0.1.1
to
0.1.2
+2
-333
dist/index.global.js

@@ -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

@@ -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"]}

@@ -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"]}

@@ -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"]}
{
"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",