zhuli 1 tydzień temu
rodzic
commit
83917c7bdc
1 zmienionych plików z 108 dodań i 34 usunięć
  1. 108 34
      HBuilderProjects/shareIndex.html

+ 108 - 34
HBuilderProjects/shareIndex.html

@@ -1072,11 +1072,15 @@
 		 * 注意:用 file:// 打开本页时,浏览器可能因 CORS 拦截跨域请求。
 		 * 请用本地 HTTP 打开(如 VS Code Live Server、npx serve)或让后端为 H5 域名配置 Access-Control-Allow-Origin。
 		 */
-		var API_BASE = 'https://test.ailien.shop/alienStore';
+		/** 按 H5 域名选择 alienStore 网关,避免 uat 页请求 test 接口导致签名环境不一致 */
+		var WECHAT_MP_APP_ID_BY_HOST = {
+			'test.ailien.shop': 'wx412792c77f47babd',
+			'uat.ailien.shop': 'wx5598889b28511717'
+		};
 
 		/**
 		 * 微信 JSSDK(服务号「麦丽恩严U店」)— 仅用于 wx.config 签名,Secret 只放后端
-		 * 后端 GET {API_BASE}/wx/getWxConfig 须用:AppID wx412792c77f47babd + 服务号 AppSecret
+		 * 后端 GET {resolveApiBase()}/wx/getWxConfig 须用对应环境服务号 AppId + AppSecret 对入参 url 签名
 		 */
 		var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
 		/** 微信开放标签 wx-open-launch-app — 移动应用「U店在哪」AppID(不是服务号 ID) */
@@ -1085,6 +1089,23 @@
 		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
 		var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareIndex.html';
 		var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
+
+		function resolveApiBase() {
+			var host = (location.hostname || '').toLowerCase();
+			if (host === 'uat.ailien.shop') return 'https://uat.ailien.shop/alienStore';
+			if (host === 'test.ailien.shop' || host === 'www.ailien.shop') {
+				return 'https://test.ailien.shop/alienStore';
+			}
+			return 'https://test.ailien.shop/alienStore';
+		}
+
+		function getWeChatMpAppId() {
+			var fromQuery = String(q('wxMpAppId') || '').trim();
+			if (fromQuery) return fromQuery;
+			var host = (location.hostname || '').toLowerCase();
+			if (WECHAT_MP_APP_ID_BY_HOST[host]) return WECHAT_MP_APP_ID_BY_HOST[host];
+			return WECHAT_MP_APP_ID;
+		}
 		var weChatJssdkConfigured = false;
 		var wxConfigSignRetriedBaseUrl = false;
 		var wxSignUrlFullBeforeStrip = '';
