fix(utils): 修复解析小程序消息时URL清理逻辑

处理weappiconurl时,统一替换特殊字符和CDATA标记,确保thumburl正确生成
This commit is contained in:
超级老白兔
2025-09-09 14:45:16 +08:00
parent 983dbf0009
commit 7853a3ff97

View File

@@ -165,74 +165,86 @@ export function parseWeappMsgStr(inputStr: string): any {
try {
// 1. 解析外层JSON
const outerJson = JSON.parse(inputStr);
// 2. 检查必要字段
if (!outerJson.contentXml || outerJson.type !== "miniprogram") {
throw new Error("Invalid miniprogram message format");
}
// 3. 解析内层XML为JSON
const xmlContent = outerJson.contentXml;
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlContent, "text/xml");
// 检查XML解析是否成功
if (xmlDoc.getElementsByTagName("parsererror").length > 0) {
throw new Error("XML parsing failed");
}
// 4. 提取XML中的关键信息
const msgElement = xmlDoc.getElementsByTagName("msg")[0];
const appmsgElement = xmlDoc.getElementsByTagName("appmsg")[0];
const weappinfoElement = xmlDoc.getElementsByTagName("weappinfo")[0];
if (!msgElement || !appmsgElement) {
throw new Error("Invalid XML structure");
}
// 5. 构建appmsg对象
const appmsg: any = {
title: appmsgElement.getElementsByTagName("title")[0]?.textContent || "",
des: appmsgElement.getElementsByTagName("des")[0]?.textContent || "",
type: appmsgElement.getElementsByTagName("type")[0]?.textContent || "",
sourcedisplayname: appmsgElement.getElementsByTagName("sourcedisplayname")[0]?.textContent || "",
appname: appmsgElement.getElementsByTagName("appname")[0]?.textContent || ""
sourcedisplayname:
appmsgElement.getElementsByTagName("sourcedisplayname")[0]
?.textContent || "",
appname:
appmsgElement.getElementsByTagName("appname")[0]?.textContent || "",
};
// 6. 处理weappinfo信息
if (weappinfoElement) {
appmsg.weappinfo = {
username: weappinfoElement.getElementsByTagName("username")[0]?.textContent || "",
appid: weappinfoElement.getElementsByTagName("appid")[0]?.textContent || "",
type: weappinfoElement.getElementsByTagName("type")[0]?.textContent || "",
version: weappinfoElement.getElementsByTagName("version")[0]?.textContent || "",
weappiconurl: weappinfoElement.getElementsByTagName("weappiconurl")[0]?.textContent || "",
pagepath: weappinfoElement.getElementsByTagName("pagepath")[0]?.textContent || ""
username:
weappinfoElement.getElementsByTagName("username")[0]?.textContent ||
"",
appid:
weappinfoElement.getElementsByTagName("appid")[0]?.textContent || "",
type:
weappinfoElement.getElementsByTagName("type")[0]?.textContent || "",
version:
weappinfoElement.getElementsByTagName("version")[0]?.textContent ||
"",
weappiconurl:
weappinfoElement.getElementsByTagName("weappiconurl")[0]
?.textContent || "",
pagepath:
weappinfoElement.getElementsByTagName("pagepath")[0]?.textContent ||
"",
};
// 处理thumburl - 从weappiconurl中提取
const weappiconurl = appmsg.weappinfo.weappiconurl;
if (weappiconurl && weappiconurl.includes('http')) {
if (weappiconurl && weappiconurl.includes("http")) {
// 清理URL中的特殊字符和CDATA标记
appmsg.weappinfo.thumburl = weappiconurl
.replace(/<!\[CDATA\[|\]\]>/g, '')
.replace(/[`"']/g, '')
.replace(/&amp;/g, '&')
.replace(/<!\[CDATA\[|\]\]>/g, "")
.replace(/[`"']/g, "")
.replace(/&amp;/g, "&")
.trim();
} else {
appmsg.weappinfo.thumburl = "";
}
}
// 7. 合并结果
const result = {
...outerJson,
type: "miniprogram",
appmsg
appmsg,
};
return result;
} catch (error) {
console.error("parseWeappMsgStr error:", error);
throw new Error(`Failed to parse miniprogram message: ${error.message}`);