zhuli 1 nedēļu atpakaļ
vecāks
revīzija
482644d9ea
1 mainītis faili ar 110 papildinājumiem un 34 dzēšanām
  1. 110 34
      HBuilderProjects/shareDynamic.html

+ 110 - 34
HBuilderProjects/shareDynamic.html

@@ -801,30 +801,77 @@
 			return pathPart.replace(/^\/+/, '');
 			return pathPart.replace(/^\/+/, '');
 		}
 		}
 
 
-		function buildAppOpenQueryStringMerged() {
-			var params = mergeSearchAndHashParams();
+		function appendFromShareDynamicToRaw(qs) {
+			var s = String(qs || '').trim();
+			if (!s) return 'fromShareDynamic=1';
+			var pad = '&' + s + '&';
+			if (/[&?](fromShareDynamic|FROMSHAREDYNAMIC)=/i.test(pad)) return s;
+			return s + '&fromShareDynamic=1';
+		}
 
 
-			/**
-			 * 唤起 newdetails 与 H5 **query 原样一致**:用浏览器地址栏原始串 + `fromShareDynamic=1`,
-			 * 避免 item 经 JSON.stringify / URLSearchParams 再编码与微信落地链不一致。
-			 * 仅「仅有 search」或「仅有 hash 内 ? 段」时走此路径;二者皆有或皆无则走下方补全。
-			 */
-			var rawSearch = location.search && location.search.length > 1 ? location.search.slice(1) : '';
+		function rawQueryHasItem(qs) {
+			return /(?:^|&)item=/i.test('&' + String(qs || '') + '&');
+		}
+
+		/**
+		 * 分享链常把完整 query 放在 hash:#/pages/newdetails/index?item=%257B…&needShowMore=true&fromHomeFeed=1
+		 * 优先取含 item 的原始串,避免 URLSearchParams 截断 item 内 & 或二次编码不一致。
+		 */
+		function getRawShareQueryForAppOpen() {
+			var rawSearch =
+				location.search && location.search.length > 1 ? location.search.slice(1) : '';
 			var hash0 = location.hash || '';
 			var hash0 = location.hash || '';
 			var hqi0 = hash0.indexOf('?');
 			var hqi0 = hash0.indexOf('?');
 			var rawHashQ = hqi0 >= 0 ? hash0.slice(hqi0 + 1) : '';
 			var rawHashQ = hqi0 >= 0 ? hash0.slice(hqi0 + 1) : '';
-			function appendFromShareDynamicToRaw(qs) {
-				var s = String(qs || '').trim();
-				if (!s) return 'fromShareDynamic=1';
-				var pad = '&' + s + '&';
-				if (/[&?](fromShareDynamic|FROMSHAREDYNAMIC)=/i.test(pad)) return s;
-				return s + '&fromShareDynamic=1';
+			var hashPath = extractUniPagePathFromHash();
+			var isNewdetailsHash = hashPath && /newdetails/i.test(hashPath);
+
+			if (isNewdetailsHash && rawHashQ && rawQueryHasItem(rawHashQ)) {
+				return rawHashQ;
+			}
+			if (rawSearch && rawQueryHasItem(rawSearch)) {
+				return rawSearch;
+			}
+			if (isNewdetailsHash && rawHashQ) {
+				return rawHashQ;
 			}
 			}
 			if (rawSearch && !rawHashQ) {
 			if (rawSearch && !rawHashQ) {
-				return '?' + appendFromShareDynamicToRaw(rawSearch);
+				return rawSearch;
 			}
 			}
 			if (!rawSearch && rawHashQ) {
 			if (!rawSearch && rawHashQ) {
-				return '?' + appendFromShareDynamicToRaw(rawHashQ);
+				return rawHashQ;
+			}
+			return '';
+		}
+
+		/** App shopro / wx extinfo:item 须双重 URL 编码;若已是 %257B… 则不再编码 */
+		function formatItemForShoproQuery(rawItem) {
+			var s = String(rawItem || '').trim();
+			if (!s) return '';
+			if (/^%25(?:7B|5B|22)/i.test(s)) {
+				return s;
+			}
+			if (/^%7B/i.test(s)) {
+				return encodeURIComponent(s);
+			}
+			var parsed = tryParseJsonObject(s);
+			if (parsed) {
+				try {
+					return encodeURIComponent(encodeURIComponent(JSON.stringify(parsed)));
+				} catch (eJson) {}
+			}
+			if (s.charAt(0) === '{' || s.charAt(0) === '[') {
+				return encodeURIComponent(encodeURIComponent(s));
+			}
+			return encodeURIComponent(encodeURIComponent(s));
+		}
+
+		function buildAppOpenQueryStringMerged() {
+			var params = mergeSearchAndHashParams();
+
+			var rawQs = getRawShareQueryForAppOpen();
+			if (rawQs) {
+				return '?' + appendFromShareDynamicToRaw(rawQs);
 			}
 			}
 
 
 			/** newdetails onLoad:仅当地址栏未带 item 时补全;同时按需补顶层 imagePath */
 			/** newdetails onLoad:仅当地址栏未带 item 时补全;同时按需补顶层 imagePath */
@@ -921,13 +968,14 @@
 			 * newdetails 在 fromShareDynamic=1 时忽略其「首页种子」语义。
 			 * newdetails 在 fromShareDynamic=1 时忽略其「首页种子」语义。
 			 */
 			 */
 			params.delete('fromShareDynamic');
 			params.delete('fromShareDynamic');
-			var itemForShopro = params.get('item');
+			var itemForShopro = '';
+			try {
+				itemForShopro = getMergedParam('item');
+			} catch (eGi) {
+				itemForShopro = '';
+			}
 			if (!itemForShopro || String(itemForShopro).trim() === '') {
 			if (!itemForShopro || String(itemForShopro).trim() === '') {
-				try {
-					itemForShopro = getMergedParam('item');
-				} catch (eGi) {
-					itemForShopro = '';
-				}
+				itemForShopro = params.get('item') || '';
 			}
 			}
 			var nsmRaw = params.get('needShowMore');
 			var nsmRaw = params.get('needShowMore');
 			var nsmOut =
 			var nsmOut =
@@ -937,10 +985,7 @@
 				fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
 				fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
 			var segs = [];
 			var segs = [];
 			if (itemForShopro && String(itemForShopro).trim()) {
 			if (itemForShopro && String(itemForShopro).trim()) {
-				segs.push(
-					'item=' +
-						encodeURIComponent(encodeURIComponent(String(itemForShopro).trim()))
-				);
+				segs.push('item=' + formatItemForShoproQuery(itemForShopro));
 			}
 			}
 			segs.push('needShowMore=' + encodeURIComponent(nsmOut));
 			segs.push('needShowMore=' + encodeURIComponent(nsmOut));
 			segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
 			segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
@@ -1041,26 +1086,57 @@
 		}
 		}
 
 
 		/**
 		/**
-		 * wx-open-launch-app extinfo:App 解析 Uni 路径,默认 pages/newdetails/index?…&fromShareDynamic=1
+		 * wx-open-launch-app extinfo:与 buildAppUniPageLaunchUrl 一致,pages/newdetails/index?item=双重编码…
+		 * 微信 extinfo 上限 1024 字符;超长时保留 item+needShowMore+fromHomeFeed+fromShareDynamic,仍超长则退化为 dynamicId。
 		 */
 		 */
 		function buildWeChatLaunchExtinfo() {
 		function buildWeChatLaunchExtinfo() {
 			var uniPage = buildAppUniPageLaunchUrl();
 			var uniPage = buildAppUniPageLaunchUrl();
 			if (uniPage.length <= 1024) return uniPage;
 			if (uniPage.length <= 1024) return uniPage;
-			var params = mergeSearchAndHashParams();
+
+			var path = getAppUniPathForShareDynamic();
+			if (!/newdetails/i.test(path)) {
+				var deepOther = buildAppDeepLink().replace(/^shopro:\/\//i, '');
+				if (deepOther.length <= 1024) return deepOther;
+				return deepOther.slice(0, 1024);
+			}
+
+			var itemEnc = '';
+			try {
+				var rawItem = getMergedParam('item');
+				if (rawItem) itemEnc = formatItemForShoproQuery(rawItem);
+			} catch (eItem) {}
+			var nsmRaw = getMergedParam('needShowMore');
+			var nsmOut =
+				nsmRaw != null && String(nsmRaw).trim() !== '' ? String(nsmRaw).trim() : 'true';
+			var fhfRaw = getMergedParam('fromHomeFeed');
+			var fhfOut =
+				fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
+			var segs = [];
+			if (itemEnc) segs.push('item=' + itemEnc);
+			segs.push('needShowMore=' + encodeURIComponent(nsmOut));
+			segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
+			segs.push('fromShareDynamic=1');
+			var packed = path + '?' + segs.join('&');
+			if (packed.length <= 1024) return packed;
+
+			var blob = parseShareDynamicItemBlob();
 			var mini = new URLSearchParams();
 			var mini = new URLSearchParams();
-			var did = params.get('dynamicId') || params.get('sourceId') || params.get('id') || '';
-			if (did) {
+			if (blob && blob.id != null && String(blob.id).trim() !== '') {
+				var did = String(blob.id).trim();
 				mini.set('dynamicId', did);
 				mini.set('dynamicId', did);
 				mini.set('sourceId', did);
 				mini.set('sourceId', did);
 			}
 			}
-			var st = params.get('sourceType');
+			var st =
+				getMergedParam('sourceType') ||
+				getMergedParam('type') ||
+				(blob && blob.type != null ? String(blob.type) : '');
 			if (st) mini.set('sourceType', st);
 			if (st) mini.set('sourceType', st);
+			mini.set('needShowMore', nsmOut);
+			mini.set('fromHomeFeed', fhfOut);
 			mini.set('fromShareDynamic', '1');
 			mini.set('fromShareDynamic', '1');
-			var path = getAppUniPathForShareDynamic();
 			var shortPage = path + '?' + mini.toString();
 			var shortPage = path + '?' + mini.toString();
 			if (shortPage.length <= 1024) return shortPage;
 			if (shortPage.length <= 1024) return shortPage;
-			var deep = buildAppDeepLink();
-			return deep.length <= 1024 ? deep : shortPage.slice(0, 1024);
+			return shortPage.slice(0, 1024);
 		}
 		}
 
 
 		function buildAppDeepLink() {
 		function buildAppDeepLink() {