|
|
@@ -801,30 +801,77 @@
|
|
|
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 hqi0 = hash0.indexOf('?');
|
|
|
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) {
|
|
|
- return '?' + appendFromShareDynamicToRaw(rawSearch);
|
|
|
+ return rawSearch;
|
|
|
}
|
|
|
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 */
|
|
|
@@ -921,13 +968,14 @@
|
|
|
* newdetails 在 fromShareDynamic=1 时忽略其「首页种子」语义。
|
|
|
*/
|
|
|
params.delete('fromShareDynamic');
|
|
|
- var itemForShopro = params.get('item');
|
|
|
+ var itemForShopro = '';
|
|
|
+ try {
|
|
|
+ itemForShopro = getMergedParam('item');
|
|
|
+ } catch (eGi) {
|
|
|
+ itemForShopro = '';
|
|
|
+ }
|
|
|
if (!itemForShopro || String(itemForShopro).trim() === '') {
|
|
|
- try {
|
|
|
- itemForShopro = getMergedParam('item');
|
|
|
- } catch (eGi) {
|
|
|
- itemForShopro = '';
|
|
|
- }
|
|
|
+ itemForShopro = params.get('item') || '';
|
|
|
}
|
|
|
var nsmRaw = params.get('needShowMore');
|
|
|
var nsmOut =
|
|
|
@@ -937,10 +985,7 @@
|
|
|
fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
|
|
|
var segs = [];
|
|
|
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('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() {
|
|
|
var uniPage = buildAppUniPageLaunchUrl();
|
|
|
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 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('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);
|
|
|
+ mini.set('needShowMore', nsmOut);
|
|
|
+ mini.set('fromHomeFeed', fhfOut);
|
|
|
mini.set('fromShareDynamic', '1');
|
|
|
- var path = getAppUniPathForShareDynamic();
|
|
|
var shortPage = path + '?' + mini.toString();
|
|
|
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() {
|