zhuli 3 недель назад
Родитель
Сommit
8f5abc766f
1 измененных файлов с 21 добавлено и 15 удалено
  1. 21 15
      HBuilderProjects/shareIndex.html

+ 21 - 15
HBuilderProjects/shareIndex.html

@@ -1049,13 +1049,13 @@
 		 */
 		var WECHAT_MP_APP_ID = '';
 		/**
-		 * 进入页 GET {API_BASE}/wx/getWxConfig?url={页面地址,不含 query/hash}
-		 * 例:.../wx/getWxConfig?url=https://test.ailien.shop/h5/HBuilderProjects/shareIndex.html
+		 * 进入页 GET {API_BASE}/wx/getWxConfig?url={当前页完整 URL,含 ? 参数,不含 #}
+		 * 微信校验签名与 location.href.split('#')[0] 必须一致,不能只签 shareIndex.html 无参数
 		 * 可用 ?wxSignPath= 或 ?wxSignUrl= 覆盖。
 		 */
 		var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
 		var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
-		/** getWxConfig 的 url 参数:仅页面地址,不带 ? 后分享参数 */
+		/** 本地 file:// 预览时传给 getWxConfig 的默认 url(无 query) */
 		var WX_GET_CONFIG_SIGN_URL = 'https://test.ailien.shop/h5/HBuilderProjects/shareIndex.html';
 		/** wx.config 已成功(开放标签可展示);与「用户已成功唤起 App」不是同一回事 */
 		var weChatJssdkConfigured = false;
@@ -1168,23 +1168,24 @@
 			return API_BASE.replace(/\/$/, '') + (custom.charAt(0) === '/' ? custom : '/' + custom);
 		}
 
-		/** /wx/getWxConfig 签名用 url:不含 query/hash,与后端约定一致 */
+		/**
+		 * /wx/getWxConfig 与 wx.config 签名用 url(微信官方要求):
+		 * 当前页完整地址,包含 ? 后 GET 参数,不包含 # 后内容。
+		 * 若只签 https://.../shareIndex.html 而实际打开带 ?id=...,会报 invalid signature。
+		 */
 		function getWxConfigSignUrl() {
-			if (location.origin && /^https?:/i.test(location.origin) && location.pathname) {
-				return location.origin + location.pathname;
-			}
-			return WX_GET_CONFIG_SIGN_URL;
-		}
-
-		/** 唤起 App 的 extinfo 等:保留完整分享链(含 query) */
-		function getPageUrlForWxSign() {
 			var u = String(location.href || '').split('#')[0];
 			if (!u || u.indexOf('file:') === 0) {
-				return H5_PAGE_BASE_FALLBACK + 'shareIndex.html' + (location.search || '');
+				return WX_GET_CONFIG_SIGN_URL;
 			}
 			return u;
 		}
 
+		/** 唤起 App 的 extinfo:与签名 url 相同规则 */
+		function getPageUrlForWxSign() {
+			return getWxConfigSignUrl();
+		}
+
 		function buildWxGetConfigRequestUrl(signPageUrl) {
 			var base = API_BASE.replace(/\/$/, '');
 			return (
@@ -1286,10 +1287,15 @@
 				);
 			}
 			if (/invalid signature/i.test(errMsg)) {
+				var signUrl = signPageUrl || getWxConfigSignUrl();
+				var hasQuery = signUrl.indexOf('?') >= 0;
 				return (
 					tip +
-					':签名无效(invalid signature)。请确认后端签名使用的 url 与前端完全一致:' +
-					(signPageUrl || getWxConfigSignUrl())
+					':签名无效(invalid signature)。后端签名用的 url 必须与微信当前页完全一致(含?后参数、不含#):' +
+					signUrl +
+					(hasQuery
+						? ''
+						: '(若分享链带 id/storeId,不能只用无参数的 shareIndex.html 签名)')
 				);
 			}
 			if (/invalid appid/i.test(errMsg)) {