fix(utils): 修复解析小程序消息时URL清理逻辑
处理weappiconurl时,统一替换特殊字符和CDATA标记,确保thumburl正确生成
This commit is contained in:
@@ -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(/&/g, '&')
|
||||
.replace(/<!\[CDATA\[|\]\]>/g, "")
|
||||
.replace(/[`"']/g, "")
|
||||
.replace(/&/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}`);
|
||||
|
||||
Reference in New Issue
Block a user