fix: 太阳码 scene 解析支持 &ch=渠道参数,identifier 用 split('&')[0] 分割

This commit is contained in:
2026-07-30 12:39:44 +08:00
parent ec6a5dd956
commit ed3e5f22ec

View File

@@ -119,9 +119,16 @@ export default {
const sceneRaw = decodeURIComponent(option.scene || option.wxscene || ''); const sceneRaw = decodeURIComponent(option.scene || option.wxscene || '');
if (sceneRaw.indexOf('app=') === 0) { if (sceneRaw.indexOf('app=') === 0) {
console.log('[DEBUG 太阳码] ✅ scene 匹配成功! 原始:', option.scene, '解码:', sceneRaw); console.log('[DEBUG 太阳码] ✅ scene 匹配成功! 原始:', option.scene, '解码:', sceneRaw);
// scene 格式: "app=pregnancy" 或 "app=pregnancy&ch=YFMM"
const source = sceneRaw; const source = sceneRaw;
const identifier = source.slice(4); const identifier = source.slice(4).split('&')[0];
console.log('[web_view] 太阳码 scene 解析: identifier=' + identifier); // 提取渠道码
let channel = '';
const chMatch = source.match(/&ch=([A-Z]+)/);
if (chMatch) channel = chMatch[1];
console.log('[web_view] 太阳码 scene 解析: identifier=' + identifier + (channel ? ' ch=' + channel : ''));
// 把 channel 存到 option 中传给 _resolveAppScene
option._channel = channel;
// 异步处理:uni.request 拿 H5 url,赋值给 option.url 走后续逻辑 // 异步处理:uni.request 拿 H5 url,赋值给 option.url 走后续逻辑
this._resolveAppScene(identifier, option); this._resolveAppScene(identifier, option);
return; return;
@@ -149,7 +156,6 @@ export default {
/** /**
* 太阳码 scene 解析:调 box_app /api/mp/apps 找 url,找到后注入到 option.url * 太阳码 scene 解析:调 box_app /api/mp/apps 找 url,找到后注入到 option.url
* 然后调用 _initWebView(option) 走标准 web_view 加载流程 * 然后调用 _initWebView(option) 走标准 web_view 加载流程
*/
_resolveAppScene(identifier, option) { _resolveAppScene(identifier, option) {
const appToken = store.state.app.token || ''; const appToken = store.state.app.token || '';
uni.request({ uni.request({
@@ -160,20 +166,21 @@ export default {
console.log('[web_view] 太阳码 scene 解析响应:', JSON.stringify(res.statusCode)); console.log('[web_view] 太阳码 scene 解析响应:', JSON.stringify(res.statusCode));
const items = res.data && res.data.result && res.data.result.items; const items = res.data && res.data.result && res.data.result.items;
if (res.statusCode === 200 && items && items.length > 0) { if (res.statusCode === 200 && items && items.length > 0) {
// box_app /api/mp/apps 当前不支持 identifier 过滤,遍历找
const app = items.find(it => it.identifier === identifier) || items[0]; const app = items.find(it => it.identifier === identifier) || items[0];
if (app && app.url) { if (app && app.url) {
const appUrl = app.url; const appUrl = app.url;
console.log('[web_view] 解析到 H5 url:', appUrl); let finalUrl = appUrl;
// 编码到 option.url,复用标准流程 if (option._channel) {
option.url = encodeURIComponent(appUrl); const separator = finalUrl.includes('?') ? '&' : '?';
finalUrl += separator + 'ch=' + option._channel;
}
console.log('[web_view] 解析到 H5 url:', appUrl, option._channel ? ' ch=' + option._channel : '');
option.url = encodeURIComponent(finalUrl);
} else { } else {
// 解析失败:降级到 CRMEB 首页
console.warn('[DEBUG 太阳码] 降级到 CRMEB 首页'); console.warn('[DEBUG 太阳码] 降级到 CRMEB 首页');
option.url = encodeURIComponent('https://shop.douba.top'); option.url = encodeURIComponent('https://shop.douba.top');
} }
} else { } else {
// 响应异常:降级到 CRMEB 首页
console.warn('[web_view] 太阳码 scene 解析响应异常,降级到 CRMEB 首页'); console.warn('[web_view] 太阳码 scene 解析响应异常,降级到 CRMEB 首页');
option.url = encodeURIComponent('https://shop.douba.top'); option.url = encodeURIComponent('https://shop.douba.top');
} }