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;
}
}
});