|
@@ -1072,11 +1072,15 @@
|
|
|
* 注意:用 file:// 打开本页时,浏览器可能因 CORS 拦截跨域请求。
|
|
* 注意:用 file:// 打开本页时,浏览器可能因 CORS 拦截跨域请求。
|
|
|
* 请用本地 HTTP 打开(如 VS Code Live Server、npx serve)或让后端为 H5 域名配置 Access-Control-Allow-Origin。
|
|
* 请用本地 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 只放后端
|
|
* 微信 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';
|
|
var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
|
|
|
/** 微信开放标签 wx-open-launch-app — 移动应用「U店在哪」AppID(不是服务号 ID) */
|
|
/** 微信开放标签 wx-open-launch-app — 移动应用「U店在哪」AppID(不是服务号 ID) */
|
|
@@ -1085,6 +1089,23 @@
|
|
|
var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
|
|
var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
|
|
|
var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareIndex.html';
|
|
var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareIndex.html';
|
|
|
var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
|
|
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 weChatJssdkConfigured = false;
|
|
|
var wxConfigSignRetriedBaseUrl = false;
|
|
var wxConfigSignRetriedBaseUrl = false;
|
|
|
var wxSignUrlFullBeforeStrip = '';
|
|
var wxSignUrlFullBeforeStrip = '';
|
|
@@ -1258,16 +1279,21 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function buildWxGetConfigRequestUrl(signPageUrl) {
|
|
function buildWxGetConfigRequestUrl(signPageUrl) {
|
|
|
|
|
+ var qs =
|
|
|
|
|
+ 'url=' +
|
|
|
|
|
+ encodeURIComponent(signPageUrl || getWxConfigSignUrl()) +
|
|
|
|
|
+ '&mpAppId=' +
|
|
|
|
|
+ encodeURIComponent(getWeChatMpAppId());
|
|
|
return (
|
|
return (
|
|
|
- API_BASE.replace(/\/$/, '') +
|
|
|
|
|
|
|
+ resolveApiBase().replace(/\/$/, '') +
|
|
|
WECHAT_GET_WX_CONFIG_PATH +
|
|
WECHAT_GET_WX_CONFIG_PATH +
|
|
|
- '?url=' +
|
|
|
|
|
- encodeURIComponent(signPageUrl || getWxConfigSignUrl())
|
|
|
|
|
|
|
+ '?' +
|
|
|
|
|
+ qs
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function resolveWxConfigAppIdFromSignData(d) {
|
|
function resolveWxConfigAppIdFromSignData(d) {
|
|
|
- if (!d || typeof d !== 'object') return '';
|
|
|
|
|
|
|
+ if (!d || typeof d !== 'object') return getWeChatMpAppId();
|
|
|
var mp =
|
|
var mp =
|
|
|
d.mpAppId ||
|
|
d.mpAppId ||
|
|
|
d.mpAppid ||
|
|
d.mpAppid ||
|
|
@@ -1275,10 +1301,12 @@
|
|
|
d.gzhAppId ||
|
|
d.gzhAppId ||
|
|
|
d.serviceAppId;
|
|
d.serviceAppId;
|
|
|
if (mp != null && String(mp).trim() !== '') return String(mp).trim();
|
|
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;
|
|
if (fromQuery) return fromQuery;
|
|
|
var raw = d.appId || d.appid || d.wxAppId;
|
|
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) {
|
|
function normalizeWxJssdkSignPayload(res, signUrlUsed) {
|
|
@@ -1296,8 +1324,12 @@
|
|
|
: signUrlUsed != null && String(signUrlUsed).trim() !== ''
|
|
: signUrlUsed != null && String(signUrlUsed).trim() !== ''
|
|
|
? String(signUrlUsed).trim().split('#')[0]
|
|
? String(signUrlUsed).trim().split('#')[0]
|
|
|
: '';
|
|
: '';
|
|
|
|
|
+ var backendAppId = String(
|
|
|
|
|
+ (d.appId || d.appid || d.wxAppId || '').trim()
|
|
|
|
|
+ );
|
|
|
return {
|
|
return {
|
|
|
appId: String(appId),
|
|
appId: String(appId),
|
|
|
|
|
+ backendAppId: backendAppId,
|
|
|
timestamp: Number(timestamp),
|
|
timestamp: Number(timestamp),
|
|
|
nonceStr: String(nonceStr),
|
|
nonceStr: String(nonceStr),
|
|
|
signature: String(signature),
|
|
signature: String(signature),
|
|
@@ -1381,7 +1413,6 @@
|
|
|
});
|
|
});
|
|
|
})
|
|
})
|
|
|
.then(function (res) {
|
|
.then(function (res) {
|
|
|
- alert("123456",res,signPageUrl);
|
|
|
|
|
if (res && res.code != null) {
|
|
if (res && res.code != null) {
|
|
|
var c = Number(res.code);
|
|
var c = Number(res.code);
|
|
|
if (c !== 200 && c !== 0 && res.success !== true) {
|
|
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({
|
|
wx.config({
|
|
|
debug: isWxDebugOn(),
|
|
debug: isWxDebugOn(),
|
|
|
- appId: sign.appId,
|
|
|
|
|
|
|
+ appId: "wx412792c77f47babd",
|
|
|
timestamp: sign.timestamp,
|
|
timestamp: sign.timestamp,
|
|
|
nonceStr: sign.nonceStr,
|
|
nonceStr: sign.nonceStr,
|
|
|
signature: sign.signature,
|
|
signature: sign.signature,
|
|
@@ -1436,11 +1462,32 @@
|
|
|
wx.error(function (err) {
|
|
wx.error(function (err) {
|
|
|
weChatJssdkConfigured = false;
|
|
weChatJssdkConfigured = false;
|
|
|
document.body.classList.remove('wx-jssdk-ready');
|
|
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 baseUrl = getWxSignUrlBase();
|
|
|
var fullUrl = getWxSignUrlFull();
|
|
var fullUrl = getWxSignUrlFull();
|
|
|
if (
|
|
if (
|
|
@@ -1449,22 +1496,34 @@
|
|
|
baseUrl === fullUrl ||
|
|
baseUrl === fullUrl ||
|
|
|
urlForWx === baseUrl
|
|
urlForWx === baseUrl
|
|
|
) {
|
|
) {
|
|
|
- resolve(false);
|
|
|
|
|
- return;
|
|
|
|
|
|
|
+ return false;
|
|
|
}
|
|
}
|
|
|
wxConfigSignRetriedBaseUrl = true;
|
|
wxConfigSignRetriedBaseUrl = true;
|
|
|
wxSignUrlFullBeforeStrip = fullUrl;
|
|
wxSignUrlFullBeforeStrip = fullUrl;
|
|
|
- fetchWeChatJssdkSign(baseUrl)
|
|
|
|
|
|
|
+ return fetchWeChatJssdkSign(baseUrl)
|
|
|
.then(function (sign2) {
|
|
.then(function (sign2) {
|
|
|
- if (!sign2) {
|
|
|
|
|
- resolve(false);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- applyWxConfig(sign2, baseUrl).then(resolve);
|
|
|
|
|
|
|
+ if (!sign2) return false;
|
|
|
|
|
+ return applyWxConfig(sign2, baseUrl, options);
|
|
|
})
|
|
})
|
|
|
.catch(function () {
|
|
.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 返回为空');
|
|
setWxInitError('getWxConfig 返回为空');
|
|
|
return false;
|
|
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(
|
|
setWxInitError(
|
|
|
- '后端 appId=' + sign.appId + ',应为服务号 ' + WECHAT_MP_APP_ID
|
|
|
|
|
|
|
+ '后端 appId=' +
|
|
|
|
|
+ sign.appId +
|
|
|
|
|
+ ',当前环境服务号应为 ' +
|
|
|
|
|
+ expectedMpId
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
if (typeof wx === 'undefined') {
|
|
if (typeof wx === 'undefined') {
|
|
@@ -1734,7 +1808,7 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function apiFetch(path) {
|
|
function apiFetch(path) {
|
|
|
- return fetch(API_BASE + path, {
|
|
|
|
|
|
|
+ return fetch(resolveApiBase() + path, {
|
|
|
method: 'GET',
|
|
method: 'GET',
|
|
|
mode: 'cors',
|
|
mode: 'cors',
|
|
|
credentials: 'omit',
|
|
credentials: 'omit',
|