|
|
@@ -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)) {
|