sunshibo 1 неделя назад
Родитель
Сommit
50144b34a7
1 измененных файлов с 97 добавлено и 24 удалено
  1. 97 24
      HBuilderProjects/shareUndefined.html

+ 97 - 24
HBuilderProjects/shareUndefined.html

@@ -727,40 +727,89 @@
 			return qsOut ? ('?' + qsOut) : '';
 		}
 
+		/**
+		 * 微信 extinfo 专用 query:禁止透传整段原始 query(易超 1024 或含封面/描述等大字段导致 launch:fail)。
+		 * 与 secondShareGoods / shareDynamic 一致,仅保留 App 登录页解析所需字段。
+		 */
+		function buildWxLaunchQueryParams() {
+			var params = mergeSearchAndHashParams();
+			var mini = new URLSearchParams();
+			mini.set('goodsUnavailable', '1');
+			var gs = params.get('goodsStatus');
+			if (gs != null && String(gs).trim() !== '') {
+				mini.set('goodsStatus', String(gs).trim());
+			}
+			var goodsId = params.get('goodsId') || params.get('id') || '';
+			if (goodsId) {
+				mini.set('goodsId', String(goodsId).trim());
+				mini.set('id', String(goodsId).trim());
+			}
+			var userId = params.get('userId');
+			if (userId != null && String(userId).trim() !== '') {
+				mini.set('userId', String(userId).trim());
+			}
+			var sid = params.get('storeId');
+			if (sid != null && String(sid).trim() !== '') {
+				mini.set('storeId', String(sid).trim());
+			}
+			var lon =
+				params.get('longitude') ||
+				params.get('lon') ||
+				params.get('lng') ||
+				params.get('jingdu') ||
+				'';
+			if (lon !== '' && !isNaN(Number(lon))) {
+				mini.set('longitude', String(lon));
+			}
+			var lat =
+				params.get('latitude') ||
+				params.get('lat') ||
+				params.get('weidu') ||
+				'';
+			if (lat !== '' && !isNaN(Number(lat))) {
+				mini.set('latitude', String(lat));
+			}
+			var city = params.get('userCity') || params.get('city');
+			if (city != null && String(city).trim() !== '') {
+				mini.set('userCity', String(city).trim());
+			}
+			return mini;
+		}
+
 		/** Uni 路由串(无 shopro://),供 wx-open-launch-app extinfo */
 		function buildAppUniPageLaunchUrl() {
 			var path = getAppUniPathForShareUndefined().replace(/^\//, '');
-			var qs = buildAppOpenQueryStringMerged().replace(/^\?/, '');
+			var qs = buildWxLaunchQueryParams().toString();
 			return qs ? path + '?' + qs : path;
 		}
 
 		/**
 		 * wx-open-launch-app extinfo:pages/index/login?…(与 shareIndex 关店唤起一致)
 		 */
-		function buildWeChatLaunchExtinfo() {
-			var uniPage = buildAppUniPageLaunchUrl();
-			if (uniPage.length <= 1024) return uniPage;
-
+		function buildWeChatLaunchExtinfo(useBarePathOnly) {
 			var path = getAppUniPathForShareUndefined().replace(/^\//, '');
-			var rawQs = getRawMergedQueryForAppOpen();
-			if (rawQs) {
-				var packedRaw = path + '?' + rawQs;
-				if (packedRaw.length <= 1024) return packedRaw;
-			}
+			if (useBarePathOnly) return path;
 
-			var params = mergeSearchAndHashParams();
-			var mini = new URLSearchParams();
-			var goodsId = params.get('goodsId') || params.get('id') || '';
+			var mini = buildWxLaunchQueryParams();
+			var goodsId = mini.get('goodsId') || mini.get('id') || '';
 			if (goodsId) {
 				mini.set('goodsId', goodsId);
 				mini.set('id', goodsId);
 			}
-			var sid = params.get('storeId') || '';
-			if (sid) mini.set('storeId', sid);
-			var shortPage = path + '?' + mini.toString();
-			if (shortPage.length <= 1024) return shortPage;
-			var deep = buildAppDeepLink().replace(/^shopro:\/\//i, '');
-			return deep.length <= 1024 ? deep : shortPage.slice(0, 1024);
+			var qs = mini.toString();
+			var uniPage = qs ? path + '?' + qs : path;
+			if (uniPage.length <= 1024) return uniPage;
+
+			var shortKeys = ['goodsUnavailable', 'goodsStatus', 'goodsId', 'id', 'userId'];
+			var shortMini = new URLSearchParams();
+			shortKeys.forEach(function (key) {
+				var val = mini.get(key);
+				if (val != null && String(val).trim() !== '') {
+					shortMini.set(key, String(val).trim());
+				}
+			});
+			var shortPage = shortMini.toString() ? path + '?' + shortMini.toString() : path;
+			return shortPage.length <= 1024 ? shortPage : path;
 		}
 
 		/** 供 App 内嵌 WebView:uni 路由到登录页,query 与深链一致 */
@@ -1058,12 +1107,13 @@
 			});
 		}
 
-		function refreshWxLaunchTagAttrs() {
+		function refreshWxLaunchTagAttrs(useBarePathOnly) {
 			var tag = document.getElementById('launch-btn');
 			if (!tag) return;
 			try {
 				tag.setAttribute('appid', WECHAT_OPEN_APP_ID);
-				tag.setAttribute('extinfo', buildWeChatLaunchExtinfo());
+				tag.setAttribute('extinfo', buildWeChatLaunchExtinfo(!!useBarePathOnly));
+				console.log('[wx-open-launch-app] extinfo=', tag.getAttribute('extinfo'));
 			} catch (eA) {}
 		}
 
@@ -1071,8 +1121,10 @@
 			var tag = document.getElementById('launch-btn');
 			if (!tag || tag._wxLaunchBound) return;
 			tag._wxLaunchBound = true;
-			refreshWxLaunchTagAttrs();
+			tag._wxLaunchBareRetried = false;
+			refreshWxLaunchTagAttrs(false);
 			tag.addEventListener('launch', function () {
+				tag._wxLaunchBareRetried = false;
 				console.log('[wx-open-launch-app] launch ok');
 				showFabToast('正在打开 U店在哪…');
 			});
@@ -1084,10 +1136,31 @@
 						: detail && detail.errmsg
 							? String(detail.errmsg)
 							: '';
-				console.warn('[wx-open-launch-app]', detail);
+				console.warn('[wx-open-launch-app]', detail, 'extinfo=', tag.getAttribute('extinfo'));
+
+				if (/launch:fail_check/i.test(errMsg)) {
+					showAppOpenFailTip(
+						'未能唤起 App:' +
+							errMsg +
+							'。请确认公众号已关联移动应用「U店在哪」,且 JS 安全域名与当前页一致。'
+					);
+					return;
+				}
+
+				if (
+					/launch:fail/i.test(errMsg) &&
+					!tag._wxLaunchBareRetried &&
+					tag.getAttribute('extinfo') !== buildWeChatLaunchExtinfo(true)
+				) {
+					tag._wxLaunchBareRetried = true;
+					refreshWxLaunchTagAttrs(true);
+					showFabToast('请再点一次「APP内打开」');
+					return;
+				}
+
 				showAppOpenFailTip(
 					errMsg
-						? '未能唤起 App:' + errMsg
+						? '未能唤起 App:' + errMsg + '。请确认已安装最新版「U店在哪」。'
 						: '未能唤起 App,请确认已安装 U店在哪,且开放平台已绑定服务号与移动应用。'
 				);
 			});