|
|
@@ -727,40 +727,89 @@
|
|
|
return qsOut ? ('?' + qsOut) : '';
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 微信 extinfo 专用 query:禁止透传整段原始 query(易超 1024 或含封面/描述等大字段导致 launch:fail)。
|
|
|
+ * 与 secondShareGoods / shareDynamic 一致,仅保留 App 登录页解析所需字段。
|
|
|
+ */
|
|
|
+ function buildWxLaunchQueryParams() {
|
|
|
+ var params = mergeSearchAndHashParams();
|
|
|
+ var mini = new URLSearchParams();
|
|
|
+ mini.set('goodsUnavailable', '1');
|
|
|
+ var gs = params.get('goodsStatus');
|
|
|
+ if (gs != null && String(gs).trim() !== '') {
|
|
|
+ mini.set('goodsStatus', String(gs).trim());
|
|
|
+ }
|
|
|
+ var goodsId = params.get('goodsId') || params.get('id') || '';
|
|
|
+ if (goodsId) {
|
|
|
+ mini.set('goodsId', String(goodsId).trim());
|
|
|
+ mini.set('id', String(goodsId).trim());
|
|
|
+ }
|
|
|
+ var userId = params.get('userId');
|
|
|
+ if (userId != null && String(userId).trim() !== '') {
|
|
|
+ mini.set('userId', String(userId).trim());
|
|
|
+ }
|
|
|
+ var sid = params.get('storeId');
|
|
|
+ if (sid != null && String(sid).trim() !== '') {
|
|
|
+ mini.set('storeId', String(sid).trim());
|
|
|
+ }
|
|
|
+ var lon =
|
|
|
+ params.get('longitude') ||
|
|
|
+ params.get('lon') ||
|
|
|
+ params.get('lng') ||
|
|
|
+ params.get('jingdu') ||
|
|
|
+ '';
|
|
|
+ if (lon !== '' && !isNaN(Number(lon))) {
|
|
|
+ mini.set('longitude', String(lon));
|
|
|
+ }
|
|
|
+ var lat =
|
|
|
+ params.get('latitude') ||
|
|
|
+ params.get('lat') ||
|
|
|
+ params.get('weidu') ||
|
|
|
+ '';
|
|
|
+ if (lat !== '' && !isNaN(Number(lat))) {
|
|
|
+ mini.set('latitude', String(lat));
|
|
|
+ }
|
|
|
+ var city = params.get('userCity') || params.get('city');
|
|
|
+ if (city != null && String(city).trim() !== '') {
|
|
|
+ mini.set('userCity', String(city).trim());
|
|
|
+ }
|
|
|
+ return mini;
|
|
|
+ }
|
|
|
+
|
|
|
/** Uni 路由串(无 shopro://),供 wx-open-launch-app extinfo */
|
|
|
function buildAppUniPageLaunchUrl() {
|
|
|
var path = getAppUniPathForShareUndefined().replace(/^\//, '');
|
|
|
- var qs = buildAppOpenQueryStringMerged().replace(/^\?/, '');
|
|
|
+ var qs = buildWxLaunchQueryParams().toString();
|
|
|
return qs ? path + '?' + qs : path;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* wx-open-launch-app extinfo:pages/index/login?…(与 shareIndex 关店唤起一致)
|
|
|
*/
|
|
|
- function buildWeChatLaunchExtinfo() {
|
|
|
- var uniPage = buildAppUniPageLaunchUrl();
|
|
|
- if (uniPage.length <= 1024) return uniPage;
|
|
|
-
|
|
|
+ function buildWeChatLaunchExtinfo(useBarePathOnly) {
|
|
|
var path = getAppUniPathForShareUndefined().replace(/^\//, '');
|
|
|
- var rawQs = getRawMergedQueryForAppOpen();
|
|
|
- if (rawQs) {
|
|
|
- var packedRaw = path + '?' + rawQs;
|
|
|
- if (packedRaw.length <= 1024) return packedRaw;
|
|
|
- }
|
|
|
+ if (useBarePathOnly) return path;
|
|
|
|
|
|
- var params = mergeSearchAndHashParams();
|
|
|
- var mini = new URLSearchParams();
|
|
|
- var goodsId = params.get('goodsId') || params.get('id') || '';
|
|
|
+ var mini = buildWxLaunchQueryParams();
|
|
|
+ var goodsId = mini.get('goodsId') || mini.get('id') || '';
|
|
|
if (goodsId) {
|
|
|
mini.set('goodsId', goodsId);
|
|
|
mini.set('id', goodsId);
|
|
|
}
|
|
|
- var sid = params.get('storeId') || '';
|
|
|
- if (sid) mini.set('storeId', sid);
|
|
|
- var shortPage = path + '?' + mini.toString();
|
|
|
- if (shortPage.length <= 1024) return shortPage;
|
|
|
- var deep = buildAppDeepLink().replace(/^shopro:\/\//i, '');
|
|
|
- return deep.length <= 1024 ? deep : shortPage.slice(0, 1024);
|
|
|
+ var qs = mini.toString();
|
|
|
+ var uniPage = qs ? path + '?' + qs : path;
|
|
|
+ if (uniPage.length <= 1024) return uniPage;
|
|
|
+
|
|
|
+ var shortKeys = ['goodsUnavailable', 'goodsStatus', 'goodsId', 'id', 'userId'];
|
|
|
+ var shortMini = new URLSearchParams();
|
|
|
+ shortKeys.forEach(function (key) {
|
|
|
+ var val = mini.get(key);
|
|
|
+ if (val != null && String(val).trim() !== '') {
|
|
|
+ shortMini.set(key, String(val).trim());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ var shortPage = shortMini.toString() ? path + '?' + shortMini.toString() : path;
|
|
|
+ return shortPage.length <= 1024 ? shortPage : path;
|
|
|
}
|
|
|
|
|
|
/** 供 App 内嵌 WebView:uni 路由到登录页,query 与深链一致 */
|
|
|
@@ -1058,12 +1107,13 @@
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- function refreshWxLaunchTagAttrs() {
|
|
|
+ function refreshWxLaunchTagAttrs(useBarePathOnly) {
|
|
|
var tag = document.getElementById('launch-btn');
|
|
|
if (!tag) return;
|
|
|
try {
|
|
|
tag.setAttribute('appid', WECHAT_OPEN_APP_ID);
|
|
|
- tag.setAttribute('extinfo', buildWeChatLaunchExtinfo());
|
|
|
+ tag.setAttribute('extinfo', buildWeChatLaunchExtinfo(!!useBarePathOnly));
|
|
|
+ console.log('[wx-open-launch-app] extinfo=', tag.getAttribute('extinfo'));
|
|
|
} catch (eA) {}
|
|
|
}
|
|
|
|
|
|
@@ -1071,8 +1121,10 @@
|
|
|
var tag = document.getElementById('launch-btn');
|
|
|
if (!tag || tag._wxLaunchBound) return;
|
|
|
tag._wxLaunchBound = true;
|
|
|
- refreshWxLaunchTagAttrs();
|
|
|
+ tag._wxLaunchBareRetried = false;
|
|
|
+ refreshWxLaunchTagAttrs(false);
|
|
|
tag.addEventListener('launch', function () {
|
|
|
+ tag._wxLaunchBareRetried = false;
|
|
|
console.log('[wx-open-launch-app] launch ok');
|
|
|
showFabToast('正在打开 U店在哪…');
|
|
|
});
|
|
|
@@ -1084,10 +1136,31 @@
|
|
|
: detail && detail.errmsg
|
|
|
? String(detail.errmsg)
|
|
|
: '';
|
|
|
- console.warn('[wx-open-launch-app]', detail);
|
|
|
+ console.warn('[wx-open-launch-app]', detail, 'extinfo=', tag.getAttribute('extinfo'));
|
|
|
+
|
|
|
+ if (/launch:fail_check/i.test(errMsg)) {
|
|
|
+ showAppOpenFailTip(
|
|
|
+ '未能唤起 App:' +
|
|
|
+ errMsg +
|
|
|
+ '。请确认公众号已关联移动应用「U店在哪」,且 JS 安全域名与当前页一致。'
|
|
|
+ );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (
|
|
|
+ /launch:fail/i.test(errMsg) &&
|
|
|
+ !tag._wxLaunchBareRetried &&
|
|
|
+ tag.getAttribute('extinfo') !== buildWeChatLaunchExtinfo(true)
|
|
|
+ ) {
|
|
|
+ tag._wxLaunchBareRetried = true;
|
|
|
+ refreshWxLaunchTagAttrs(true);
|
|
|
+ showFabToast('请再点一次「APP内打开」');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
showAppOpenFailTip(
|
|
|
errMsg
|
|
|
- ? '未能唤起 App:' + errMsg
|
|
|
+ ? '未能唤起 App:' + errMsg + '。请确认已安装最新版「U店在哪」。'
|
|
|
: '未能唤起 App,请确认已安装 U店在哪,且开放平台已绑定服务号与移动应用。'
|
|
|
);
|
|
|
});
|