微信 jssdk 详细注释解读-压缩变量已重命名

36 阅读8分钟

wxjssdk 地址:res.wx.qq.com/open/js/jwe…

/**
 * 微信JSSDK核心库
 * 用于在网页中调用微信原生功能的JavaScript接口
 */
((window, undefined) => {
    // AMD/CMD模块定义处理
    "function" == typeof define && (define.amd || define.cmd) 
        ? define(function() { return initWechatSDK(window) }) 
        : initWechatSDK(window, true);
})(this, function(global, isExpose) {
    // 变量声明区域
    let apiMap,              // API名称映射表
        reverseApiMap,       // 反向API映射表
        documentTitle,       // 当前页面标题
        userAgent,           // 浏览器用户代理字符串
        platform,            // 客户端平台信息
        isDesktop,           // 是否为桌面端
        isDebugMode,         // 是否为调试模式
        isInWechat,          // 是否在微信浏览器中
        isAndroid,           // 是否为安卓设备
        isIOS,               // 是否为iOS设备
        wechatVersion,       // 微信版本号
        performanceMetrics,  // 性能指标记录
        reportData,          // 上报数据
        configOptions,       // 配置选项
        readyCallbacks,      // 就绪回调队列
        configStatus,        // 配置状态
        isLocalImgDataBusy,  // 本地图片数据处理状态
        localImgDataQueue,   // 本地图片数据处理队列
        wechatAPI;           // 微信API对象
    
    // 如果微信JSSDK已存在则直接返回
    if (!global.jWeixin) {
        // API名称映射表 - 微信内部API到公开API的映射
        apiMap = {
            config: "preVerifyJSAPI",
            onMenuShareTimeline: "menu:share:timeline",
            onMenuShareAppMessage: "menu:share:appmessage",
            onMenuShareQQ: "menu:share:qq",
            onMenuShareWeibo: "menu:share:weiboApp",
            onMenuShareQZone: "menu:share:QZone",
            previewImage: "imagePreview",
            getLocation: "geoLocation",
            openProductSpecificView: "openProductViewWithPid",
            addCard: "batchAddCard",
            openCard: "batchViewCard",
            chooseWXPay: "getBrandWCPayRequest",
            openEnterpriseRedPacket: "getRecevieBizHongBaoRequest",
            startSearchBeacons: "startMonitoringBeacons",
            stopSearchBeacons: "stopMonitoringBeacons",
            onSearchBeacons: "onBeaconsInRange",
            consumeAndShareCard: "consumedShareCard",
            openAddress: "editAddress"
        };
        
        // 反向API映射表 - 从微信内部API到公开API的反向映射
        reverseApiMap = (() => {
            const map = {};
            for (const publicApi in apiMap) {
                map[apiMap[publicApi]] = publicApi;
            }
            return map;
        })();
        
        // 获取当前页面标题
        documentTitle = (document = global.document).title;
        
        // 获取客户端信息
        userAgent = navigator.userAgent.toLowerCase();
        platform = navigator.platform.toLowerCase();
        isDesktop = !(platform.match("mac") || platform.match("win"));
        isDebugMode = userAgent.indexOf("wxdebugger") !== -1;
        isInWechat = userAgent.indexOf("micromessenger") !== -1;
        isAndroid = userAgent.indexOf("android") !== -1;
        isIOS = userAgent.indexOf("iphone") !== -1 || userAgent.indexOf("ipad") !== -1;
        
        // 获取微信版本号
        wechatVersion = (matchResult = userAgent.match(/micromessenger\/(\d+\.\d+\.\d+)/) || userAgent.match(/micromessenger\/(\d+\.\d+)/)) 
            ? matchResult[1] : "";
        
        // 性能指标记录
        performanceMetrics = {
            initStartTime: getTimestamp(),  // 初始化开始时间
            initEndTime: 0,                 // 初始化结束时间
            preVerifyStartTime: 0,          // 预验证开始时间
            preVerifyEndTime: 0             // 预验证结束时间
        };
        
        // 上报数据
        reportData = {
            version: 1,                     // 版本号
            appId: "",                      // 应用ID
            initTime: 0,                    // 初始化耗时
            preVerifyTime: 0,               // 预验证耗时
            networkType: "",                // 网络类型
            isPreVerifyOk: 1,               // 预验证是否成功
            systemType: isIOS ? 1 : isAndroid ? 2 : -1, // 系统类型
            clientVersion: wechatVersion,   // 客户端版本
            url: encodeURIComponent(location.href) // 当前URL
        };
        
        // 配置选项
        configOptions = {};
        
        // 就绪回调队列
        readyCallbacks = { _completes: [] };
        
        // 配置状态
        configStatus = { state: 0, data: {} };
        
        // 本地图片数据处理状态和队列
        isLocalImgDataBusy = false;
        localImgDataQueue = [];
        
        // 创建微信API对象
        wechatAPI = {
            // 配置微信JSSDK
            config: function(options) {
                logApiCall("config", configOptions = options);
                
                // 是否进行API检查
                const shouldCheck = options.check !== false;
                
                // 异步执行配置逻辑
                asyncExec(function() {
                    if (shouldCheck) {
                        // 调用预验证API
                        invokeApi(apiMap.config, { verifyJsApiList: mapApiList(options.jsApiList) }, {
                            _complete: function(result) {
                                performanceMetrics.preVerifyEndTime = getTimestamp();
                                configStatus.state = 1;
                                configStatus.data = result;
                            },
                            success: function() {
                                reportData.isPreVerifyOk = 0;
                            },
                            fail: function(error) {
                                readyCallbacks._fail ? readyCallbacks._fail(error) : configStatus.state = -1;
                            },
                            // 预验证完成后的回调
                            complete: function() {
                                const callbacks = readyCallbacks._completes;
                                for (let i = 0, len = callbacks.length; i < len; ++i) {
                                    callbacks[i]();
                                }
                                readyCallbacks._completes = [];
                                
                                // 非桌面端、非调试模式下收集性能数据
                                if (!isDesktop && !isDebugMode && !options.debug && 
                                    wechatVersion >= "6.0.2" && reportData.systemType >= 0) {
                                    reportData.appId = options.appId;
                                    reportData.initTime = performanceMetrics.initEndTime - performanceMetrics.initStartTime;
                                    reportData.preVerifyTime = performanceMetrics.preVerifyEndTime - performanceMetrics.preVerifyStartTime;
                                    
                                    // 获取网络类型并上报
                                    wechatAPI.getNetworkType({
                                        isInnerInvoke: true,
                                        success: function(result) {
                                            reportData.networkType = result.networkType;
                                            const img = new Image();
                                            img.src = "https://open.weixin.qq.com/sdk/report?v=" + reportData.version +
                                                "&o=" + reportData.isPreVerifyOk +
                                                "&s=" + reportData.systemType +
                                                "&c=" + reportData.clientVersion +
                                                "&a=" + reportData.appId +
                                                "&n=" + reportData.networkType +
                                                "&i=" + reportData.initTime +
                                                "&p=" + reportData.preVerifyTime +
                                                "&u=" + reportData.url;
                                        }
                                    });
                                }
                            }
                        });
                        performanceMetrics.preVerifyStartTime = getTimestamp();
                    } else {
                        // 不进行预验证,直接标记配置完成
                        configStatus.state = 1;
                        const callbacks = readyCallbacks._completes;
                        for (let i = 0, len = callbacks.length; i < len; ++i) {
                            callbacks[i]();
                        }
                        readyCallbacks._completes = [];
                    }
                });
            },
            
            // 微信JSSDK就绪回调
            ready: function(callback) {
                // 配置已完成或不在微信环境中直接执行回调
                (configStatus.state !== 0 || (readyCallbacks._completes.push(callback), !isInWechat && configOptions.debug)) && callback();
            },
            
            // 微信JSSDK错误回调
            error: function(callback) {
                if (wechatVersion < "6.0.2") return;
                configStatus.state === -1 ? callback(configStatus.data) : readyCallbacks._fail = callback;
            },
            
            // 检查JS API可用性
            checkJsApi: function(options) {
                invokeApi("checkJsApi", { jsApiList: mapApiList(options.jsApiList) }, {
                    _complete: function(result) {
                        // 安卓设备需要解析JSON结果
                        if (isAndroid && (jsonResult = result.checkResult)) {
                            result.checkResult = JSON.parse(jsonResult);
                        }
                        
                        // 将内部API名称映射为公开API名称
                        const checkResult = result.checkResult;
                        for (const innerApi in checkResult) {
                            const publicApi = reverseApiMap[innerApi];
                            publicApi && (checkResult[publicApi] = checkResult[innerApi], delete checkResult[innerApi]);
                        }
                    },
                    // 将处理后的结果传递给原始回调
                    ...options
                });
            },
            
            // 分享到朋友圈
            onMenuShareTimeline: function(options) {
                listenApiEvent(apiMap.onMenuShareTimeline, {
                    complete: function() {
                        invokeApi("shareTimeline", {
                            title: options.title || documentTitle,
                            desc: options.title || documentTitle,
                            img_url: options.imgUrl || "",
                            link: options.link || location.href,
                            type: options.type || "link",
                            data_url: options.dataUrl || ""
                        }, options);
                    }
                }, options);
            },
            
            // 分享给朋友
            onMenuShareAppMessage: function(options) {
                listenApiEvent(apiMap.onMenuShareAppMessage, {
                    complete: function(result) {
                        // 根据分享场景处理
                        if ("favorite" === result.scene) {
                            invokeApi("sendAppMessage", {
                                title: options.title || documentTitle,
                                desc: options.desc || "",
                                link: options.link || location.href,
                                img_url: options.imgUrl || "",
                                type: options.type || "link",
                                data_url: options.dataUrl || ""
                            });
                        } else {
                            invokeApi("sendAppMessage", {
                                title: options.title || documentTitle,
                                desc: options.desc || "",
                                link: options.link || location.href,
                                img_url: options.imgUrl || "",
                                type: options.type || "link",
                                data_url: options.dataUrl || ""
                            }, options);
                        }
                    }
                }, options);
            },
            
            // 分享到QQ
            onMenuShareQQ: function(options) {
                listenApiEvent(apiMap.onMenuShareQQ, {
                    complete: function() {
                        invokeApi("shareQQ", {
                            title: options.title || documentTitle,
                            desc: options.desc || "",
                            img_url: options.imgUrl || "",
                            link: options.link || location.href
                        }, options);
                    }
                }, options);
            },
            
            // 分享到微博
            onMenuShareWeibo: function(options) {
                listenApiEvent(apiMap.onMenuShareWeibo, {
                    complete: function() {
                        invokeApi("shareWeiboApp", {
                            title: options.title || documentTitle,
                            desc: options.desc || "",
                            img_url: options.imgUrl || "",
                            link: options.link || location.href
                        }, options);
                    }
                }, options);
            },
            
            // 分享到QQ空间
            onMenuShareQZone: function(options) {
                listenApiEvent(apiMap.onMenuShareQZone, {
                    complete: function() {
                        invokeApi("shareQZone", {
                            title: options.title || documentTitle,
                            desc: options.desc || "",
                            img_url: options.imgUrl || "",
                            link: options.link || location.href
                        }, options);
                    }
                }, options);
            },
            
            // 开始录音
            startRecord: function(options) {
                invokeApi("startRecord", {}, options);
            },
            
            // 停止录音
            stopRecord: function(options) {
                invokeApi("stopRecord", {}, options);
            },
            
            // 录音结束回调
            onVoiceRecordEnd: function(options) {
                listenApiEvent("onVoiceRecordEnd", options);
            },
            
            // 播放语音
            playVoice: function(options) {
                invokeApi("playVoice", { localId: options.localId }, options);
            },
            
            // 暂停语音
            pauseVoice: function(options) {
                invokeApi("pauseVoice", { localId: options.localId }, options);
            },
            
            // 停止语音
            stopVoice: function(options) {
                invokeApi("stopVoice", { localId: options.localId }, options);
            },
            
            // 语音播放结束回调
            onVoicePlayEnd: function(options) {
                listenApiEvent("onVoicePlayEnd", options);
            },
            
            // 上传语音
            uploadVoice: function(options) {
                invokeApi("uploadVoice", {
                    localId: options.localId,
                    isShowProgressTips: options.isShowProgressTips === 0 ? 0 : 1
                }, options);
            },
            
            // 下载语音
            downloadVoice: function(options) {
                invokeApi("downloadVoice", {
                    serverId: options.serverId,
                    isShowProgressTips: options.isShowProgressTips === 0 ? 0 : 1
                }, options);
            },
            
            // 语音翻译
            translateVoice: function(options) {
                invokeApi("translateVoice", {
                    localId: options.localId,
                    isShowProgressTips: options.isShowProgressTips === 0 ? 0 : 1
                }, options);
            },
            
            // 选择图片
            chooseImage: function(options) {
                invokeApi("chooseImage", {
                    scene: "1|2",
                    count: options.count || 9,
                    sizeType: options.sizeType || ["original", "compressed"],
                    sourceType: options.sourceType || ["album", "camera"]
                }, {
                    _complete: function(result) {
                        // 安卓设备需要解析localIds
                        if (isAndroid) {
                            let localIds = result.localIds;
                            try {
                                localIds && (result.localIds = JSON.parse(localIds));
                            } catch (e) {
                                // 解析失败处理
                            }
                        }
                    },
                    ...options
                });
            },
            
            // 获取位置信息
            getLocation: function(options) {
                options = options || {};
                invokeApi(apiMap.getLocation, { type: options.type || "wgs84" }, {
                    _complete: function(result) {
                        delete result.type;
                    },
                    ...options
                });
            },
            
            // 预览图片
            previewImage: function(options) {
                invokeApi(apiMap.previewImage, {
                    current: options.current,
                    urls: options.urls
                }, options);
            },
            
            // 上传图片
            uploadImage: function(options) {
                invokeApi("uploadImage", {
                    localId: options.localId,
                    isShowProgressTips: options.isShowProgressTips === 0 ? 0 : 1
                }, options);
            },
            
            // 下载图片
            downloadImage: function(options) {
                invokeApi("downloadImage", {
                    serverId: options.serverId,
                    isShowProgressTips: options.isShowProgressTips === 0 ? 0 : 1
                }, options);
            },
            
            // 获取本地图片数据
            getLocalImgData: function(options) {
                // 检查是否忙碌,避免并发处理
                if (!isLocalImgDataBusy) {
                    isLocalImgDataBusy = true;
                    invokeApi("getLocalImgData", { localId: options.localId }, {
                        _complete: function(result) {
                            isLocalImgDataBusy = false;
                            // 处理队列中的下一个请求
                            if (localImgDataQueue.length > 0) {
                                const nextOptions = localImgDataQueue.shift();
                                wechatAPI.getLocalImgData(nextOptions);
                            }
                        },
                        ...options
                    });
                } else {
                    // 忙碌时加入队列
                    localImgDataQueue.push(options);
                }
            },
            
            // 获取网络类型
            getNetworkType: function(options) {
                invokeApi("getNetworkType", {}, {
                    _complete: function(result) {
                        // 处理网络类型结果
                        const errMsg = result.errMsg;
                        let subtype = result.subtype;
                        delete result.subtype;
                        
                        if (subtype) {
                            result.networkType = subtype;
                        } else {
                            const separatorIndex = errMsg.indexOf(":");
                            const typeStr = errMsg.substring(separatorIndex + 1);
                            
                            switch (typeStr) {
                                case "wifi":
                                case "edge":
                                case "wwan":
                                    result.networkType = typeStr;
                                    break;
                                default:
                                    result.errMsg = "getNetworkType:fail";
                            }
                        }
                    },
                    ...options
                });
            },
            
            // 打开位置
            openLocation: function(options) {
                invokeApi("openLocation", {
                    latitude: options.latitude,
                    longitude: options.longitude,
                    name: options.name || "",
                    address: options.address || "",
                    scale: options.scale || 28,
                    infoUrl: options.infoUrl || ""
                }, options);
            },
            
            // 隐藏选项菜单
            hideOptionMenu: function(options) {
                invokeApi("hideOptionMenu", {}, options);
            },
            
            // 显示选项菜单
            showOptionMenu: function(options) {
                invokeApi("showOptionMenu", {}, options);
            },
            
            // 关闭窗口
            closeWindow: function(options) {
                invokeApi("closeWindow", {}, options = options || {});
            },
            
            // 隐藏菜单项
            hideMenuItems: function(options) {
                invokeApi("hideMenuItems", { menuList: options.menuList }, options);
            },
            
            // 显示菜单项
            showMenuItems: function(options) {
                invokeApi("showMenuItems", { menuList: options.menuList }, options);
            },
            
            // 隐藏所有非基础菜单项
            hideAllNonBaseMenuItem: function(options) {
                invokeApi("hideAllNonBaseMenuItem", {}, options);
            },
            
            // 显示所有非基础菜单项
            showAllNonBaseMenuItem: function(options) {
                invokeApi("showAllNonBaseMenuItem", {}, options);
            },
            
            // 扫描二维码
            scanQRCode: function(options) {
                options = options || {};
                invokeApi("scanQRCode", {
                    needResult: options.needResult || 0,
                    scanType: options.scanType || ["qrCode", "barCode"]
                }, {
                    _complete: function(result) {
                        // iOS设备需要解析结果
                        if (isIOS) {
                            let resultStr = result.resultStr;
                            if (resultStr) {
                                resultStr = JSON.parse(resultStr);
                                result.resultStr = resultStr && resultStr.scan_code && resultStr.scan_code.scan_result;
                            }
                        }
                    },
                    ...options
                });
            },
            
            // 打开地址
            openAddress: function(options) {
                invokeApi(apiMap.openAddress, {}, {
                    _complete: function(result) {
                        // 规范化地址信息字段
                        result.postalCode = result.addressPostalCode;
                        delete result.addressPostalCode;
                        result.provinceName = result.proviceFirstStageName;
                        delete result.proviceFirstStageName;
                        result.cityName = result.addressCitySecondStageName;
                        delete result.addressCitySecondStageName;
                        result.countryName = result.addressCountiesThirdStageName;
                        delete result.addressCountiesThirdStageName;
                        result.detailInfo = result.addressDetailInfo;
                        delete result.addressDetailInfo;
                    },
                    ...options
                });
            },
            
            // 打开商品详情
            openProductSpecificView: function(options) {
                invokeApi(apiMap.openProductSpecificView, {
                    pid: options.productId,
                    view_type: options.viewType || 0,
                    ext_info: options.extInfo
                }, options);
            },
            
            // 添加卡券
            addCard: function(options) {
                const cardList = options.cardList;
                const formattedCardList = [];
                
                // 格式化卡券列表
                for (let i = 0, len = cardList.length; i < len; ++i) {
                    const card = cardList[i];
                    formattedCardList.push({
                        card_id: card.cardId,
                        card_ext: card.cardExt
                    });
                }
                
                invokeApi(apiMap.addCard, { card_list: formattedCardList }, {
                    _complete: function(result) {
                        // 解析卡券结果
                        if (cardListResult = result.card_list) {
                            cardListResult = JSON.parse(cardListResult);
                            for (let i = 0, len = cardListResult.length; i < len; ++i) {
                                const card = cardListResult[i];
                                card.cardId = card.card_id;
                                card.cardExt = card.card_ext;
                                card.isSuccess = !!card.is_succ;
                                delete card.card_id;
                                delete card.card_ext;
                                delete card.is_succ;
                            }
                            result.cardList = cardListResult;
                            delete result.card_list;
                        }
                    },
                    ...options
                });
            },
            
            // 选择卡券
            chooseCard: function(options) {
                invokeApi("chooseCard", {
                    app_id: configOptions.appId,
                    location_id: options.shopId || "",
                    sign_type: options.signType || "SHA1",
                    card_id: options.cardId || "",
                    card_type: options.cardType || "",
                    card_sign: options.cardSign,
                    time_stamp: options.timestamp + "",
                    nonce_str: options.nonceStr
                }, {
                    _complete: function(result) {
                        result.cardList = result.choose_card_info;
                        delete result.choose_card_info;
                    },
                    ...options
                });
            },
            
            // 打开卡券
            openCard: function(options) {
                const cardList = options.cardList;
                const formattedCardList = [];
                
                // 格式化卡券列表
                for (let i = 0, len = cardList.length; i < len; ++i) {
                    const card = cardList[i];
                    formattedCardList.push({
                        card_id: card.cardId,
                        code: card.code
                    });
                }
                
                invokeApi(apiMap.openCard, { card_list: formattedCardList }, options);
            },
            
            // 消费并分享卡券
            consumeAndShareCard: function(options) {
                invokeApi(apiMap.consumeAndShareCard, {
                    consumedCardId: options.cardId,
                    consumedCode: options.code
                }, options);
            },
            
            // 微信支付
            chooseWXPay: function(options) {
                invokeApi(apiMap.chooseWXPay, formatPaymentParams(options), options);
            },
            
            // 打开企业红包
            openEnterpriseRedPacket: function(options) {
                invokeApi(apiMap.openEnterpriseRedPacket, formatPaymentParams(options), options);
            },
            
            // 开始搜索iBeacon
            startSearchBeacons: function(options) {
                invokeApi(apiMap.startSearchBeacons, { ticket: options.ticket }, options);
            },
            
            // 停止搜索iBeacon
            stopSearchBeacons: function(options) {
                invokeApi(apiMap.stopSearchBeacons, {}, options);
            },
            
            // iBeacon搜索结果回调
            onSearchBeacons: function(options) {
                listenApiEvent(apiMap.onSearchBeacons, options);
            },
            
            // 打开企业会话
            openEnterpriseChat: function(options) {
                invokeApi("openEnterpriseChat", {
                    useridlist: options.userIds,
                    chatname: options.groupName
                }, options);
            },
            
            // 启动小程序
            launchMiniProgram: function(options) {
                invokeApi("launchMiniProgram", {
                    targetAppId: options.targetAppId,
                    path: formatMiniProgramPath(options.path),
                    envVersion: options.envVersion
                }, options);
            },
            
            // 小程序相关API
            miniProgram: {
                // 返回上一页
                navigateBack: function(options) {
                    options = options || {};
                    asyncExec(function() {
                        invokeApi("invokeMiniProgramAPI", {
                            name: "navigateBack",
                            arg: { delta: options.delta || 1 }
                        }, options);
                    });
                },
                
                // 导航到新页面
                navigateTo: function(options) {
                    asyncExec(function() {
                        invokeApi("invokeMiniProgramAPI", {
                            name: "navigateTo",
                            arg: { url: options.url }
                        }, options);
                    });
                },
                
                // 重定向到新页面
                redirectTo: function(options) {
                    asyncExec(function() {
                        invokeApi("invokeMiniProgramAPI", {
                            name: "redirectTo",
                            arg: { url: options.url }
                        }, options);
                    });
                },
                
                // 切换Tab
                switchTab: function(options) {
                    asyncExec(function() {
                        invokeApi("invokeMiniProgramAPI", {
                            name: "switchTab",
                            arg: { url: options.url }
                        }, options);
                    });
                },
                
                // 重新加载
                reLaunch: function(options) {
                    asyncExec(function() {
                        invokeApi("invokeMiniProgramAPI", {
                            name: "reLaunch",
                            arg: { url: options.url }
                        }, options);
                    });
                },
                
                // 发送消息
                postMessage: function(options) {
                    asyncExec(function() {
                        invokeApi("invokeMiniProgramAPI", {
                            name: "postMessage",
                            arg: options.data || {}
                        }, options);
                    });
                },
                
                // 获取环境信息
                getEnv: function(callback) {
                    asyncExec(function() {
                        callback({ miniprogram: "miniprogram" === global.__wxjs_environment });
                    });
                }
            }
        };
        
        // 资源加载错误处理
        let nextResourceId = 1;
        const resourceErrorMap = {};
        
        // 监听资源加载错误事件
        document.addEventListener("error", function(event) {
            let target, tagName, src;
            
            // 非移动设备或非媒体资源不处理
            if (!isAndroid || !(target = event.target) || 
                !((tagName = target.tagName), (src = target.src), 
                  ["IMG", "VIDEO", "AUDIO", "SOURCE"].includes(tagName)) || 
                !src.includes("wxlocalresource://")) {
                return;
            }
            
            // 阻止默认事件
            event.preventDefault();
            event.stopPropagation();
            
            // 获取或分配资源ID
            let resourceId = target["wx-id"];
            if (!resourceId) {
                resourceId = nextResourceId++;
                target["wx-id"] = resourceId;
            }
            
            // 避免重复处理
            if (!resourceErrorMap[resourceId]) {
                resourceErrorMap[resourceId] = true;
                
                // 微信SDK就绪后获取本地图片数据
                wechatAPI.ready(function() {
                    wechatAPI.getLocalImgData({
                        localId: src,
                        success: function(result) {
                            target.src = result.localData;
                        }
                    });
                });
            }
        }, true);
        
        // 监听资源加载完成事件
        document.addEventListener("load", function(event) {
            let target, tagName;
            
            // 非移动设备或非媒体资源不处理
            if (!isAndroid || !(target = event.target) || 
                !["IMG", "VIDEO", "AUDIO", "SOURCE"].includes(tagName = target.tagName)) {
                return;
            }
            
            // 清除错误标记
            const resourceId = target["wx-id"];
            if (resourceId) {
                resourceErrorMap[resourceId] = false;
            }
        }, true);
        
        // 暴露微信API到全局作用域
        if (isExpose) {
            global.wx = global.jWeixin = wechatAPI;
        }
        
        // 初始化完成时间记录
        performanceMetrics.initEndTime = getTimestamp();
        
        return wechatAPI;
    }
    
    // 辅助函数:获取当前时间戳
    function getTimestamp() {
        return (new Date()).getTime();
    }
    
    // 辅助函数:异步执行
    function asyncExec(callback) {
        if (isInWechat) {
            if (global.WeixinJSBridge) {
                callback();
            } else if (document.addEventListener) {
                document.addEventListener("WeixinJSBridgeReady", callback, false);
            }
        }
    }
    
    // 辅助函数:调用微信API
    function invokeApi(apiName, params, callbacks) {
        if (global.WeixinJSBridge) {
            WeixinJSBridge.invoke(apiName, formatRequestParams(params), function(result) {
                processApiResult(apiName, result, callbacks);
            });
        } else {
            logApiCall(apiName, callbacks);
        }
    }
    
    // 辅助函数:监听微信API事件
    function listenApiEvent(eventName, callbacks, originalOptions) {
        if (global.WeixinJSBridge) {
            WeixinJSBridge.on(eventName, function(result) {
                originalOptions && originalOptions.trigger && originalOptions.trigger(result);
                processApiResult(eventName, result, callbacks);
            });
        } else {
            logApiCall(eventName, originalOptions || callbacks);
        }
    }
    
    // 辅助函数:格式化请求参数
    function formatRequestParams(params) {
        params = params || {};
        params.appId = configOptions.appId;
        params.verifyAppId = configOptions.appId;
        params.verifySignType = "sha1";
        params.verifyTimestamp = configOptions.timestamp + "";
        params.verifyNonceStr = configOptions.nonceStr;
        params.verifySignature = configOptions.signature;
        return params;
    }
    
    // 辅助函数:格式化支付参数
    function formatPaymentParams(options) {
        return {
            timeStamp: options.timestamp + "",
            nonceStr: options.nonceStr,
            package: options.package,
            paySign: options.paySign,
            signType: options.signType || "SHA1"
        };
    }
    
    // 辅助函数:处理API结果
    function processApiResult(apiName, result, callbacks) {
        // 规范化错误码
        if ("openEnterpriseChat" === apiName) {
            result.errCode = result.err_code;
        }
        delete result.err_code;
        delete result.err_desc;
        delete result.err_detail;
        
        // 解析错误消息
        let errMsg = result.errMsg || "";
        if (!errMsg) {
            errMsg = result.err_msg;
            delete result.err_msg;
        }
        
        // 规范化错误消息格式
        errMsg = normalizeErrorMessage(apiName, errMsg);
        result.errMsg = errMsg;
        
        // 执行完成回调
        if (callbacks && callbacks._complete) {
            callbacks._complete(result);
            delete callbacks._complete;
        }
        
        // 调试模式下显示结果
        if (configOptions.debug && !(callbacks && callbacks.isInnerInvoke)) {
            alert(JSON.stringify(result));
        }
        
        // 根据结果状态执行相应回调
        const separatorIndex = errMsg.indexOf(":");
        const status = errMsg.substring(separatorIndex + 1);
        
        switch (status) {
            case "ok":
                callbacks && callbacks.success && callbacks.success(result);
                break;
            case "cancel":
                callbacks && callbacks.cancel && callbacks.cancel(result);
                break;
            default:
                callbacks && callbacks.fail && callbacks.fail(result);
        }
        
        // 执行完成回调
        callbacks && callbacks.complete && callbacks.complete(result);
    }
    
    // 辅助函数:映射API列表
    function mapApiList(apiList) {
        if (apiList) {
            for (let i = 0, len = apiList.length; i < len; ++i) {
                let apiName = apiList[i];
                const innerApiName = apiMap[apiName];
                innerApiName && (apiList[i] = innerApiName);
            }
            return apiList;
        }
    }
    
    // 辅助函数:记录API调用
    function logApiCall(apiName, options) {
        if (!configOptions.debug || (options && options.isInnerInvoke)) return;
        
        // 将内部API名称映射为公开API名称
        let publicApiName = reverseApiMap[apiName] || apiName;
        
        // 移除内部回调
        if (options && options._complete) {
            const newOptions = { ...options };
            delete newOptions._complete;
            console.log('"' + publicApiName + '",', newOptions || "");
        } else {
            console.log('"' + publicApiName + '",', options || "");
        }
    }
    
    // 辅助函数:规范化错误消息
    function normalizeErrorMessage(apiName, errMsg) {
        let status = "ok";
        let message = errMsg;
        
        if (message) {
            const separatorIndex = message.indexOf(":");
            if (separatorIndex !== -1) {
                status = message.substring(separatorIndex + 1).toLowerCase();
                
                // 处理特殊错误情况
                if ("access denied" === status || "no permission to execute" === status) {
                    status = "permission denied";
                }
                
                // 移除错误前缀
                status = status.replace(/^(failed|fail)_/, "");
                status = status.replace(/_/g, " ");
            } else {
                status = "fail";
            }
        }
        
        // 特殊处理config API的错误
        if ("config" === apiName && "function not exist" === status) {
            status = "ok";
        }
        
        return apiName + ":" + status;
    }
    
    // 辅助函数:格式化小程序路径
    function formatMiniProgramPath(path) {
        if (typeof path === "string" && path.length > 0) {
            let basePath = path.split("?")[0];
            basePath += ".html";
            const queryString = path.split("?")[1];
            return queryString ? basePath + "?" + queryString : basePath;
        }
    }
});