|
|
@@ -801,49 +801,6 @@
|
|
|
return pathPart.replace(/^\/+/, '');
|
|
|
}
|
|
|
|
|
|
- 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';
|
|
|
- }
|
|
|
-
|
|
|
- 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) : '';
|
|
|
- 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 rawSearch;
|
|
|
- }
|
|
|
- if (!rawSearch && rawHashQ) {
|
|
|
- return rawHashQ;
|
|
|
- }
|
|
|
- return '';
|
|
|
- }
|
|
|
-
|
|
|
/** App shopro / wx extinfo:item 须双重 URL 编码;若已是 %257B… 则不再编码 */
|
|
|
function formatItemForShoproQuery(rawItem) {
|
|
|
var s = String(rawItem || '').trim();
|
|
|
@@ -866,14 +823,121 @@
|
|
|
return encodeURIComponent(encodeURIComponent(s));
|
|
|
}
|
|
|
|
|
|
- function buildAppOpenQueryStringMerged() {
|
|
|
+ /**
|
|
|
+ * 与 shareIndex buildAppLaunchQueryParams 类似:先解析 sourceId/sourceType/userId,
|
|
|
+ * 再拼有序 query,避免 fromHomeFeed=1 触发首页种子导致 newdetails「操作无效」。
|
|
|
+ */
|
|
|
+ function resolveShareDynamicLaunchMeta() {
|
|
|
+ var blob = parseShareDynamicItemBlob();
|
|
|
+ if (!blob) blob = parseOptionsItem();
|
|
|
+ var sourceId =
|
|
|
+ getMergedParam('sourceId') ||
|
|
|
+ getMergedParam('dynamicId') ||
|
|
|
+ getMergedParam('id') ||
|
|
|
+ q('dynamicId') ||
|
|
|
+ q('id');
|
|
|
+ if (!sourceId && blob && blob.id != null && String(blob.id).trim() !== '') {
|
|
|
+ sourceId = String(blob.id);
|
|
|
+ }
|
|
|
+ var sourceType =
|
|
|
+ getMergedParam('sourceType') ||
|
|
|
+ getMergedParam('businessType') ||
|
|
|
+ q('sourceType') ||
|
|
|
+ q('businessType');
|
|
|
+ if (!sourceType && blob && blob.type != null && String(blob.type).trim() !== '') {
|
|
|
+ sourceType = String(blob.type);
|
|
|
+ }
|
|
|
+ var userId = getMergedParam('userId') || q('userId');
|
|
|
+ if (!userId && blob) {
|
|
|
+ if (blob.userId != null && String(blob.userId).trim() !== '') {
|
|
|
+ userId = String(blob.userId);
|
|
|
+ } else if (blob.createdUserId != null && String(blob.createdUserId).trim() !== '') {
|
|
|
+ userId = String(blob.createdUserId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ blob: blob,
|
|
|
+ sourceId: String(sourceId || '').trim(),
|
|
|
+ sourceType: String(sourceType || '').trim(),
|
|
|
+ userId: String(userId || '').trim()
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 固定顺序:item → needShowMore → fromHomeFeed(0) → fromShareDynamic(1) → sourceId/dynamicId/sourceType/userId → 其余
|
|
|
+ * compact:微信 extinfo 超长时不带 item,仅 id 类参数(App 内再拉详情)
|
|
|
+ */
|
|
|
+ function buildShareDynamicLaunchSegs(options) {
|
|
|
+ options = options || {};
|
|
|
+ var compact = !!options.compact;
|
|
|
var params = mergeSearchAndHashParams();
|
|
|
+ var meta = resolveShareDynamicLaunchMeta();
|
|
|
+ var segs = [];
|
|
|
+ var skipKeys = {
|
|
|
+ item: 1,
|
|
|
+ needshowmore: 1,
|
|
|
+ fromhomefeed: 1,
|
|
|
+ fromsharedynamic: 1,
|
|
|
+ sourceid: 1,
|
|
|
+ dynamicid: 1,
|
|
|
+ sourcetype: 1,
|
|
|
+ userid: 1,
|
|
|
+ id: 1
|
|
|
+ };
|
|
|
+
|
|
|
+ if (!compact) {
|
|
|
+ var itemForShopro = '';
|
|
|
+ try {
|
|
|
+ itemForShopro = getMergedParam('item');
|
|
|
+ } catch (eGi) {
|
|
|
+ itemForShopro = '';
|
|
|
+ }
|
|
|
+ if (!itemForShopro || String(itemForShopro).trim() === '') {
|
|
|
+ itemForShopro = params.get('item') || '';
|
|
|
+ }
|
|
|
+ if (itemForShopro && String(itemForShopro).trim()) {
|
|
|
+ segs.push('item=' + formatItemForShoproQuery(itemForShopro));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var nsmRaw = params.get('needShowMore');
|
|
|
+ var nsmOut =
|
|
|
+ nsmRaw != null && String(nsmRaw).trim() !== '' ? String(nsmRaw).trim() : 'true';
|
|
|
+ segs.push('needShowMore=' + encodeURIComponent(nsmOut));
|
|
|
+ /** 分享 H5 唤起:勿用首页种子 fromHomeFeed=1,否则 newdetails 易白屏并提示「操作无效」 */
|
|
|
+ segs.push('fromHomeFeed=0');
|
|
|
+ segs.push('fromShareDynamic=1');
|
|
|
|
|
|
- var rawQs = getRawShareQueryForAppOpen();
|
|
|
- if (rawQs) {
|
|
|
- return '?' + appendFromShareDynamicToRaw(rawQs);
|
|
|
+ if (meta.sourceId) {
|
|
|
+ segs.push('sourceId=' + encodeURIComponent(meta.sourceId));
|
|
|
+ segs.push('dynamicId=' + encodeURIComponent(meta.sourceId));
|
|
|
+ }
|
|
|
+ if (meta.sourceType) {
|
|
|
+ segs.push('sourceType=' + encodeURIComponent(meta.sourceType));
|
|
|
+ }
|
|
|
+ if (meta.userId) {
|
|
|
+ segs.push('userId=' + encodeURIComponent(meta.userId));
|
|
|
}
|
|
|
|
|
|
+ if (!compact) {
|
|
|
+ params.forEach(function (val, key) {
|
|
|
+ var kl = String(key || '')
|
|
|
+ .trim()
|
|
|
+ .toLowerCase();
|
|
|
+ if (!kl || skipKeys[kl]) return;
|
|
|
+ if (val == null) return;
|
|
|
+ var vs = String(val);
|
|
|
+ if (vs === '') return;
|
|
|
+ segs.push(encodeURIComponent(key) + '=' + encodeURIComponent(vs));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return segs;
|
|
|
+ }
|
|
|
+
|
|
|
+ function buildAppOpenQueryStringMerged() {
|
|
|
+ var params = mergeSearchAndHashParams();
|
|
|
+
|
|
|
/** newdetails onLoad:仅当地址栏未带 item 时补全;同时按需补顶层 imagePath */
|
|
|
if (!params.has('item')) {
|
|
|
var itemObj = parseOptionsItem();
|
|
|
@@ -962,51 +1026,7 @@
|
|
|
}
|
|
|
}
|
|
|
} catch (eShareCk) {}
|
|
|
- /**
|
|
|
- * 与微信落地 shareDynamic、group_user buildDynamicShareH5FullUrl 一致:**item 双重 URL 编码**,
|
|
|
- * 顺序 `item & needShowMore & fromHomeFeed & fromShareDynamic=1 & 其余`;fromHomeFeed 仍带给 App,
|
|
|
- * newdetails 在 fromShareDynamic=1 时忽略其「首页种子」语义。
|
|
|
- */
|
|
|
- params.delete('fromShareDynamic');
|
|
|
- var itemForShopro = '';
|
|
|
- try {
|
|
|
- itemForShopro = getMergedParam('item');
|
|
|
- } catch (eGi) {
|
|
|
- itemForShopro = '';
|
|
|
- }
|
|
|
- if (!itemForShopro || String(itemForShopro).trim() === '') {
|
|
|
- itemForShopro = params.get('item') || '';
|
|
|
- }
|
|
|
- var nsmRaw = params.get('needShowMore');
|
|
|
- var nsmOut =
|
|
|
- nsmRaw != null && String(nsmRaw).trim() !== '' ? String(nsmRaw).trim() : 'true';
|
|
|
- var fhfRaw = params.get('fromHomeFeed');
|
|
|
- var fhfOut =
|
|
|
- fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
|
|
|
- var segs = [];
|
|
|
- if (itemForShopro && String(itemForShopro).trim()) {
|
|
|
- segs.push('item=' + formatItemForShoproQuery(itemForShopro));
|
|
|
- }
|
|
|
- segs.push('needShowMore=' + encodeURIComponent(nsmOut));
|
|
|
- segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
|
|
|
- segs.push('fromShareDynamic=1');
|
|
|
- var skipShoproKeys = {
|
|
|
- item: 1,
|
|
|
- needshowmore: 1,
|
|
|
- fromhomefeed: 1,
|
|
|
- fromsharedynamic: 1
|
|
|
- };
|
|
|
- params.forEach(function (val, key) {
|
|
|
- var kl = String(key || '')
|
|
|
- .trim()
|
|
|
- .toLowerCase();
|
|
|
- if (!kl || skipShoproKeys[kl]) return;
|
|
|
- if (val == null) return;
|
|
|
- var vs = String(val);
|
|
|
- if (vs === '') return;
|
|
|
- segs.push(encodeURIComponent(key) + '=' + encodeURIComponent(vs));
|
|
|
- });
|
|
|
- return '?' + segs.join('&');
|
|
|
+ return '?' + buildShareDynamicLaunchSegs({ compact: false }).join('&');
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1086,57 +1106,38 @@
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * wx-open-launch-app extinfo:与 buildAppUniPageLaunchUrl 一致,pages/newdetails/index?item=双重编码…
|
|
|
- * 微信 extinfo 上限 1024 字符;超长时保留 item+needShowMore+fromHomeFeed+fromShareDynamic,仍超长则退化为 dynamicId。
|
|
|
+ * wx-open-launch-app extinfo:与 buildAppUniPageLaunchUrl 一致(参照 shareIndex 短参数 + 有序 query)
|
|
|
+ * 微信 extinfo 上限 1024;超长时去掉 item,保留 sourceId/sourceType/userId。
|
|
|
*/
|
|
|
function buildWeChatLaunchExtinfo() {
|
|
|
- var uniPage = buildAppUniPageLaunchUrl();
|
|
|
- if (uniPage.length <= 1024) return uniPage;
|
|
|
+ var path = getAppUniPathForShareDynamic().replace(/^\//, '');
|
|
|
+ var fullQs = buildShareDynamicLaunchSegs({ compact: false }).join('&');
|
|
|
+ var fullPage = fullQs ? path + '?' + fullQs : path;
|
|
|
+ if (fullPage.length <= 1024) return fullPage;
|
|
|
|
|
|
- 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 compactQs = buildShareDynamicLaunchSegs({ compact: true }).join('&');
|
|
|
+ var compactPage = compactQs ? path + '?' + compactQs : path;
|
|
|
+ if (compactPage.length <= 1024) return compactPage;
|
|
|
|
|
|
- var blob = parseShareDynamicItemBlob();
|
|
|
+ var meta = resolveShareDynamicLaunchMeta();
|
|
|
var mini = new URLSearchParams();
|
|
|
- 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 =
|
|
|
- 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);
|
|
|
+ if (meta.sourceId) {
|
|
|
+ mini.set('sourceId', meta.sourceId);
|
|
|
+ mini.set('dynamicId', meta.sourceId);
|
|
|
+ }
|
|
|
+ if (meta.sourceType) mini.set('sourceType', meta.sourceType);
|
|
|
+ if (meta.userId) mini.set('userId', meta.userId);
|
|
|
+ mini.set('needShowMore', 'true');
|
|
|
+ mini.set('fromHomeFeed', '0');
|
|
|
mini.set('fromShareDynamic', '1');
|
|
|
var shortPage = path + '?' + mini.toString();
|
|
|
- if (shortPage.length <= 1024) return shortPage;
|
|
|
- return shortPage.slice(0, 1024);
|
|
|
+ return shortPage.length <= 1024 ? shortPage : shortPage.slice(0, 1024);
|
|
|
}
|
|
|
|
|
|
function buildAppDeepLink() {
|