|
@@ -490,62 +490,6 @@
|
|
|
pointer-events: auto;
|
|
pointer-events: auto;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .fab-dock__slot {
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- max-width: 320px;
|
|
|
|
|
- height: 48px;
|
|
|
|
|
- margin: 0 auto;
|
|
|
|
|
- pointer-events: auto;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- #openApp img {
|
|
|
|
|
- display: block;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 48px;
|
|
|
|
|
- object-fit: contain;
|
|
|
|
|
- pointer-events: none;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- #launch-btn {
|
|
|
|
|
- display: none;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 48px;
|
|
|
|
|
- min-height: 48px;
|
|
|
|
|
- border-radius: 24px;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
- opacity: 1;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- body.is-wechat.wx-jssdk-ready #launch-btn {
|
|
|
|
|
- display: block;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- body.is-wechat.wx-jssdk-ready #openApp {
|
|
|
|
|
- display: none !important;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- #openAppToast {
|
|
|
|
|
- display: none;
|
|
|
|
|
- position: fixed;
|
|
|
|
|
- left: 16px;
|
|
|
|
|
- right: 16px;
|
|
|
|
|
- bottom: calc(72px + var(--safe-bottom));
|
|
|
|
|
- z-index: 10001;
|
|
|
|
|
- padding: 10px 14px;
|
|
|
|
|
- font-size: 13px;
|
|
|
|
|
- line-height: 1.45;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- background: rgba(0, 0, 0, 0.78);
|
|
|
|
|
- border-radius: 8px;
|
|
|
|
|
- pointer-events: none;
|
|
|
|
|
- word-break: break-all;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- #openApp {
|
|
|
|
|
- touch-action: manipulation;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
.fab {
|
|
.fab {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
@@ -644,72 +588,18 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div id="openAppToast" role="status" aria-live="polite"></div>
|
|
|
|
|
<div class="fab-wrap">
|
|
<div class="fab-wrap">
|
|
|
- <div class="fab-dock__slot">
|
|
|
|
|
- <!-- 非微信 / 微信 JSSDK 未就绪:scheme 唤起 -->
|
|
|
|
|
- <button type="button" class="fab" id="openApp">
|
|
|
|
|
- <img src="images/uBtn.png" alt="APP内打开" decoding="async">
|
|
|
|
|
- </button>
|
|
|
|
|
- <!-- 微信内 wx.config 成功后:仅此按钮可唤起 App(须用户直接点击) -->
|
|
|
|
|
- <wx-open-launch-app id="launch-btn" appid="wxf5f1efe3a9f5012e" extinfo="">
|
|
|
|
|
- <script type="text/wxtag-template">
|
|
|
|
|
- <style>
|
|
|
|
|
- .wx-open-app-btn {
|
|
|
|
|
- display: block;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 48px;
|
|
|
|
|
- margin: 0;
|
|
|
|
|
- padding: 0;
|
|
|
|
|
- border: none;
|
|
|
|
|
- border-radius: 24px;
|
|
|
|
|
- background: #F47D1F;
|
|
|
|
|
- box-shadow: 0 4px 16px rgba(245, 130, 32, 0.45);
|
|
|
|
|
- cursor: pointer;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
- -webkit-tap-highlight-color: transparent;
|
|
|
|
|
- }
|
|
|
|
|
- .wx-open-app-btn img {
|
|
|
|
|
- display: block;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 48px;
|
|
|
|
|
- object-fit: contain;
|
|
|
|
|
- opacity: 1;
|
|
|
|
|
- pointer-events: none;
|
|
|
|
|
- -webkit-user-drag: none;
|
|
|
|
|
- }
|
|
|
|
|
- </style>
|
|
|
|
|
- <button class="wx-open-app-btn" aria-label="APP内打开">
|
|
|
|
|
- <img src="https://test.ailien.shop/h5/HBuilderProjects/images/uBtn.png" alt="APP内打开" width="320" height="48" />
|
|
|
|
|
- </button>
|
|
|
|
|
- </script>
|
|
|
|
|
- </wx-open-launch-app>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <button type="button" class="fab" id="openApp">
|
|
|
|
|
+ <img src="images/uBtn.png" alt="APP内打开" decoding="async">
|
|
|
|
|
+ </button>
|
|
|
<div class="home-indicator" aria-hidden="true"></div>
|
|
<div class="home-indicator" aria-hidden="true"></div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
|
|
|
|
|
- <script>
|
|
|
|
|
|
|
+ <script>
|
|
|
(function () {
|
|
(function () {
|
|
|
'use strict';
|
|
'use strict';
|
|
|
|
|
|
|
|
var API_BASE = 'https://test.ailien.shop/alienStore';
|
|
var API_BASE = 'https://test.ailien.shop/alienStore';
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 微信 JSSDK — 与 shareIndex.html 一致
|
|
|
|
|
- * 后端 POST {API_BASE}/wx/getWxConfig,body 传 url(当前页完整地址,不含 #)
|
|
|
|
|
- */
|
|
|
|
|
- var WECHAT_MP_APP_ID = 'wx412792c77f47babd';
|
|
|
|
|
- var WECHAT_OPEN_APP_ID = 'wxf5f1efe3a9f5012e';
|
|
|
|
|
- var WECHAT_GET_WX_CONFIG_PATH = '/wx/getWxConfig';
|
|
|
|
|
- var H5_PAGE_BASE_FALLBACK = 'https://test.ailien.shop/h5/HBuilderProjects/';
|
|
|
|
|
- var WX_GET_CONFIG_SIGN_URL = H5_PAGE_BASE_FALLBACK + 'shareDynamic.html';
|
|
|
|
|
- var WECHAT_JS_SAFE_HOSTS = ['uat.ailien.shop', 'test.ailien.shop'];
|
|
|
|
|
- var weChatJssdkConfigured = false;
|
|
|
|
|
- var wxConfigSignRetriedBaseUrl = false;
|
|
|
|
|
- var wxInitLastError = '';
|
|
|
|
|
- var wxJssdkInitPromise = null;
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* 暂无承载数据时更多推荐:POST …/ai/multimodal-services/api/v1/search/global/store-recommend
|
|
* 暂无承载数据时更多推荐:POST …/ai/multimodal-services/api/v1/search/global/store-recommend
|
|
|
* 与 shareIndex.html / shareCheckInUndefined.html 一致。
|
|
* 与 shareIndex.html / shareCheckInUndefined.html 一致。
|
|
@@ -804,77 +694,33 @@
|
|
|
return pathPart.replace(/^\/+/, '');
|
|
return pathPart.replace(/^\/+/, '');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- function appendFromShareDynamicToRaw(qs) {
|
|
|
|
|
- var s = String(qs || '').trim();
|
|
|
|
|
- if (!s) return 'fromShareDynamic=1';
|
|
|
|
|
- var pad = '&' + s + '&';
|
|
|
|
|
- if (/[&?](fromShareDynamic|FROMSHAREDYNAMIC)=/i.test(pad)) return s;
|
|
|
|
|
- return s + '&fromShareDynamic=1';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function rawQueryHasItem(qs) {
|
|
|
|
|
- return /(?:^|&)item=/i.test('&' + String(qs || '') + '&');
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ function buildAppOpenQueryStringMerged() {
|
|
|
|
|
+ var params = mergeSearchAndHashParams();
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 唤起 App / 微信 extinfo:优先原样透传地址栏 query(保留 item 双重编码、OSS 内 & 不被拆参)。
|
|
|
|
|
- * search 与 hash 同时存在时:含 item 的一侧优先,否则 hash 覆盖 search(与 mergeSearchAndHashParams 一致)。
|
|
|
|
|
- */
|
|
|
|
|
- function getRawMergedQueryForAppOpen() {
|
|
|
|
|
- var rawSearch =
|
|
|
|
|
- location.search && location.search.length > 1 ? location.search.slice(1) : '';
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 唤起 newdetails 与 H5 **query 原样一致**:用浏览器地址栏原始串 + `fromShareDynamic=1`,
|
|
|
|
|
+ * 避免 item 经 JSON.stringify / URLSearchParams 再编码与微信落地链不一致。
|
|
|
|
|
+ * 仅「仅有 search」或「仅有 hash 内 ? 段」时走此路径;二者皆有或皆无则走下方补全。
|
|
|
|
|
+ */
|
|
|
|
|
+ var rawSearch = location.search && location.search.length > 1 ? location.search.slice(1) : '';
|
|
|
var hash0 = location.hash || '';
|
|
var hash0 = location.hash || '';
|
|
|
var hqi0 = hash0.indexOf('?');
|
|
var hqi0 = hash0.indexOf('?');
|
|
|
var rawHashQ = hqi0 >= 0 ? hash0.slice(hqi0 + 1) : '';
|
|
var rawHashQ = hqi0 >= 0 ? hash0.slice(hqi0 + 1) : '';
|
|
|
-
|
|
|
|
|
- if (!rawSearch && !rawHashQ) return '';
|
|
|
|
|
-
|
|
|
|
|
- if (rawHashQ && rawSearch) {
|
|
|
|
|
- if (rawQueryHasItem(rawHashQ)) return rawHashQ;
|
|
|
|
|
- if (rawQueryHasItem(rawSearch)) return rawSearch;
|
|
|
|
|
- return rawHashQ;
|
|
|
|
|
|
|
+ function appendFromShareDynamicToRaw(qs) {
|
|
|
|
|
+ var s = String(qs || '').trim();
|
|
|
|
|
+ if (!s) return 'fromShareDynamic=1';
|
|
|
|
|
+ var pad = '&' + s + '&';
|
|
|
|
|
+ if (/[&?](fromShareDynamic|FROMSHAREDYNAMIC)=/i.test(pad)) return s;
|
|
|
|
|
+ return s + '&fromShareDynamic=1';
|
|
|
}
|
|
}
|
|
|
- return rawHashQ || rawSearch;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /** 从原始 query 串截取 item= 值(不 decode),供微信 extinfo 限长时保留编码 */
|
|
|
|
|
- function extractRawItemParamFromQuery(qs) {
|
|
|
|
|
- var pad = '&' + String(qs || '') + '&';
|
|
|
|
|
- var m = /&item=([^&]*)/i.exec(pad);
|
|
|
|
|
- return m ? m[1] : '';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /** App / 微信 extinfo:item 须双重 URL 编码;已是 %257B… 则不再编码 */
|
|
|
|
|
- function formatItemForShoproQuery(rawItem) {
|
|
|
|
|
- var s = String(rawItem || '').trim();
|
|
|
|
|
- if (!s) return '';
|
|
|
|
|
- if (/^%25(?:7B|5B|22)/i.test(s)) {
|
|
|
|
|
- return s;
|
|
|
|
|
- }
|
|
|
|
|
- if (/^%7B/i.test(s)) {
|
|
|
|
|
- return encodeURIComponent(s);
|
|
|
|
|
- }
|
|
|
|
|
- var parsed = tryParseJsonObject(s);
|
|
|
|
|
- if (parsed) {
|
|
|
|
|
- try {
|
|
|
|
|
- return encodeURIComponent(encodeURIComponent(JSON.stringify(parsed)));
|
|
|
|
|
- } catch (eJson) {}
|
|
|
|
|
|
|
+ if (rawSearch && !rawHashQ) {
|
|
|
|
|
+ return '?' + appendFromShareDynamicToRaw(rawSearch);
|
|
|
}
|
|
}
|
|
|
- if (s.charAt(0) === '{' || s.charAt(0) === '[') {
|
|
|
|
|
- return encodeURIComponent(encodeURIComponent(s));
|
|
|
|
|
|
|
+ if (!rawSearch && rawHashQ) {
|
|
|
|
|
+ return '?' + appendFromShareDynamicToRaw(rawHashQ);
|
|
|
}
|
|
}
|
|
|
- return encodeURIComponent(encodeURIComponent(s));
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function buildAppOpenQueryStringMerged() {
|
|
|
|
|
- var rawQs = getRawMergedQueryForAppOpen();
|
|
|
|
|
- if (rawQs) {
|
|
|
|
|
- return '?' + appendFromShareDynamicToRaw(rawQs);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- var params = mergeSearchAndHashParams();
|
|
|
|
|
|
|
|
|
|
- /** 地址栏无任何 query 时再补全 item / imagePath */
|
|
|
|
|
|
|
+ /** newdetails onLoad:仅当地址栏未带 item 时补全;同时按需补顶层 imagePath */
|
|
|
if (!params.has('item')) {
|
|
if (!params.has('item')) {
|
|
|
var itemObj = parseOptionsItem();
|
|
var itemObj = parseOptionsItem();
|
|
|
var imagePath = getMergedParam('imagePath');
|
|
var imagePath = getMergedParam('imagePath');
|
|
@@ -984,7 +830,10 @@
|
|
|
fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
|
|
fhfRaw != null && String(fhfRaw).trim() !== '' ? String(fhfRaw).trim() : '1';
|
|
|
var segs = [];
|
|
var segs = [];
|
|
|
if (itemForShopro && String(itemForShopro).trim()) {
|
|
if (itemForShopro && String(itemForShopro).trim()) {
|
|
|
- segs.push('item=' + formatItemForShoproQuery(itemForShopro));
|
|
|
|
|
|
|
+ segs.push(
|
|
|
|
|
+ 'item=' +
|
|
|
|
|
+ encodeURIComponent(encodeURIComponent(String(itemForShopro).trim()))
|
|
|
|
|
+ );
|
|
|
}
|
|
}
|
|
|
segs.push('needShowMore=' + encodeURIComponent(nsmOut));
|
|
segs.push('needShowMore=' + encodeURIComponent(nsmOut));
|
|
|
segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
|
|
segs.push('fromHomeFeed=' + encodeURIComponent(fhfOut));
|
|
@@ -1063,13 +912,17 @@
|
|
|
return out.length <= maxLen ? out : fullUrl;
|
|
return out.length <= maxLen ? out : fullUrl;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- function getAppUniPathForShareDynamic() {
|
|
|
|
|
|
|
+ function buildAppDeepLink() {
|
|
|
if (isClosedMerchantForAppOpen()) {
|
|
if (isClosedMerchantForAppOpen()) {
|
|
|
- return 'pages/index/login';
|
|
|
|
|
|
|
+ var sClosed = buildAppOpenQueryStringMerged();
|
|
|
|
|
+ var rootClosed = APP_IOS_URL_SCHEME.replace(/\/$/, '');
|
|
|
|
|
+ var pathClosed = 'pages/index/login'.replace(/^\//, '');
|
|
|
|
|
+ var rawClosed = !sClosed ? rootClosed + '/' + pathClosed : rootClosed + '/' + pathClosed + sClosed;
|
|
|
|
|
+ return compactShoproDeepLinkIfTooLong(rawClosed, 7200);
|
|
|
}
|
|
}
|
|
|
var explicit = (getMergedParam('appPath') || getMergedParam('appPage') || '').trim().replace(/^\//, '');
|
|
var explicit = (getMergedParam('appPath') || getMergedParam('appPage') || '').trim().replace(/^\//, '');
|
|
|
var fromHash = extractUniPagePathFromHash();
|
|
var fromHash = extractUniPagePathFromHash();
|
|
|
- var defaultPath = String(APP_UNI_STORE_PATH || 'pages/newdetails/index').replace(/^\//, '');
|
|
|
|
|
|
|
+ var defaultPath = String(APP_UNI_STORE_PATH || '/pages/newdetails/index').replace(/^\//, '');
|
|
|
/**
|
|
/**
|
|
|
* 不要用「任意 pages/ 的 hash」当 App 路径:分享页常在 #/pages/shareDynamic?…,
|
|
* 不要用「任意 pages/ 的 hash」当 App 路径:分享页常在 #/pages/shareDynamic?…,
|
|
|
* 会误唤起成该页而不是 newdetails。仅当 hash 明确含 newdetails 时才采用 hash 路径。
|
|
* 会误唤起成该页而不是 newdetails。仅当 hash 明确含 newdetails 时才采用 hash 路径。
|
|
@@ -1078,90 +931,10 @@
|
|
|
if (!path && fromHash && /newdetails/i.test(fromHash)) {
|
|
if (!path && fromHash && /newdetails/i.test(fromHash)) {
|
|
|
path = fromHash.replace(/^\//, '');
|
|
path = fromHash.replace(/^\//, '');
|
|
|
}
|
|
}
|
|
|
- if (!path) path = defaultPath;
|
|
|
|
|
- return String(path || defaultPath).replace(/^\//, '');
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function buildAppUniPageLaunchUrl() {
|
|
|
|
|
- var path = getAppUniPathForShareDynamic();
|
|
|
|
|
- var qs = buildAppOpenQueryStringMerged().replace(/^\?/, '');
|
|
|
|
|
- return qs ? path + '?' + qs : path;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * wx-open-launch-app extinfo:pages/newdetails/index?item=…(与 buildAppUniPageLaunchUrl 一致)
|
|
|
|
|
- */
|
|
|
|
|
- function buildWeChatLaunchExtinfo() {
|
|
|
|
|
- var uniPage = buildAppUniPageLaunchUrl();
|
|
|
|
|
- if (uniPage.length <= 1024) return uniPage;
|
|
|
|
|
-
|
|
|
|
|
- var path = getAppUniPathForShareDynamic();
|
|
|
|
|
- if (!/newdetails/i.test(path)) {
|
|
|
|
|
- var deepOther = buildAppDeepLink().replace(/^shopro:\/\//i, '');
|
|
|
|
|
- if (deepOther.length <= 1024) return deepOther;
|
|
|
|
|
- return deepOther.slice(0, 1024);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /** 微信 extinfo ≤1024:优先保留原始 item= 编码 + 关键开关,避免重建 query 导致 App 解析失败 */
|
|
|
|
|
- var rawQs = getRawMergedQueryForAppOpen();
|
|
|
|
|
- if (rawQs) {
|
|
|
|
|
- var itemRaw = extractRawItemParamFromQuery(rawQs);
|
|
|
|
|
- var nsmWx = getMergedParam('needShowMore');
|
|
|
|
|
- var nsmOutWx =
|
|
|
|
|
- nsmWx != null && String(nsmWx).trim() !== '' ? String(nsmWx).trim() : 'true';
|
|
|
|
|
- var fhfWx = getMergedParam('fromHomeFeed');
|
|
|
|
|
- var fhfOutWx =
|
|
|
|
|
- fhfWx != null && String(fhfWx).trim() !== '' ? String(fhfWx).trim() : '1';
|
|
|
|
|
- var wxSegs = [];
|
|
|
|
|
- if (itemRaw) wxSegs.push('item=' + itemRaw);
|
|
|
|
|
- wxSegs.push('needShowMore=' + encodeURIComponent(nsmOutWx));
|
|
|
|
|
- wxSegs.push('fromHomeFeed=' + encodeURIComponent(fhfOutWx));
|
|
|
|
|
- wxSegs.push('fromShareDynamic=1');
|
|
|
|
|
- var stWx =
|
|
|
|
|
- getMergedParam('sourceType') ||
|
|
|
|
|
- getMergedParam('type') ||
|
|
|
|
|
- '';
|
|
|
|
|
- if (stWx) wxSegs.push('sourceType=' + encodeURIComponent(String(stWx).trim()));
|
|
|
|
|
- var packedWx = path + '?' + wxSegs.join('&');
|
|
|
|
|
- if (packedWx.length <= 1024) return packedWx;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- var blob = parseShareDynamicItemBlob();
|
|
|
|
|
- var mini = new URLSearchParams();
|
|
|
|
|
- if (blob && blob.id != null && String(blob.id).trim() !== '') {
|
|
|
|
|
- var did = String(blob.id).trim();
|
|
|
|
|
- mini.set('dynamicId', did);
|
|
|
|
|
- mini.set('sourceId', did);
|
|
|
|
|
- }
|
|
|
|
|
- var st =
|
|
|
|
|
- getMergedParam('sourceType') ||
|
|
|
|
|
- getMergedParam('type') ||
|
|
|
|
|
- (blob && blob.type != null ? String(blob.type) : '');
|
|
|
|
|
- if (st) mini.set('sourceType', st);
|
|
|
|
|
- else mini.set('sourceType', '1');
|
|
|
|
|
- var nsmRaw = getMergedParam('needShowMore');
|
|
|
|
|
- if (nsmRaw != null && String(nsmRaw).trim() !== '') {
|
|
|
|
|
- mini.set('needShowMore', String(nsmRaw).trim());
|
|
|
|
|
- }
|
|
|
|
|
- var fhfRaw = getMergedParam('fromHomeFeed');
|
|
|
|
|
- if (fhfRaw != null && String(fhfRaw).trim() !== '') {
|
|
|
|
|
- mini.set('fromHomeFeed', String(fhfRaw).trim());
|
|
|
|
|
- }
|
|
|
|
|
- mini.set('fromShareDynamic', '1');
|
|
|
|
|
- var shortPage = path + '?' + mini.toString();
|
|
|
|
|
- if (shortPage.length <= 1024) return shortPage;
|
|
|
|
|
- return shortPage.slice(0, 1024);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function buildAppDeepLink() {
|
|
|
|
|
- if (isClosedMerchantForAppOpen()) {
|
|
|
|
|
- var sClosed = buildAppOpenQueryStringMerged();
|
|
|
|
|
- var rootClosed = APP_IOS_URL_SCHEME.replace(/\/$/, '');
|
|
|
|
|
- var pathClosed = 'pages/index/login'.replace(/^\//, '');
|
|
|
|
|
- var rawClosed = !sClosed ? rootClosed + '/' + pathClosed : rootClosed + '/' + pathClosed + sClosed;
|
|
|
|
|
- return compactShoproDeepLinkIfTooLong(rawClosed, 7200);
|
|
|
|
|
|
|
+ if (!path) {
|
|
|
|
|
+ path = defaultPath;
|
|
|
}
|
|
}
|
|
|
- var path = getAppUniPathForShareDynamic();
|
|
|
|
|
|
|
+ path = String(path || defaultPath).replace(/^\//, '');
|
|
|
var s = buildAppOpenQueryStringMerged();
|
|
var s = buildAppOpenQueryStringMerged();
|
|
|
var root = APP_IOS_URL_SCHEME.replace(/\/$/, '');
|
|
var root = APP_IOS_URL_SCHEME.replace(/\/$/, '');
|
|
|
var raw = !s ? root + '/' + path : root + '/' + path + s;
|
|
var raw = !s ? root + '/' + path : root + '/' + path + s;
|
|
@@ -1188,404 +961,6 @@
|
|
|
} catch (e) {}
|
|
} catch (e) {}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- function readQueryParam(name) {
|
|
|
|
|
- var v = mergeSearchAndHashParams().get(name);
|
|
|
|
|
- return v == null ? '' : String(v);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function isWxDebugOn() {
|
|
|
|
|
- return readQueryParam('wxDebug') === '1';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function isWxForceDebug() {
|
|
|
|
|
- return readQueryParam('wxForce') === '1';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function isWxConfigOnClickDebug() {
|
|
|
|
|
- return readQueryParam('wxConfigOnClick') === '1';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function isWxPcAutoDebugHost() {
|
|
|
|
|
- var h = (location.hostname || '').toLowerCase();
|
|
|
|
|
- if (h === 'localhost' || h === '127.0.0.1') return true;
|
|
|
|
|
- for (var i = 0; i < WECHAT_JS_SAFE_HOSTS.length; i++) {
|
|
|
|
|
- if (WECHAT_JS_SAFE_HOSTS[i] === h) return true;
|
|
|
|
|
- }
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function isWxPcBrowser() {
|
|
|
|
|
- return !isWeChatInAppBrowser();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function shouldInitWeChatJssdkOnLoad() {
|
|
|
|
|
- if (isWeChatInAppBrowser()) return true;
|
|
|
|
|
- return isWxForceDebug() || isWxPcAutoDebugHost();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function shouldFetchWxConfig(fromUserClick) {
|
|
|
|
|
- if (isWeChatInAppBrowser()) return true;
|
|
|
|
|
- if (fromUserClick) return true;
|
|
|
|
|
- return isWxForceDebug() || isWxPcAutoDebugHost();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function getWxHtmlUrl() {
|
|
|
|
|
- var forced = String(readQueryParam('wxSignUrl') || '').trim();
|
|
|
|
|
- if (forced) return forced.split('#')[0];
|
|
|
|
|
- return String(location.href || '').split('#')[0];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function getWxSignPageUrlForApi() {
|
|
|
|
|
- var htmlUrl = getWxHtmlUrl();
|
|
|
|
|
- if (htmlUrl && /^https?:\/\//i.test(htmlUrl)) return htmlUrl;
|
|
|
|
|
- return WX_GET_CONFIG_SIGN_URL;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function getWxHtmlUrlBase() {
|
|
|
|
|
- var htmlUrl = getWxSignPageUrlForApi();
|
|
|
|
|
- try {
|
|
|
|
|
- var u = new URL(htmlUrl);
|
|
|
|
|
- return u.origin + u.pathname;
|
|
|
|
|
- } catch (eU) {
|
|
|
|
|
- return WX_GET_CONFIG_SIGN_URL;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function getWxConfigSignUrl() {
|
|
|
|
|
- if (String(readQueryParam('wxSignBaseOnly') || '') === '1') return getWxHtmlUrlBase();
|
|
|
|
|
- return getWxSignPageUrlForApi();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function getWxGetConfigApiUrl() {
|
|
|
|
|
- return API_BASE.replace(/\/$/, '') + WECHAT_GET_WX_CONFIG_PATH;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function buildWxGetConfigRequestBody(htmlUrl) {
|
|
|
|
|
- return {
|
|
|
|
|
- url: String(htmlUrl || '').split('#')[0].trim()
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function resolveWxConfigAppIdFromSignData(d) {
|
|
|
|
|
- if (!d || typeof d !== 'object') return '';
|
|
|
|
|
- var mp =
|
|
|
|
|
- d.mpAppId ||
|
|
|
|
|
- d.mpAppid ||
|
|
|
|
|
- d.officialAppId ||
|
|
|
|
|
- d.gzhAppId ||
|
|
|
|
|
- d.serviceAppId;
|
|
|
|
|
- if (mp != null && String(mp).trim() !== '') return String(mp).trim();
|
|
|
|
|
- var fromQuery = String(readQueryParam('wxMpAppId') || WECHAT_MP_APP_ID || '').trim();
|
|
|
|
|
- if (fromQuery) return fromQuery;
|
|
|
|
|
- var raw = d.appId || d.appid || d.wxAppId;
|
|
|
|
|
- return raw != null && String(raw).trim() !== '' ? String(raw).trim() : '';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function normalizeWxJssdkSignPayload(res, signUrlUsed) {
|
|
|
|
|
- if (!res || typeof res !== 'object') return null;
|
|
|
|
|
- var d = res.data != null && typeof res.data === 'object' ? res.data : res;
|
|
|
|
|
- if (!d || typeof d !== 'object') return null;
|
|
|
|
|
- var appId = resolveWxConfigAppIdFromSignData(d);
|
|
|
|
|
- var timestamp = d.timestamp != null ? d.timestamp : d.timeStamp;
|
|
|
|
|
- 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;
|
|
|
|
|
- if (!appId || timestamp == null || nonceStr == null || nonceStr === '' || !signature) {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- return {
|
|
|
|
|
- appId: String(appId),
|
|
|
|
|
- timestamp: Number(timestamp),
|
|
|
|
|
- nonceStr: String(nonceStr),
|
|
|
|
|
- signature: String(signature),
|
|
|
|
|
- signUrl: String(signUrlUsed || '')
|
|
|
|
|
- .split('#')[0]
|
|
|
|
|
- .trim()
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function getWxErrMsg(err) {
|
|
|
|
|
- if (!err) return '';
|
|
|
|
|
- if (err.errMsg) return String(err.errMsg);
|
|
|
|
|
- if (typeof err === 'string') return err;
|
|
|
|
|
- try {
|
|
|
|
|
- return JSON.stringify(err);
|
|
|
|
|
- } catch (e) {
|
|
|
|
|
- return String(err);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function formatWxConfigErrorTip(err, signPageUrl) {
|
|
|
|
|
- var errMsg = getWxErrMsg(err);
|
|
|
|
|
- var tip = '微信 JSSDK 配置失败';
|
|
|
|
|
- if (/invalid signature/i.test(errMsg)) {
|
|
|
|
|
- return (
|
|
|
|
|
- tip +
|
|
|
|
|
- ':签名无效。url=' +
|
|
|
|
|
- (signPageUrl || getWxHtmlUrl()) +
|
|
|
|
|
- ';appId=' +
|
|
|
|
|
- WECHAT_MP_APP_ID
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
- if (/require\s*subscribe/i.test(errMsg)) {
|
|
|
|
|
- return tip + ':' + errMsg + '(服务号需用户已关注)';
|
|
|
|
|
- }
|
|
|
|
|
- return errMsg ? tip + ':' + errMsg : tip;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function setWxInitError(msg) {
|
|
|
|
|
- wxInitLastError = String(msg || '').trim();
|
|
|
|
|
- if (wxInitLastError) console.warn('[wx]', wxInitLastError);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function requestWeChatJssdkSignAndConfig(htmlUrlOptional) {
|
|
|
|
|
- var htmlUrl = String(
|
|
|
|
|
- htmlUrlOptional != null ? htmlUrlOptional : getWxConfigSignUrl()
|
|
|
|
|
- )
|
|
|
|
|
- .split('#')[0]
|
|
|
|
|
- .trim();
|
|
|
|
|
- if (!htmlUrl || !/^https?:\/\//i.test(htmlUrl)) {
|
|
|
|
|
- htmlUrl = WX_GET_CONFIG_SIGN_URL;
|
|
|
|
|
- }
|
|
|
|
|
- if (isWxDebugOn()) {
|
|
|
|
|
- try {
|
|
|
|
|
- window.alert('htmlUrl(签名用):\n' + htmlUrl);
|
|
|
|
|
- } catch (eDbg) {}
|
|
|
|
|
- }
|
|
|
|
|
- var requestUrl = getWxGetConfigApiUrl();
|
|
|
|
|
- var requestBody = buildWxGetConfigRequestBody(htmlUrl);
|
|
|
|
|
- console.log('[wx] htmlUrl=', htmlUrl);
|
|
|
|
|
- console.log('[wx] POST getWxConfig →', requestUrl, requestBody);
|
|
|
|
|
- return fetch(requestUrl, {
|
|
|
|
|
- method: 'POST',
|
|
|
|
|
- mode: 'cors',
|
|
|
|
|
- credentials: 'omit',
|
|
|
|
|
- headers: {
|
|
|
|
|
- Accept: 'application/json',
|
|
|
|
|
- 'Content-Type': 'application/json;charset=UTF-8'
|
|
|
|
|
- },
|
|
|
|
|
- body: JSON.stringify(requestBody)
|
|
|
|
|
- })
|
|
|
|
|
- .then(function (r) {
|
|
|
|
|
- if (r.ok) return r.json();
|
|
|
|
|
- return r
|
|
|
|
|
- .text()
|
|
|
|
|
- .catch(function () {
|
|
|
|
|
- return '';
|
|
|
|
|
- })
|
|
|
|
|
- .then(function (text) {
|
|
|
|
|
- var hint = '';
|
|
|
|
|
- try {
|
|
|
|
|
- var j = JSON.parse(text);
|
|
|
|
|
- hint = j.msg || j.message || '';
|
|
|
|
|
- } catch (eP) {
|
|
|
|
|
- if (text) hint = text.slice(0, 120);
|
|
|
|
|
- }
|
|
|
|
|
- throw new Error('getWxConfig HTTP ' + r.status + (hint ? ':' + hint : ''));
|
|
|
|
|
- });
|
|
|
|
|
- })
|
|
|
|
|
- .then(function (res) {
|
|
|
|
|
- if (res && res.code != null) {
|
|
|
|
|
- var c = Number(res.code);
|
|
|
|
|
- if (c !== 200 && c !== 0 && res.success !== true) {
|
|
|
|
|
- throw new Error(res.msg || res.message || 'getWxConfig code ' + c);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- var sign = normalizeWxJssdkSignPayload(res, htmlUrl);
|
|
|
|
|
- if (!sign) {
|
|
|
|
|
- console.warn('[wx] getWxConfig 响应字段不全', res, 'htmlUrl=', htmlUrl);
|
|
|
|
|
- throw new Error(
|
|
|
|
|
- 'getWxConfig 缺少 appId/timestamp/nonceStr/signature(见控制台)'
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
- if (sign.appId !== WECHAT_MP_APP_ID) {
|
|
|
|
|
- console.warn(
|
|
|
|
|
- '[wx] 后端 appId=' + sign.appId + ',期望服务号 ' + WECHAT_MP_APP_ID
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
- if (typeof wx === 'undefined') {
|
|
|
|
|
- if (isWxPcBrowser()) {
|
|
|
|
|
- console.log('[wx] PC getWxConfig 成功(无 jweixin)', sign);
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- setWxInitError('jweixin.js 未加载');
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- return applyWxConfigFromSign(sign, htmlUrl);
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function applyWxConfigFromSign(sign, htmlUrl) {
|
|
|
|
|
- var wxConfigParams = {
|
|
|
|
|
- debug: isWxDebugOn(),
|
|
|
|
|
- appId: String(sign.appId),
|
|
|
|
|
- timestamp: sign.timestamp,
|
|
|
|
|
- nonceStr: String(sign.nonceStr),
|
|
|
|
|
- signature: String(sign.signature),
|
|
|
|
|
- jsApiList: [],
|
|
|
|
|
- openTagList: ['wx-open-launch-app']
|
|
|
|
|
- };
|
|
|
|
|
- return new Promise(function (resolve) {
|
|
|
|
|
- wx.config(wxConfigParams);
|
|
|
|
|
- wx.ready(function () {
|
|
|
|
|
- weChatJssdkConfigured = true;
|
|
|
|
|
- document.body.classList.add('wx-jssdk-ready');
|
|
|
|
|
- refreshWxLaunchTagAttrs();
|
|
|
|
|
- console.log('[wx.config] ready, htmlUrl=', htmlUrl);
|
|
|
|
|
- resolve(true);
|
|
|
|
|
- });
|
|
|
|
|
- wx.error(function (err) {
|
|
|
|
|
- weChatJssdkConfigured = false;
|
|
|
|
|
- document.body.classList.remove('wx-jssdk-ready');
|
|
|
|
|
- wxJssdkInitPromise = null;
|
|
|
|
|
- var errMsg = getWxErrMsg(err);
|
|
|
|
|
- setWxInitError(formatWxConfigErrorTip(err, htmlUrl));
|
|
|
|
|
- if (isWxDebugOn()) window.alert(wxInitLastError);
|
|
|
|
|
- console.warn('[wx.config]', errMsg, 'htmlUrl=', htmlUrl);
|
|
|
|
|
- var baseUrl = getWxHtmlUrlBase();
|
|
|
|
|
- var fullUrl = getWxSignPageUrlForApi();
|
|
|
|
|
- if (
|
|
|
|
|
- !/invalid signature/i.test(errMsg) ||
|
|
|
|
|
- wxConfigSignRetriedBaseUrl ||
|
|
|
|
|
- baseUrl === fullUrl ||
|
|
|
|
|
- htmlUrl === baseUrl
|
|
|
|
|
- ) {
|
|
|
|
|
- resolve(false);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- wxConfigSignRetriedBaseUrl = true;
|
|
|
|
|
- requestWeChatJssdkSignAndConfig(baseUrl).then(resolve);
|
|
|
|
|
- });
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function refreshWxLaunchTagAttrs() {
|
|
|
|
|
- var tag = document.getElementById('launch-btn');
|
|
|
|
|
- if (!tag) return;
|
|
|
|
|
- try {
|
|
|
|
|
- tag.setAttribute('appid', WECHAT_OPEN_APP_ID);
|
|
|
|
|
- tag.setAttribute('extinfo', buildWeChatLaunchExtinfo());
|
|
|
|
|
- } catch (eA) {}
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function bindWeChatLaunchTagEvents() {
|
|
|
|
|
- var tag = document.getElementById('launch-btn');
|
|
|
|
|
- if (!tag || tag._wxLaunchBound) return;
|
|
|
|
|
- tag._wxLaunchBound = true;
|
|
|
|
|
- refreshWxLaunchTagAttrs();
|
|
|
|
|
- tag.addEventListener('launch', function () {
|
|
|
|
|
- console.log('[wx-open-launch-app] launch ok');
|
|
|
|
|
- showFabToast('正在打开 U店在哪…');
|
|
|
|
|
- });
|
|
|
|
|
- tag.addEventListener('error', function (e) {
|
|
|
|
|
- var detail = e && e.detail;
|
|
|
|
|
- var errMsg =
|
|
|
|
|
- detail && detail.errMsg
|
|
|
|
|
- ? String(detail.errMsg)
|
|
|
|
|
- : detail && detail.errmsg
|
|
|
|
|
- ? String(detail.errmsg)
|
|
|
|
|
- : '';
|
|
|
|
|
- console.warn('[wx-open-launch-app]', detail);
|
|
|
|
|
- showAppOpenFailTip(
|
|
|
|
|
- errMsg
|
|
|
|
|
- ? '未能唤起 App:' + errMsg
|
|
|
|
|
- : '未能唤起 App,请确认已安装 U店在哪,且开放平台已绑定服务号与移动应用。'
|
|
|
|
|
- );
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function initWeChatOpenLaunchApp(fromUserClick) {
|
|
|
|
|
- if (!shouldFetchWxConfig(!!fromUserClick)) {
|
|
|
|
|
- return Promise.resolve(false);
|
|
|
|
|
- }
|
|
|
|
|
- if (wxJssdkInitPromise && !fromUserClick) return wxJssdkInitPromise;
|
|
|
|
|
- wxConfigSignRetriedBaseUrl = false;
|
|
|
|
|
- wxInitLastError = '';
|
|
|
|
|
- var htmlUrl = getWxConfigSignUrl();
|
|
|
|
|
- bindWeChatLaunchTagEvents();
|
|
|
|
|
- wxJssdkInitPromise = requestWeChatJssdkSignAndConfig(htmlUrl)
|
|
|
|
|
- .then(function (ok) {
|
|
|
|
|
- if (ok === true) return true;
|
|
|
|
|
- if (!wxInitLastError) {
|
|
|
|
|
- setWxInitError('wx.config 失败,可加 ?wxDebug=1');
|
|
|
|
|
- }
|
|
|
|
|
- return false;
|
|
|
|
|
- })
|
|
|
|
|
- .catch(function (e) {
|
|
|
|
|
- var msg = e && e.message ? e.message : 'getWxConfig 请求失败';
|
|
|
|
|
- setWxInitError(msg);
|
|
|
|
|
- console.warn('[wx] init failed', msg, 'htmlUrl=', htmlUrl);
|
|
|
|
|
- if (isWeChatInAppBrowser() && isWxDebugOn()) window.alert(msg);
|
|
|
|
|
- return false;
|
|
|
|
|
- })
|
|
|
|
|
- .finally(function () {
|
|
|
|
|
- if (!weChatJssdkConfigured) wxJssdkInitPromise = null;
|
|
|
|
|
- });
|
|
|
|
|
- return wxJssdkInitPromise;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function scheduleWeChatJssdkBootstrap() {
|
|
|
|
|
- if (!shouldInitWeChatJssdkOnLoad()) return;
|
|
|
|
|
- var attempts = 0;
|
|
|
|
|
- function tick() {
|
|
|
|
|
- attempts += 1;
|
|
|
|
|
- if (weChatJssdkConfigured) return;
|
|
|
|
|
- initWeChatOpenLaunchApp();
|
|
|
|
|
- if (!weChatJssdkConfigured && attempts < 8 && typeof wx === 'undefined') {
|
|
|
|
|
- setTimeout(tick, 400);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- tick();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function showFabToast(msg, ms) {
|
|
|
|
|
- var tip = String(msg || '').trim();
|
|
|
|
|
- if (!tip) return;
|
|
|
|
|
- var el = document.getElementById('openAppToast');
|
|
|
|
|
- if (el) {
|
|
|
|
|
- el.textContent = tip;
|
|
|
|
|
- el.style.display = 'block';
|
|
|
|
|
- if (showFabToast._t) clearTimeout(showFabToast._t);
|
|
|
|
|
- showFabToast._t = setTimeout(function () {
|
|
|
|
|
- el.style.display = 'none';
|
|
|
|
|
- }, ms || 2800);
|
|
|
|
|
- }
|
|
|
|
|
- console.log('[openApp]', tip);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function showAppOpenFailTip(msg) {
|
|
|
|
|
- var tip = msg || '未能打开 App,请确认已安装最新版「U店在哪」。';
|
|
|
|
|
- if (typeof uni !== 'undefined' && typeof uni.showToast === 'function') {
|
|
|
|
|
- uni.showToast({ title: tip, icon: 'none', duration: 2800 });
|
|
|
|
|
- } else if (isWeChatInAppBrowser()) {
|
|
|
|
|
- window.alert(tip);
|
|
|
|
|
- } else {
|
|
|
|
|
- console.warn('[openApp]', tip);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function tryFetchWxConfigOnPcClick() {
|
|
|
|
|
- if (!isWxPcBrowser()) return Promise.resolve(false);
|
|
|
|
|
- showFabToast('正在请求 getWxConfig…');
|
|
|
|
|
- wxJssdkInitPromise = null;
|
|
|
|
|
- return initWeChatOpenLaunchApp(true).then(function (ok) {
|
|
|
|
|
- if (ok) {
|
|
|
|
|
- showFabToast(
|
|
|
|
|
- weChatJssdkConfigured
|
|
|
|
|
- ? 'getWxConfig 成功,wx.config 已就绪'
|
|
|
|
|
- : 'getWxConfig 成功'
|
|
|
|
|
- );
|
|
|
|
|
- } else {
|
|
|
|
|
- showFabToast(wxInitLastError || 'getWxConfig 失败');
|
|
|
|
|
- }
|
|
|
|
|
- return ok;
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
function launchAppDeepLink(deepLink) {
|
|
function launchAppDeepLink(deepLink) {
|
|
|
try {
|
|
try {
|
|
|
var a = document.createElement('a');
|
|
var a = document.createElement('a');
|
|
@@ -1601,20 +976,7 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function tryOpenHBuilderApp() {
|
|
function tryOpenHBuilderApp() {
|
|
|
- /* 微信内须直接点击 wx-open-launch-app,scheme 会被拦截 */
|
|
|
|
|
- if (isWeChatInAppBrowser()) return;
|
|
|
|
|
-
|
|
|
|
|
- tryFetchWxConfigOnPcClick().then(function () {
|
|
|
|
|
- if (isWxConfigOnClickDebug() && !isWxForceDebug() && !isWxPcAutoDebugHost()) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- tryOpenHBuilderAppViaScheme();
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- function tryOpenHBuilderAppViaScheme() {
|
|
|
|
|
var runOpen = function () {
|
|
var runOpen = function () {
|
|
|
- showFabToast('正在打开 U店在哪…');
|
|
|
|
|
var deepLink = buildAppDeepLink();
|
|
var deepLink = buildAppDeepLink();
|
|
|
|
|
|
|
|
if (typeof plus !== 'undefined' && plus.runtime) {
|
|
if (typeof plus !== 'undefined' && plus.runtime) {
|
|
@@ -1629,8 +991,12 @@
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.warn(e);
|
|
console.warn(e);
|
|
|
}
|
|
}
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 不在「未安装」时直接弹下载:部分 ROM 对 isApplicationExist 误判为 false,
|
|
|
|
|
+ * 仍应尝试 openURL,避免一点按钮就「请到应用商店下载」。
|
|
|
|
|
+ */
|
|
|
try {
|
|
try {
|
|
|
- plus.runtime.openURL(deepLink);
|
|
|
|
|
|
|
+ plus.runtime.openURL(deepLink);
|
|
|
} catch (e2) {
|
|
} catch (e2) {
|
|
|
console.warn(e2);
|
|
console.warn(e2);
|
|
|
if (installed === false) {
|
|
if (installed === false) {
|
|
@@ -1656,6 +1022,10 @@
|
|
|
document.addEventListener('visibilitychange', onVis);
|
|
document.addEventListener('visibilitychange', onVis);
|
|
|
window.addEventListener('pagehide', onHide);
|
|
window.addEventListener('pagehide', onHide);
|
|
|
|
|
|
|
|
|
|
+ if (isWeChatInAppBrowser()) {
|
|
|
|
|
+ window.alert('若点击后无法打开 App:请先点右上角「···」,选择「在浏览器中打开」,再点「APP内打开」。');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
launchAppDeepLink(deepLink);
|
|
launchAppDeepLink(deepLink);
|
|
|
} catch (e3) {
|
|
} catch (e3) {
|
|
@@ -1664,9 +1034,13 @@
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 不在超时后弹「去应用商店」:App 已打开时页面常仍 visible,易误报;
|
|
|
|
|
+ * 若未安装,用户无反应可自行去商店,避免打断操作。
|
|
|
|
|
+ */
|
|
|
window.setTimeout(function () {
|
|
window.setTimeout(function () {
|
|
|
finish();
|
|
finish();
|
|
|
- }, 2600);
|
|
|
|
|
|
|
+ }, 3200);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
var pf = prefetchShareVideoBeforeAppOpen();
|
|
var pf = prefetchShareVideoBeforeAppOpen();
|
|
@@ -2207,9 +1581,6 @@
|
|
|
function applyShareDynamicClosedMerchantUi(closed) {
|
|
function applyShareDynamicClosedMerchantUi(closed) {
|
|
|
var wasClosed = closedMerchantFlag;
|
|
var wasClosed = closedMerchantFlag;
|
|
|
closedMerchantFlag = closed;
|
|
closedMerchantFlag = closed;
|
|
|
- if (wasClosed !== closed && weChatJssdkConfigured) {
|
|
|
|
|
- refreshWxLaunchTagAttrs();
|
|
|
|
|
- }
|
|
|
|
|
if (closed) {
|
|
if (closed) {
|
|
|
setShareDynamicClosedSurfaceDom(true);
|
|
setShareDynamicClosedSurfaceDom(true);
|
|
|
if (!wasClosed) {
|
|
if (!wasClosed) {
|
|
@@ -3147,14 +2518,6 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function boot() {
|
|
function boot() {
|
|
|
- var launchTag = document.getElementById('launch-btn');
|
|
|
|
|
- if (launchTag) launchTag.setAttribute('appid', WECHAT_OPEN_APP_ID);
|
|
|
|
|
- bindWeChatLaunchTagEvents();
|
|
|
|
|
- if (shouldInitWeChatJssdkOnLoad()) {
|
|
|
|
|
- if (isWeChatInAppBrowser()) document.body.classList.add('is-wechat');
|
|
|
|
|
- scheduleWeChatJssdkBootstrap();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
fetchGetDeleteFlagByIdIfId().then(function (res) {
|
|
fetchGetDeleteFlagByIdIfId().then(function (res) {
|
|
|
if (isGetOneBusinessStatus99(res)) {
|
|
if (isGetOneBusinessStatus99(res)) {
|
|
|
applyShareDynamicClosedMerchantUi(true);
|
|
applyShareDynamicClosedMerchantUi(true);
|
|
@@ -3171,23 +2534,11 @@
|
|
|
applyQueryContent();
|
|
applyQueryContent();
|
|
|
loadComments();
|
|
loadComments();
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
- if (isWeChatInAppBrowser()) {
|
|
|
|
|
- var openBtnWx = document.getElementById('openApp');
|
|
|
|
|
- if (openBtnWx) {
|
|
|
|
|
- openBtnWx.addEventListener('click', function () {
|
|
|
|
|
- if (!weChatJssdkConfigured) {
|
|
|
|
|
- showFabToast(
|
|
|
|
|
- wxInitLastError || '微信 SDK 初始化中,请稍候再点底部按钮'
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- var openBtn = document.getElementById('openApp');
|
|
|
|
|
- if (openBtn) {
|
|
|
|
|
- openBtn.addEventListener('click', tryOpenHBuilderApp);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ var openBtn = document.getElementById('openApp');
|
|
|
|
|
+ if (openBtn) {
|
|
|
|
|
+ openBtn.addEventListener('click', function () {
|
|
|
|
|
+ tryOpenHBuilderApp();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|