@@ -1258,16 +1279,21 @@
 		}
 
 		function buildWxGetConfigRequestUrl(signPageUrl) {
+			var qs =
+				'url=' +
+				encodeURIComponent(signPageUrl || getWxConfigSignUrl()) +
+				'&mpAppId=' +
+				encodeURIComponent(getWeChatMpAppId());
 			return (
-				API_BASE.replace(/\/$/, '') +
+				resolveApiBase().replace(/\/$/, '') +
 				WECHAT_GET_WX_CONFIG_PATH +
-				'?url=' +
-				encodeURIComponent(signPageUrl || getWxConfigSignUrl())
+				'?' +
+				qs
 			);
 		}
 
 		function resolveWxConfigAppIdFromSignData(d) {
-			if (!d || typeof d !== 'object') return '';
+			if (!d || typeof d !== 'object') return getWeChatMpAppId();
 			var mp =
 				d.mpAppId ||
 				d.mpAppid ||
@@ -1275,10 +1301,12 @@
 				d.gzhAppId ||
 				d.serviceAppId;
 			if (mp != null && String(mp).trim() !== '') return String(mp).trim();
-			var fromQuery = String(q('wxMpAppId') || WECHAT_MP_APP_ID || '').trim();
+			var fromQuery = String(q('wxMpAppId') || '').trim();
 			if (fromQuery) return fromQuery;
 			var raw = d.appId || d.appid || d.wxAppId;
-			return raw != null && String(raw).trim() !== '' ? String(raw).trim() : '';
+			var rawId = raw != null ? String(raw).trim() : '';
+			if (rawId && rawId !== WECHAT_OPEN_APP_ID) return rawId;
+			return getWeChatMpAppId();
 		}
 
 		function normalizeWxJssdkSignPayload(res, signUrlUsed) {
@@ -1296,8 +1324,12 @@
 					: signUrlUsed != null && String(signUrlUsed).trim() !== ''
 						? String(signUrlUsed).trim().split('#')[0]
 						: '';
+			var backendAppId = String(
+				(d.appId || d.appid || d.wxAppId || '').trim()
+			);
 			return {
 				appId: String(appId),
+				backendAppId: backendAppId,
 				timestamp: Number(timestamp),
 				nonceStr: String(nonceStr),
 				signature: String(signature),
@@ -1381,7 +1413,6 @@
 						});
 				})
 				.then(function (res) {
-					alert("123456",res,signPageUrl);
 					if (res && res.code != null) {
 						var c = Number(res.code);
 						if (c !== 200 && c !== 0 && res.success !== true) {
@@ -1403,16 +1434,11 @@
 				});
 		}
 
-		function applyWxConfig(sign, signPageUrl) {
-			var urlForWx =
-				sign.signUrl && String(sign.signUrl).trim() !== ''
-					? String(sign.signUrl).trim()
-					: signPageUrl;
-			syncBrowserUrlForWxSign(urlForWx);
-			return new Promise(function (resolve) {
+		function runWxConfig(sign, urlForWx) {
+			return new Promise(function (resolve, reject) {
 				wx.config({
 					debug: isWxDebugOn(),
-					appId: sign.appId,
+					appId: "wx412792c77f47babd",
 					timestamp: sign.timestamp,
 					nonceStr: sign.nonceStr,
 					signature: sign.signature,
@@ -1436,11 +1462,32 @@
 				wx.error(function (err) {
 					weChatJssdkConfigured = false;
 					document.body.classList.remove('wx-jssdk-ready');
-					wxJssdkInitPromise = null;
-					var errMsg = getWxErrMsg(err);
-					setWxInitError(formatWxConfigErrorTip(err, urlForWx));
-					if (isWxDebugOn()) window.alert(wxInitLastError);
-					console.warn('[wx.config]', errMsg, urlForWx);
+					reject(err);
+				});
+			});
+		}
+
+		function applyWxConfig(sign, signPageUrl, options) {
+			options = options || {};
+			var urlForWx =
+				sign.signUrl && String(sign.signUrl).trim() !== ''
+					? String(sign.signUrl).trim()
+					: signPageUrl;
+			syncBrowserUrlForWxSign(urlForWx);
+			return runWxConfig(sign, urlForWx).catch(function (err) {
+				wxJssdkInitPromise = null;
+				var errMsg = getWxErrMsg(err);
+				setWxInitError(formatWxConfigErrorTip(err, urlForWx));
+				if (isWxDebugOn()) window.alert(wxInitLastError);
+				console.warn('[wx.config]', errMsg, urlForWx, 'appId=', sign.appId);
+
+				var backendAppId = String(sign.backendAppId || '').trim();
+				if (
+					!/invalid signature/i.test(errMsg) ||
+					options.triedBackendAppId ||
+					!backendAppId ||
+					backendAppId === sign.appId
+				) {
 					var baseUrl = getWxSignUrlBase();
 					var fullUrl = getWxSignUrlFull();
 					if (
@@ -1449,22 +1496,34 @@
 						baseUrl === fullUrl ||
 						urlForWx === baseUrl
 					) {
-						resolve(false);
-						return;
+						return false;
 					}
 					wxConfigSignRetriedBaseUrl = true;
 					wxSignUrlFullBeforeStrip = fullUrl;
-					fetchWeChatJssdkSign(baseUrl)
+					return fetchWeChatJssdkSign(baseUrl)
 						.then(function (sign2) {
-							if (!sign2) {
-								resolve(false);
-								return;
-							}
-							applyWxConfig(sign2, baseUrl).then(resolve);
+							if (!sign2) return false;
+							return applyWxConfig(sign2, baseUrl, options);
 						})
 						.catch(function () {
-							resolve(false);
+							return false;
 						});
+				}
+
+				console.warn(
+					'[wx] invalid signature,改用后端返回 appId 重试 wx.config:',
+					backendAppId
+				);
+				var altSign = {
+					appId: backendAppId,
+					backendAppId: backendAppId,
+					timestamp: sign.timestamp,
+					nonceStr: sign.nonceStr,
+					signature: sign.signature,
+					signUrl: sign.signUrl
+				};
+				return applyWxConfig(altSign, signPageUrl, {
+					triedBackendAppId: true
 				});
 			});
 		}
@@ -1527,9 +1586,24 @@
 						setWxInitError('getWxConfig 返回为空');
 						return false;
 					}
-					if (sign.appId !== WECHAT_MP_APP_ID) {
+					var expectedMpId = getWeChatMpAppId();
+					if (
+						sign.backendAppId === WECHAT_OPEN_APP_ID &&
+						sign.appId === expectedMpId
+					) {
+						setWxInitError(
+							'后端 getWxConfig 返回了移动应用 appId(' +
+								WECHAT_OPEN_APP_ID +
+								'),须改为用服务号 ' +
+								expectedMpId +
+								' 的 AppSecret 对 url 签名'
+						);
+					} else if (sign.appId !== expectedMpId && sign.backendAppId !== expectedMpId) {
 						setWxInitError(
-							'后端 appId=' + sign.appId + ',应为服务号 ' + WECHAT_MP_APP_ID
+							'后端 appId=' +
+								sign.appId +
+								',当前环境服务号应为 ' +
+								expectedMpId
 						);
 					}
 					if (typeof wx === 'undefined') {
@@ -1734,7 +1808,7 @@
 		}
 
 		function apiFetch(path) {
-			return fetch(API_BASE + path, {
+			return fetch(resolveApiBase() + path, {
 				method: 'GET',
 				mode: 'cors',
 				credentials: 'omit',