|
@@ -730,7 +730,10 @@
|
|
|
var APP_IOS_URL_SCHEME = 'shopro://';
|
|
var APP_IOS_URL_SCHEME = 'shopro://';
|
|
|
var APP_UNI_STORE_PATH = 'pages/newdetails/index';
|
|
var APP_UNI_STORE_PATH = 'pages/newdetails/index';
|
|
|
|
|
|
|
|
- /** 微信 JSSDK — 与 shareIndex.html 一致 */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 微信 JSSDK — 与 shareIndex.html 一致
|
|
|
|
|
+ * 后端 POST {API_BASE}/wx/getWxConfig,body 传 url(当前页完整地址,不含 #)
|
|
|
|
|
+ */
|
|
|
var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
|
|
var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
|
|
|
var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
|
|
var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
|
|
|
var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
|
|
var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
|
|
@@ -1146,13 +1149,14 @@
|
|
|
return getWxSignPageUrlForApi();
|
|
return getWxSignPageUrlForApi();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- function buildWxGetConfigRequestUrl(htmlUrl) {
|
|
|
|
|
- return (
|
|
|
|
|
- API_BASE.replace(/\/$/, '') +
|
|
|
|
|
- WECHAT_GET_WX_CONFIG_PATH +
|
|
|
|
|
- '?url=' +
|
|
|
|
|
- encodeURIComponent(htmlUrl || getWxConfigSignUrl())
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ function getWxGetConfigApiUrl() {
|
|
|
|
|
+ return API_BASE.replace(/\/$/, '') + WECHAT_GET_WX_CONFIG_PATH;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function buildWxGetConfigRequestBody(htmlUrl) {
|
|
|
|
|
+ return {
|
|
|
|
|
+ url: String(htmlUrl || '').split('#')[0].trim()
|
|
|
|
|
+ };
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function resolveWxConfigAppIdFromSignData(d) {
|
|
function resolveWxConfigAppIdFromSignData(d) {
|
|
@@ -1176,14 +1180,25 @@
|
|
|
if (!d || typeof d !== 'object') return null;
|
|
if (!d || typeof d !== 'object') return null;
|
|
|
var appId = resolveWxConfigAppIdFromSignData(d);
|
|
var appId = resolveWxConfigAppIdFromSignData(d);
|
|
|
var timestamp = d.timestamp != null ? d.timestamp : d.timeStamp;
|
|
var timestamp = d.timestamp != null ? d.timestamp : d.timeStamp;
|
|
|
- var nonceStr = d.nonceStr || d.noncestr || d.nonce;
|
|
|
|
|
|
|
+ var nonceStr =
|
|
|
|
|
+ d.nonceStr != null && String(d.nonceStr) !== ''
|
|
|
|
|
+ ? d.nonceStr
|
|
|
|
|
+ : d.noncestr != null && String(d.noncestr) !== ''
|
|
|
|
|
+ ? d.noncestr
|
|
|
|
|
+ : d.nonce;
|
|
|
var signature = d.signature || d.sign;
|
|
var signature = d.signature || d.sign;
|
|
|
- if (!appId || timestamp == null || !nonceStr || !signature) return null;
|
|
|
|
|
|
|
+ if (!appId || timestamp == null || nonceStr == null || nonceStr === '' || !signature) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ var signedUrl = String(signUrlUsed || '')
|
|
|
|
|
+ .split('#')[0]
|
|
|
|
|
+ .trim();
|
|
|
return {
|
|
return {
|
|
|
appId: String(appId),
|
|
appId: String(appId),
|
|
|
timestamp: Number(timestamp),
|
|
timestamp: Number(timestamp),
|
|
|
nonceStr: String(nonceStr),
|
|
nonceStr: String(nonceStr),
|
|
|
- signature: String(signature)
|
|
|
|
|
|
|
+ signature: String(signature),
|
|
|
|
|
+ signUrl: signedUrl
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1221,6 +1236,10 @@
|
|
|
if (wxInitLastError) console.warn('[wx]', wxInitLastError);
|
|
if (wxInitLastError) console.warn('[wx]', wxInitLastError);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * htmlUrl = location.href.split('#')[0]
|
|
|
|
|
+ * POST getWxConfig,body: { url: htmlUrl }
|
|
|
|
|
+ */
|
|
|
function requestWeChatJssdkSignAndConfig(htmlUrlOptional) {
|
|
function requestWeChatJssdkSignAndConfig(htmlUrlOptional) {
|
|
|
var htmlUrl = String(
|
|
var htmlUrl = String(
|
|
|
htmlUrlOptional != null ? htmlUrlOptional : getWxConfigSignUrl()
|
|
htmlUrlOptional != null ? htmlUrlOptional : getWxConfigSignUrl()
|
|
@@ -1232,17 +1251,22 @@
|
|
|
}
|
|
}
|
|
|
if (isWxDebugOn()) {
|
|
if (isWxDebugOn()) {
|
|
|
try {
|
|
try {
|
|
|
- window.alert('htmlUrl(签名用):\n' + htmlUrl);
|
|
|
|
|
|
|
+ window.alert('htmlUrl(签名用,应与地址栏一致):\n' + htmlUrl);
|
|
|
} catch (eDbg) {}
|
|
} catch (eDbg) {}
|
|
|
}
|
|
}
|
|
|
- var requestUrl = buildWxGetConfigRequestUrl(htmlUrl);
|
|
|
|
|
|
|
+ var requestUrl = getWxGetConfigApiUrl();
|
|
|
|
|
+ var requestBody = buildWxGetConfigRequestBody(htmlUrl);
|
|
|
console.log('[wx] htmlUrl=', htmlUrl);
|
|
console.log('[wx] htmlUrl=', htmlUrl);
|
|
|
- console.log('[wx] GET getWxConfig →', requestUrl);
|
|
|
|
|
|
|
+ console.log('[wx] POST getWxConfig →', requestUrl, requestBody);
|
|
|
return fetch(requestUrl, {
|
|
return fetch(requestUrl, {
|
|
|
- method: 'GET',
|
|
|
|
|
|
|
+ method: 'POST',
|
|
|
mode: 'cors',
|
|
mode: 'cors',
|
|
|
credentials: 'omit',
|
|
credentials: 'omit',
|
|
|
- headers: { Accept: 'application/json' }
|
|
|
|
|
|
|
+ headers: {
|
|
|
|
|
+ Accept: 'application/json',
|
|
|
|
|
+ 'Content-Type': 'application/json;charset=UTF-8'
|
|
|
|
|
+ },
|
|
|
|
|
+ body: JSON.stringify(requestBody)
|
|
|
})
|
|
})
|
|
|
.then(function (r) {
|
|
.then(function (r) {
|
|
|
if (r.ok) return r.json();
|
|
if (r.ok) return r.json();
|
|
@@ -1271,8 +1295,9 @@
|
|
|
}
|
|
}
|
|
|
var sign = normalizeWxJssdkSignPayload(res, htmlUrl);
|
|
var sign = normalizeWxJssdkSignPayload(res, htmlUrl);
|
|
|
if (!sign) {
|
|
if (!sign) {
|
|
|
|
|
+ console.warn('[wx] getWxConfig 响应字段不全', res, 'htmlUrl=', htmlUrl);
|
|
|
throw new Error(
|
|
throw new Error(
|
|
|
- 'getWxConfig 缺少 appId/timestamp/nonceStr/signature'
|
|
|
|
|
|
|
+ 'getWxConfig 缺少 appId/timestamp/nonceStr/signature(见控制台)'
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
if (sign.appId !== WECHAT_MP_APP_ID) {
|
|
if (sign.appId !== WECHAT_MP_APP_ID) {
|