From 90820ade3077a213241a949ad097aaf818c1965d Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 7 Jan 2026 14:02:03 +0800
Subject: [PATCH 1/9] =?UTF-8?q?fix(=E8=B7=AF=E7=94=B1):=20=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2?=
=?UTF-8?q?=EF=BC=8C=E9=AA=8C=E8=AF=81=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2?=
=?UTF-8?q?=EF=BC=8C=E8=80=8C=E6=B2=A1=E5=8A=9E=E6=B3=95=E5=90=8E=E9=80=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
common/js/util.js | 18 +++++++++---------
components/ns-login/ns-login.vue | 14 +++++++-------
pages_order/list.vue | 7 ++++---
3 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/common/js/util.js b/common/js/util.js
index d47f9e7..27d3725 100644
--- a/common/js/util.js
+++ b/common/js/util.js
@@ -112,14 +112,14 @@ export default {
/**
* 页面跳转
* @param {string} to 跳转链接 /pages/idnex/index
- * @param {Object} param 参数 {key : value, ...}
- * @param {string} mode 模式
+ * @param {Object} param 参数 {key : value, ...}, 默认{}
+ * @param {string} mode 模式 navigateTo、redirectTo、reLaunch、tabbar, 默认navigateTo
*/
- redirectTo(to, param, mode) {
+ redirectTo(to, param = {}, mode = 'navigateTo') {
let url = to;
// 替换url中的前缀
- console.log('redirectTo', to, param, mode);
+ console.log('页面跳转 redirectTo', to, param, mode);
url = adaptSubpackageUrl(url);
console.log('adaptSubpackageUrl', url);
@@ -146,26 +146,26 @@ export default {
// 如果url不包含tabBarList中的路径,根据mode判断跳转方式
switch (mode) {
case 'tabbar':
- // 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
+ // 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。重置页面栈,仅保留 tabBar 页面
uni.switchTab({
url
});
break;
case 'redirectTo':
- // 关闭当前页面,跳转到应用内的某个页面。
+ // 关闭当前页面,跳转到应用内的某个页面。替换栈顶页面,长度不变(上限10层)
uni.redirectTo({
url
});
break;
case 'reLaunch':
- // 关闭所有页面,打开到应用内的某个页面。
+ // 关闭所有页面,打开到应用内的某个页面。清空栈后打开新页面,长度=1
uni.reLaunch({
url
});
break;
default:
- // 保留当前页面,跳转到应用内的某个页面
- console.log('保留当前页面,跳转到应用内的某个页面', url);
+ // 保留当前页面,跳转到应用内的某个页面,新增页面到栈顶,长度+1(上限10层)
+ console.log('保留当前页面,navigateTo跳转到应用内的某个页面', url);
uni.navigateTo({
url
});
diff --git a/components/ns-login/ns-login.vue b/components/ns-login/ns-login.vue
index 8172f78..f246c57 100644
--- a/components/ns-login/ns-login.vue
+++ b/components/ns-login/ns-login.vue
@@ -254,7 +254,7 @@ export default {
},
// 打开弹窗
- open(url) {
+ open(url, mode) {
if (url) this.url = url;
// #ifdef MP
this.getCode(authData => {
@@ -270,24 +270,24 @@ export default {
else this.getCode();
} else if (this.$util.isWeiXin()) {
// 微信浏览器环境,显示登录页面
- this.toLogin();
+ this.toLogin(mode);
} else {
// 其他浏览器环境,显示登录页面
- this.toLogin();
+ this.toLogin(mode);
}
// #endif
// #ifndef MP || H5
- this.toLogin();
+ this.toLogin(mode);
// #endif
},
// 跳转去登录页
- toLogin() {
+ toLogin(mode) {
if (this.url) this.$util.redirectTo('/pages_tool/login/login', {
back: encodeURIComponent(this.url)
- });
- else this.$util.redirectTo('/pages_tool/login/login');
+ }, mode);
+ else this.$util.redirectTo('/pages_tool/login/login', {}, mode);
},
// 取消完善信息
diff --git a/pages_order/list.vue b/pages_order/list.vue
index d910357..6587fe6 100644
--- a/pages_order/list.vue
+++ b/pages_order/list.vue
@@ -156,11 +156,12 @@
-
-
+
+
+
@@ -207,7 +208,7 @@ export default {
if (this.$refs.mescroll) this.$refs.mescroll.refresh();
} else {
this.$nextTick(() => {
- this.$refs.login.open('/pages_order/list?status=' + this.orderStatus);
+ this.$refs?.login?.open('/pages_order/list?status=' + this.orderStatus, 'redirectTo');
})
}
},
From 6956841c8bafe7a493da68366a2d171ab145ae8a Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 7 Jan 2026 14:24:02 +0800
Subject: [PATCH 2/9] =?UTF-8?q?chore(=E4=BC=9A=E5=91=98=E4=B8=AD=E5=BF=83)?=
=?UTF-8?q?:=20=E8=B4=AD=E7=89=A9=E8=BD=A6=E3=80=81=E8=B6=B3=E8=BF=B9?=
=?UTF-8?q?=E3=80=81=E5=85=B3=E6=B3=A8=EF=BC=8C=E4=BC=98=E5=8C=96=E5=89=AF?=
=?UTF-8?q?=E6=A0=87=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pages_goods/cart.vue | 2 +-
pages_tool/member/collection.vue | 2 +-
pages_tool/member/footprint.vue | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/pages_goods/cart.vue b/pages_goods/cart.vue
index 58ab7c3..7c1ded5 100644
--- a/pages_goods/cart.vue
+++ b/pages_goods/cart.vue
@@ -203,7 +203,7 @@
:emptyBtn="{ text: $lang('toGoodsCategoryPage'), url: '/pages_goods/category' }">
+ }}
diff --git a/pages_tool/member/collection.vue b/pages_tool/member/collection.vue
index a28ff1c..a523c69 100644
--- a/pages_tool/member/collection.vue
+++ b/pages_tool/member/collection.vue
@@ -30,7 +30,7 @@
-
diff --git a/pages_tool/member/footprint.vue b/pages_tool/member/footprint.vue
index e6ae305..27e7361 100644
--- a/pages_tool/member/footprint.vue
+++ b/pages_tool/member/footprint.vue
@@ -46,7 +46,7 @@
From b10fcf02d45d25c4b89abe81d1e1f46d8381f275 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 7 Jan 2026 15:09:49 +0800
Subject: [PATCH 3/9] =?UTF-8?q?chore:=20=E4=BD=BF=E7=94=A8=E5=B8=B8?=
=?UTF-8?q?=E9=87=8F=E6=9D=A5=E5=A4=84=E7=90=86=E4=BC=9A=E5=91=98=E4=B8=AD?=
=?UTF-8?q?=E5=BF=83=E7=9A=84=E8=B7=AF=E7=94=B1=E9=A1=B5=E9=9D=A2=E8=B7=AF?=
=?UTF-8?q?=E5=BE=84=E5=88=A4=E6=96=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
common/js/lang.js | 14 ++++---
common/js/util.js | 20 ++++++++--
components-diy/diy-digit.vue | 2 +-
components-diy/diy-graphic-nav.vue | 2 +-
components-diy/diy-image-nav.vue | 2 +-
components-diy/diy-listmenu.vue | 4 +-
components-diy/diy-member-info.vue | 6 +--
components-diy/diy-picture.vue | 2 +-
components-diy/diy-quick-nav.vue | 2 +-
components-diy/diy-search.vue | 2 +-
components/ns-login/ns-login.vue | 53 ++++++++++++++------------
pages_promotion/fenxiao/apply.vue | 4 +-
pages_promotion/fenxiao/index.vue | 6 +--
pages_tool/login/login.vue | 8 ++--
pages_tool/member/apply_withdrawal.vue | 2 +-
pages_tool/member/balance.vue | 4 +-
pages_tool/member/cancelrefuse.vue | 2 +-
pages_tool/member/cancelstatus.vue | 4 +-
pages_tool/member/card.vue | 4 +-
pages_tool/member/card_buy.vue | 2 +-
pages_tool/member/index.vue | 4 +-
pages_tool/member/level.vue | 2 +-
pages_tool/member/pay_password.vue | 4 +-
pages_tool/member/point.vue | 4 +-
pages_tool/member/public/js/info.js | 4 +-
pages_tool/member/public/js/signin.js | 2 +-
pages_tool/pay/result.vue | 2 +-
27 files changed, 93 insertions(+), 74 deletions(-)
diff --git a/common/js/lang.js b/common/js/lang.js
index 5fec1bf..c8ca741 100644
--- a/common/js/lang.js
+++ b/common/js/lang.js
@@ -66,15 +66,16 @@ export default {
const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
- var value = '';
+ let value = ''; // 存放解析后的语言值
+ let langPath = ''; // 存放当前页面语言包路径
+
try {
//公共语言包(同步加载)
var lang = loadLangPackSync(locale, 'common');
//当前页面语言包(同步加载)
let route = _this.route;
- let langPath = processRoutePath(route);
- console.log(`当前语言: ${locale}, 当前页面语言包路径: ${langPath}`);
+ langPath = processRoutePath(route);
// 加载当前页面语言包
let currentPageLang = loadLangPackSync(locale, langPath);
@@ -102,7 +103,7 @@ export default {
}
} catch (e) {
- console.error('解析语言包失败:', e);
+ console.error('解析语言包失败:', e, { langPath, field, locale });
value = field;
}
@@ -115,7 +116,10 @@ export default {
if (value == undefined || (value == 'title' && field == 'title')) value = ''; // field
// 多语言调试,注释后可以关闭控制台输出
- console.log(`字段: ${field}, 值: ${value}`)
+ if (field == value) {
+ console.warn(`警告: 字段 ${field} 在语言包 ${langPath} 中未找到对应值,使用默认值 ${field} 当前语言: ${locale}`);
+ }
+
return value;
},
/**
diff --git a/common/js/util.js b/common/js/util.js
index 27d3725..7b21f81 100644
--- a/common/js/util.js
+++ b/common/js/util.js
@@ -7,15 +7,18 @@ import {
-// 首页路径
+// 关于页面路径,使用常量导出
export const INDEX_PAGE_URL = '/pages/index/index';
+export const CATEGORY_PAGE_URL = '/pages_goods/category';
+export const CONTACT_PAGE_URL = '/pages_tool/contact/contact';
+export const MEMBER_PAGE_URL = '/pages_tool/member/index';
// 当前最新的tabBar.list (参见pages.json 中的tabBar.list 配置)
export const systemTabBarList = [
INDEX_PAGE_URL,
- '/pages_goods/category',
- '/pages_tool/contact/contact',
- '/pages_tool/member/index'
+ CATEGORY_PAGE_URL,
+ CONTACT_PAGE_URL,
+ MEMBER_PAGE_URL
];
/**
@@ -109,6 +112,12 @@ export const checkTabBarActive = (linkUrl, currentPageRoute) => {
}
export default {
+ /** 导出页面URL常量 */
+ MEMBER_PAGE_URL,
+ CATEGORY_PAGE_URL,
+ CONTACT_PAGE_URL,
+ INDEX_PAGE_URL,
+
/**
* 页面跳转
* @param {string} to 跳转链接 /pages/idnex/index
@@ -592,6 +601,9 @@ export default {
}
return cloneObj
},
+
+
+
/**
* 自定义模板的跳转链接
* @param {Object} link
diff --git a/components-diy/diy-digit.vue b/components-diy/diy-digit.vue
index 83cdf74..de1f43d 100644
--- a/components-diy/diy-digit.vue
+++ b/components-diy/diy-digit.vue
@@ -90,7 +90,7 @@ export default {
// 页面跳转
redirectTo(item) {
- if (!item.wap_url || this.$util.getCurrRoute() != 'pages/member/index' || this.storeToken) {
+ if (!item.wap_url || this.$util.getCurrRoute() != this.$util.MEMBER_PAGE_URL || this.storeToken) {
console.log(item);
this.$util.diyRedirectTo(item);
} else {
diff --git a/components-diy/diy-graphic-nav.vue b/components-diy/diy-graphic-nav.vue
index d645bb3..644b1d1 100644
--- a/components-diy/diy-graphic-nav.vue
+++ b/components-diy/diy-graphic-nav.vue
@@ -159,7 +159,7 @@ export default {
redirectTo(link) {
if (link.wap_url) {
- if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
+ if (this.$util.getCurrRoute() == this.$util.MEMBER_PAGE_URL && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
diff --git a/components-diy/diy-image-nav.vue b/components-diy/diy-image-nav.vue
index 8615a21..17b4fb9 100644
--- a/components-diy/diy-image-nav.vue
+++ b/components-diy/diy-image-nav.vue
@@ -116,7 +116,7 @@ export default {
// 页面跳转
redirectTo(link) {
- if (!link.wap_url || this.$util.getCurrRoute() != 'pages/member/index' || this.storeToken) {
+ if (!link.wap_url || this.$util.getCurrRoute() != this.$util.MEMBER_PAGE_URL || this.storeToken) {
this.$util.diyRedirectTo(link);
} else {
this.$refs.login.open(link.wap_url);
diff --git a/components-diy/diy-listmenu.vue b/components-diy/diy-listmenu.vue
index f07440a..eb2d6a0 100644
--- a/components-diy/diy-listmenu.vue
+++ b/components-diy/diy-listmenu.vue
@@ -62,8 +62,8 @@ export default {
methods: {
redirectTo(link) {
if (link.wap_url) {
- if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
- this.$refs.login.open(link.wap_url);
+ if (this.$util.getCurrRoute() == this.$util.MEMBER_PAGE_URL && !this.storeToken) {
+ this.$refs?.login?.open(link.wap_url);
return;
}
}
diff --git a/components-diy/diy-member-info.vue b/components-diy/diy-member-info.vue
index 37afec7..fea7e80 100644
--- a/components-diy/diy-member-info.vue
+++ b/components-diy/diy-member-info.vue
@@ -64,7 +64,7 @@
@click.stop="modifyInfo()">{{ langIndex == 0 ? 'CN' : 'EN' }}
-
+
@@ -545,7 +545,7 @@ export default {
*/
redirectBeforeAuth(url) {
if (!this.storeToken) {
- this.$refs.login.open('/pages/member/index');
+ this.$refs.login.open(this.$util.MEMBER_PAGE_URL);
return;
}
@@ -583,7 +583,7 @@ export default {
url: '/wechat/api/wechat/authcode',
data: {
scopes: 'snsapi_userinfo',
- redirect_url: this.$config.h5Domain + '/pages/member/index'
+ redirect_url: this.$config.h5Domain + this.$util.MEMBER_PAGE_URL
},
success: res => {
if (res.code >= 0) {
diff --git a/components-diy/diy-picture.vue b/components-diy/diy-picture.vue
index 1f86e63..c17b371 100644
--- a/components-diy/diy-picture.vue
+++ b/components-diy/diy-picture.vue
@@ -65,7 +65,7 @@ export default {
},
redirectTo(link) {
if (link.wap_url) {
- if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
+ if (this.$util.getCurrRoute() == this.$util.MEMBER_PAGE_URL && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
diff --git a/components-diy/diy-quick-nav.vue b/components-diy/diy-quick-nav.vue
index 401efb7..d32b698 100644
--- a/components-diy/diy-quick-nav.vue
+++ b/components-diy/diy-quick-nav.vue
@@ -61,7 +61,7 @@ export default {
methods: {
redirectTo(link) {
if (link.wap_url) {
- if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
+ if (this.$util.getCurrRoute() == this.$util.MEMBER_PAGE_URL && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
diff --git a/components-diy/diy-search.vue b/components-diy/diy-search.vue
index a74830b..1505d85 100644
--- a/components-diy/diy-search.vue
+++ b/components-diy/diy-search.vue
@@ -198,7 +198,7 @@ export default {
},
redirectTo(link) {
if (link.wap_url) {
- if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
+ if (this.$util.getCurrRoute() == this.$util.MEMBER_PAGE_URL && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
diff --git a/components/ns-login/ns-login.vue b/components/ns-login/ns-login.vue
index f246c57..0716ab8 100644
--- a/components/ns-login/ns-login.vue
+++ b/components/ns-login/ns-login.vue
@@ -42,26 +42,22 @@
-
+ @click="isAgree = !isAgree">
我同意
- 《隐私条款》
- 《用户服务协议》
+ 《隐私条款》
+ 《用户服务协议》
-
@@ -71,7 +67,8 @@
-
+
暂不登录
@@ -118,8 +115,8 @@
获取手机号
- 保存
-
+ 保存
+
@@ -226,7 +223,7 @@ export default {
if (siteInfo) {
this.site_name = siteInfo.site_name;
}
- },
+ },
methods: {
// 同意协议
authno() {
@@ -254,7 +251,7 @@ export default {
},
// 打开弹窗
- open(url, mode) {
+ open(url = '', mode = 'navigateTo') {
if (url) this.url = url;
// #ifdef MP
this.getCode(authData => {
@@ -266,8 +263,13 @@ export default {
if (this.$util.isWeChatMiniProgram()) {
// 微信小程序环境,使用微信授权登录
let authData = uni.getStorageSync('authInfo');
- if (authData) this.authLogin(authData);
- else this.getCode();
+ if (authData) {
+ this.authLogin(authData);
+ } else {
+ this.getCode(authData => {
+ this.authLogin(authData, 'authOnlyLogin');
+ });
+ }
} else if (this.$util.isWeiXin()) {
// 微信浏览器环境,显示登录页面
this.toLogin(mode);
@@ -283,7 +285,7 @@ export default {
},
// 跳转去登录页
- toLogin(mode) {
+ toLogin(mode = 'navigateTo') {
if (this.url) this.$util.redirectTo('/pages_tool/login/login', {
back: encodeURIComponent(this.url)
}, mode);
@@ -535,7 +537,8 @@ export default {
getPhoneNumber(e) {
if (e.detail.errMsg === 'getPhoneNumber:ok') {
const authInfo = uni.getStorageSync('authInfo');
- if (authInfo) { Object.assign(this.authMobileData, authInfo, e.detail);
+ if (authInfo) {
+ Object.assign(this.authMobileData, authInfo, e.detail);
}
if (uni.getStorageSync('source_member')) {
this.authMobileData.source_member = uni.getStorageSync('source_member');
@@ -596,7 +599,7 @@ export default {
}
});
},
-
+
// 授权登录
authLogin(data, type = 'authLogin') {
uni.showLoading({
@@ -686,8 +689,8 @@ export default {
if (this.forceBindingMobileControl) {
this.bindMobile();
- } else {
- this.authLogin(authInfo);
+ } else {
+ this.authLogin(authInfo);
}
},
@@ -749,7 +752,7 @@ export default {
// 跳转页面
tourl(url) {
this.$util.redirectTo(url);
- }
+ }
}
};
diff --git a/pages_promotion/fenxiao/apply.vue b/pages_promotion/fenxiao/apply.vue
index ef3e730..33b8ebd 100644
--- a/pages_promotion/fenxiao/apply.vue
+++ b/pages_promotion/fenxiao/apply.vue
@@ -261,7 +261,7 @@
this.status = res.data.status;
this.isSub = false;
if (this.status == 2) {
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
}
}
this.$refs.loadingCover.hide();
@@ -410,7 +410,7 @@
if (options.from === 'navigateBack') {
return false;
}
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
return true;
}
};
diff --git a/pages_promotion/fenxiao/index.vue b/pages_promotion/fenxiao/index.vue
index 178e244..628158e 100644
--- a/pages_promotion/fenxiao/index.vue
+++ b/pages_promotion/fenxiao/index.vue
@@ -348,7 +348,7 @@ export default {
duration: 2000
});
setTimeout(() => {
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
}, 2000);
}
}
@@ -367,7 +367,7 @@ export default {
title: '当前分销商已冻结'
});
setTimeout(() => {
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
}, 2000);
return;
}
@@ -457,7 +457,7 @@ export default {
if (options.from === 'navigateBack') {
return false;
}
- this.$util.redirectTo('/pages/member/index', {}, 'reLaunch');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL, {}, 'reLaunch');
return true;
},
watch: {
diff --git a/pages_tool/login/login.vue b/pages_tool/login/login.vue
index 72e0bbe..a064dbe 100644
--- a/pages_tool/login/login.vue
+++ b/pages_tool/login/login.vue
@@ -234,13 +234,13 @@ export default {
this.$util.showToast({
title: this.$lang('loginSuccessTip')
});
- let back = this.back ? this.back : '/pages/member/index';
+ let back = this.back ? this.back : this.$util.MEMBER_PAGE_URL;
if (this.$refs.registerReward) this.$refs.registerReward.open(back);
} else {
if (this.back != '') {
this.$util.redirectTo(decodeURIComponent(this.back), {}, 'reLaunch');
} else {
- this.$util.redirectTo('/pages/member/index', {}, 'reLaunch');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL, {}, 'reLaunch');
}
}
});
@@ -348,13 +348,13 @@ export default {
this.$store.dispatch('getCartNumber');
this.getMemberInfo(() => {
if (can_receive_registergift == 1) {
- let back = this.back ? this.back : '/pages/member/index';
+ let back = this.back ? this.back : this.$util.MEMBER_PAGE_URL;
if (this.$refs.registerReward) this.$refs.registerReward.open(back);
} else {
if (this.back != '') {
this.$util.redirectTo(decodeURIComponent(this.back), {}, this.redirect);
} else {
- this.$util.redirectTo('/pages/member/index', {}, this.redirect);
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL, {}, this.redirect);
}
}
})
diff --git a/pages_tool/member/apply_withdrawal.vue b/pages_tool/member/apply_withdrawal.vue
index d258e4f..be31103 100644
--- a/pages_tool/member/apply_withdrawal.vue
+++ b/pages_tool/member/apply_withdrawal.vue
@@ -109,7 +109,7 @@
title: '未开启提现'
});
setTimeout(() => {
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
}, 1500);
}
}
diff --git a/pages_tool/member/balance.vue b/pages_tool/member/balance.vue
index 356e063..fa528b7 100644
--- a/pages_tool/member/balance.vue
+++ b/pages_tool/member/balance.vue
@@ -6,7 +6,7 @@
'height': menuButtonBounding.height + 'px'
}">
-
+
账户余额
@@ -171,7 +171,7 @@ export default {
if (options.from === 'navigateBack') {
return false;
}
- this.$util.redirectTo('/pages/member/index', {}, 'reLaunch');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL, {}, 'reLaunch');
return true;
},
watch: {
diff --git a/pages_tool/member/cancelrefuse.vue b/pages_tool/member/cancelrefuse.vue
index eabb02a..51cc945 100644
--- a/pages_tool/member/cancelrefuse.vue
+++ b/pages_tool/member/cancelrefuse.vue
@@ -43,7 +43,7 @@ export default {
});
},
toIndex() {
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
},
apply() {
this.$util.redirectTo('/pages_tool/member/cancellation');
diff --git a/pages_tool/member/cancelstatus.vue b/pages_tool/member/cancelstatus.vue
index a33ecf0..c0675b8 100644
--- a/pages_tool/member/cancelstatus.vue
+++ b/pages_tool/member/cancelstatus.vue
@@ -77,7 +77,7 @@
});
},
back() {
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
},
revoke() {
uni.showModal({
@@ -90,7 +90,7 @@
url: '/membercancel/api/membercancel/cancelApply',
success: res => {
if (res.code >= 0) {
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
}
}
});
diff --git a/pages_tool/member/card.vue b/pages_tool/member/card.vue
index 0096af2..6f8a1de 100644
--- a/pages_tool/member/card.vue
+++ b/pages_tool/member/card.vue
@@ -183,7 +183,7 @@ export default {
if (options.from === 'navigateBack') {
return false;
}
- this.$util.redirectTo('/pages/member/index');
+ this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
return true;
}
};
@@ -220,7 +220,7 @@ export default {
}
-
\ No newline at end of file
diff --git a/components-diy/diy-wechat-channel.vue b/components-diy/diy-wechat-channel.vue
new file mode 100644
index 0000000..748c456
--- /dev/null
+++ b/components-diy/diy-wechat-channel.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+ {{ value.videoTitle }}
+
+ {{ value.viewCount }}次观看
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/WECHAT_CHANNEL_INTEGRATION.md b/docs/WECHAT_CHANNEL_INTEGRATION.md
new file mode 100644
index 0000000..ffb5ac7
--- /dev/null
+++ b/docs/WECHAT_CHANNEL_INTEGRATION.md
@@ -0,0 +1,381 @@
+# 微信视频号集成指南
+
+## 1. 概述
+
+本文档提供了在UniApp项目中集成微信视频号的详细指导,包括组件实现、配置修改和使用方法。
+
+## 2. 准备工作
+
+### 2.1 微信小程序配置
+
+在 `manifest.json` 文件中,需要确保微信小程序配置正确:
+
+```json
+"mp-weixin": {
+ "appid": "你的小程序appid",
+ "setting": {
+ "urlCheck": false,
+ "postcss": false,
+ "es6": true,
+ "minified": true
+ },
+ "usingComponents": true,
+ "permission": {
+ "scope.userLocation": {
+ "desc": "为了更好地为您提供服务"
+ }
+ },
+ "requiredPrivateInfos": ["chooseLocation", "getLocation", "chooseAddress"],
+ "__usePrivacyCheck__": true,
+ "optimization": {
+ "subPackages": true
+ }
+}
+```
+
+### 2.2 微信视频号API权限
+
+#### 2.2.1 开通视频号相关权限
+
+1. **登录微信小程序后台**
+ - 访问 [微信公众平台](https://mp.weixin.qq.com/)
+ - 使用小程序管理员账号登录
+
+2. **进入开发管理**
+ - 左侧菜单:开发 → 开发管理
+ - 进入「接口设置」页面
+
+3. **开通视频号权限**
+ - 找到「视频号」相关接口,具体名称为「打开视频号内容」
+ - 点击「开通」按钮
+ - 阅读并同意相关协议
+ - 等待审核通过(通常为即时审核,无需人工审核)
+
+4. **权限开通失败处理**
+ - 确保小程序已发布上线
+ - 确保小程序未被处罚或限制
+ - 如仍无法开通,请联系微信公众平台客服
+
+#### 2.2.2 小程序后台配置相关权限
+
+1. **配置manifest.json**
+ 在UniApp项目的 `manifest.json` 文件中,需要确保以下配置正确:
+
+ ```json
+ "mp-weixin": {
+ "appid": "你的小程序appid",
+ "setting": {
+ "urlCheck": false,
+ "postcss": false,
+ "es6": true,
+ "minified": true
+ },
+ "usingComponents": true,
+ "requiredPrivateInfos": [],
+ "__usePrivacyCheck__": true,
+ "optimization": {
+ "subPackages": true
+ }
+ }
+ ```
+
+2. **小程序后台权限设置**
+ - 登录微信小程序后台
+ - 左侧菜单:设置 → 基本设置
+ - 向下滚动找到「服务内容声明」部分
+ - 确保已勾选「视频」相关服务内容
+ - 如有必要,上传相关资质证明
+
+#### 2.2.3 小程序与视频号关联
+
+1. **小程序管理员操作**
+ - 登录微信小程序后台
+ - 左侧菜单:设置 → 基本设置
+ - 向下滚动找到「关联设置」部分
+ - 点击「关联视频号」按钮
+ - 输入视频号名称或视频号ID
+ - 点击「搜索」找到对应的视频号
+ - 点击「发送关联邀请」
+
+2. **视频号管理员操作**
+ - 视频号管理员需要在24小时内确认关联邀请
+ - 视频号管理员登录 [视频号助手](https://channels.weixin.qq.com/)
+ - 进入「设置」→「关联设置」→「小程序关联」
+ - 找到待确认的关联邀请
+ - 点击「同意」完成关联
+
+3. **关联失败处理**
+ - 检查视频号是否已完成实名认证
+ - 检查小程序是否已发布上线
+ - 检查视频号名称或ID是否输入正确
+ - 如超过24小时未确认,需要重新发送关联邀请
+
+#### 2.2.4 关联条件
+
+- **小程序要求**:必须已经发布上线,未被处罚或限制
+- **视频号要求**:必须已经完成实名认证,状态正常
+- **数量限制**:同一个小程序最多可以关联50个视频号,同一个视频号最多可以关联50个小程序
+- **权限要求**:关联操作需要小程序管理员和视频号管理员共同确认
+- **主体要求**:小程序和视频号的主体可以不同,但需要双方管理员确认
+
+#### 2.2.5 权限验证
+
+完成关联后,可以通过以下方式验证权限是否开通:
+
+1. **在微信开发者工具中验证**
+ - 在微信开发者工具中打开小程序
+ - 在控制台执行以下代码:
+ ```javascript
+ console.log('是否支持视频号API:', typeof wx !== 'undefined' && typeof wx.openChannelsActivity === 'function');
+ ```
+ - 如果返回 `true`,则表示权限开通成功
+
+2. **在真机环境中验证**
+ - 使用微信扫码打开小程序
+ - 触发视频号相关功能
+ - 检查是否能正常打开视频号内容
+
+3. **权限验证失败处理**
+ - 确认小程序是否已与视频号关联
+ - 确认视频号API权限是否已开通
+ - 检查微信小程序基础库版本是否支持视频号API(建议使用最新版本)
+ - 尝试重新关联视频号
+
+## 3. 组件使用
+
+### 3.1 单个视频号组件 (diy-wechat-channel.vue)
+
+#### 基本用法
+
+```vue
+
+```
+
+#### 属性说明
+
+| 属性名 | 类型 | 默认值 | 说明 |
+|--------|------|--------|------|
+| channelName | String | "" | 视频号名称 |
+| avatarUrl | String | "" | 视频号头像URL |
+| videoTitle | String | "" | 视频标题 |
+| coverUrl | String | "" | 视频封面URL |
+| feedId | String | "" | 视频号内容ID,用于播放视频 |
+| viewCount | Number | 0 | 视频观看次数 |
+| showFollow | Boolean | false | 是否显示关注按钮 |
+| componentAngle | String | "" | 组件圆角类型,可选值:round |
+| topAroundRadius | Number | 0 | 顶部圆角半径 |
+| bottomAroundRadius | Number | 0 | 底部圆角半径 |
+
+#### 事件说明
+
+| 事件名 | 说明 | 参数 |
+|--------|------|------|
+| channel-tap | 点击视频号头像或名称时触发 | 视频号数据对象 |
+| video-play | 点击视频播放时触发 | 视频号数据对象 |
+
+### 3.2 视频号列表组件 (diy-wechat-channel-list.vue)
+
+#### 基本用法
+
+```vue
+
+```
+
+#### 属性说明
+
+| 属性名 | 类型 | 默认值 | 说明 |
+|--------|------|--------|------|
+| list | Array | [] | 视频号列表数据 |
+| rowCount | Number | 2 | 每行显示的视频号数量 |
+| showStyle | String | "fixed" | 显示样式,可选值:fixed, singleSlide |
+| mode | String | "" | 显示模式 |
+| font | Object | {} | 字体样式配置 |
+| componentBgColor | String | "#fff" | 组件背景颜色 |
+| componentAngle | String | "" | 组件圆角类型,可选值:round |
+| topAroundRadius | Number | 0 | 顶部圆角半径 |
+| bottomAroundRadius | Number | 0 | 底部圆角半径 |
+| ornament | Object | {} | 装饰样式配置 |
+
+#### list数组项说明
+
+| 属性名 | 类型 | 默认值 | 说明 |
+|--------|------|--------|------|
+| channelName | String | "" | 视频号名称 |
+| coverUrl | String | "" | 视频封面URL |
+| videoTitle | String | "" | 视频标题 |
+| feedId | String | "" | 视频号内容ID,用于播放视频 |
+| viewCount | Number | 0 | 视频观看次数 |
+
+## 4. 视频播放实现
+
+组件内部使用微信小程序的 `wx.openChannelsActivity` API 来打开视频号内容:
+
+```javascript
+if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
+ wx.openChannelsActivity({
+ feedId: item.feedId, // 视频号内容ID,必填
+ success: (res) => {
+ console.log('打开视频号成功', res);
+ },
+ fail: (err) => {
+ console.error('打开视频号失败', err);
+ // 常见错误处理
+ if (err.errCode === 40001) {
+ console.error('未授权,请检查小程序是否与视频号关联');
+ } else if (err.errCode === 40002) {
+ console.error('参数错误,请检查feedId是否正确');
+ } else if (err.errCode === 40003) {
+ console.error('视频号内容不存在或已被删除');
+ }
+ }
+ });
+} else {
+ console.error('当前环境不支持微信视频号');
+}
+```
+
+### 4.1 API参数说明
+
+- **feedId**:视频号内容ID,必填,必须是有效的视频号内容ID
+- **success**:调用成功的回调函数
+- **fail**:调用失败的回调函数
+- **complete**:调用完成的回调函数(无论成功或失败)
+
+### 4.2 错误码说明
+
+| 错误码 | 说明 | 解决方案 |
+|--------|------|----------|
+| 40001 | 未授权 | 检查小程序是否与视频号关联,确认视频号API权限是否已开通 |
+| 40002 | 参数错误 | 检查feedId是否正确,确保是有效的视频号内容ID |
+| 40003 | 视频号内容不存在或已被删除 | 确认feedId对应的视频号内容是否仍然存在 |
+| 40004 | 系统错误 | 稍后重试,或联系微信公众平台客服 |
+
+## 5. 注意事项
+
+### 5.1 环境限制
+
+- 微信视频号API只能在微信小程序环境中使用,其他环境(如H5、App)不支持
+- 需要在微信小程序后台配置相关权限
+- 小程序需要与视频号进行关联
+- 微信小程序基础库版本建议使用2.10.0及以上
+
+### 5.2 数据格式
+
+确保传递给组件的数据格式正确,特别是 `feedId` 必须是有效的视频号内容ID
+
+### 5.3 图片资源
+
+- 视频号头像和封面图片建议使用CDN地址,确保加载速度
+- 图片尺寸建议:
+ - 头像:200x200px
+ - 封面:640x360px
+
+### 5.4 权限和关联
+
+- 确保在微信小程序后台开通了「打开视频号内容」权限
+- 确保小程序已与视频号成功关联
+- 关联操作需要小程序管理员和视频号管理员共同确认
+
+## 6. 常见问题
+
+### 6.1 视频无法播放
+
+- 检查 `feedId` 是否正确,确保是有效的视频号内容ID
+- 确认小程序是否与视频号关联
+- 确认小程序是否开通了视频号相关权限
+- 检查微信小程序基础库版本是否支持视频号API
+- 检查视频号内容是否仍然存在(未被删除)
+
+### 6.2 权限开通失败
+
+- 确保小程序已发布上线
+- 确保小程序未被处罚或限制
+- 确认小程序管理员账号权限是否正确
+- 如仍无法开通,请联系微信公众平台客服
+
+### 6.3 关联失败
+
+- 检查视频号是否已完成实名认证
+- 检查小程序是否已发布上线
+- 检查视频号名称或ID是否输入正确
+- 确认视频号管理员是否在24小时内确认关联邀请
+- 如超过24小时未确认,需要重新发送关联邀请
+
+### 6.4 组件显示异常
+
+- 检查传递给组件的数据格式是否正确
+- 确认图片资源是否可访问
+- 检查微信小程序基础库版本是否支持视频号API
+
+### 6.5 样式问题
+
+- 可通过组件的 `componentAngle`、`topAroundRadius`、`bottomAroundRadius` 等属性调整组件样式
+- 可通过 `componentBgColor` 属性调整组件背景颜色
+- 可通过 `font` 属性调整字体样式
+
+### 6.6 环境兼容性问题
+
+- 微信视频号API只能在微信小程序环境中使用
+- 在其他环境中,组件会显示但无法播放视频
+- 建议在非小程序环境中添加友好的提示信息
+
+## 7. 示例代码
+
+### 7.1 单个视频号示例
+
+```javascript
+// 单个视频号数据
+const channelData = {
+ channelName: "示例视频号",
+ avatarUrl: "https://example.com/avatar.jpg",
+ videoTitle: "这是一个示例视频",
+ coverUrl: "https://example.com/cover.jpg",
+ feedId: "v02004g10000c3f7l7j5u87l33n8f160",
+ viewCount: 12345,
+ showFollow: true,
+ componentAngle: "round",
+ topAroundRadius: 10,
+ bottomAroundRadius: 10
+};
+```
+
+### 7.2 视频号列表示例
+
+```javascript
+// 视频号列表数据
+const channelListData = {
+ list: [
+ {
+ channelName: "示例视频号1",
+ coverUrl: "https://example.com/cover1.jpg",
+ videoTitle: "这是示例视频1",
+ feedId: "v02004g10000c3f7l7j5u87l33n8f160",
+ viewCount: 12345
+ },
+ {
+ channelName: "示例视频号2",
+ coverUrl: "https://example.com/cover2.jpg",
+ videoTitle: "这是示例视频2",
+ feedId: "v02004g10000c3f7m7j5u87l33n8f161",
+ viewCount: 67890
+ }
+ ],
+ rowCount: 2,
+ showStyle: "fixed",
+ font: {
+ size: 14,
+ weight: "normal",
+ color: "#333"
+ },
+ componentBgColor: "#fff",
+ componentAngle: "round",
+ topAroundRadius: 10,
+ bottomAroundRadius: 10
+};
+```
+
+## 8. 总结
+
+通过本文档提供的组件和配置指导,你可以在UniApp项目中轻松集成微信视频号功能,为用户提供更加丰富的内容体验。
+
+如果在集成过程中遇到问题,请参考本文档的常见问题部分,或查阅微信官方文档获取更多帮助。
\ No newline at end of file
diff --git a/docs/example/wechat-channel-demo.vue b/docs/example/wechat-channel-demo.vue
new file mode 100644
index 0000000..045beba
--- /dev/null
+++ b/docs/example/wechat-channel-demo.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+ 单个视频号
+
+
+
+
+ 视频号列表
+
+
+
+
+ 使用说明
+
+ 1. 确保微信小程序已开通视频号权限
+ 2. 小程序需与视频号关联
+ 3. 传递正确的feedId用于播放视频
+ 4. 仅支持微信小程序环境
+
+
+
+
+
+
+
+
\ No newline at end of file
From c7e9b497ae9da065a36064037765bfe0eb0b6ce5 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 7 Jan 2026 17:12:38 +0800
Subject: [PATCH 7/9] =?UTF-8?q?chore(=E5=BE=AE=E4=BF=A1=E8=A7=86=E9=A2=91?=
=?UTF-8?q?=E5=8F=B7):=20=E4=BC=98=E5=8C=96=E5=BE=AE=E4=BF=A1=E8=A7=86?=
=?UTF-8?q?=E9=A2=91=E5=8F=B7=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8F=8A=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components-diy/diy-wechat-channel-list.vue | 44 +++++-
components-diy/diy-wechat-channel.vue | 48 ++++++-
docs/WECHAT_CHANNEL_INTEGRATION.md | 159 +++++++++++----------
3 files changed, 176 insertions(+), 75 deletions(-)
diff --git a/components-diy/diy-wechat-channel-list.vue b/components-diy/diy-wechat-channel-list.vue
index 0b027ed..52b974d 100644
--- a/components-diy/diy-wechat-channel-list.vue
+++ b/components-diy/diy-wechat-channel-list.vue
@@ -131,15 +131,51 @@ export default {
await this.__$emitEvent({
eventName: 'video-play', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return;
+ // 检查微信环境
+ if (typeof wx === 'undefined') {
+ console.error('当前环境不是微信小程序');
+ return;
+ }
+ // 检查基础库版本
+ const systemInfo = wx.getSystemInfoSync();
+ const SDKVersion = systemInfo.SDKVersion;
+ const versionCompare = (v1, v2) => {
+ const arr1 = v1.split('.');
+ const arr2 = v2.split('.');
+ for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {
+ const num1 = parseInt(arr1[i] || 0);
+ const num2 = parseInt(arr2[i] || 0);
+ if (num1 > num2) return 1;
+ if (num1 < num2) return -1;
+ }
+ return 0;
+ };
+ if (versionCompare(SDKVersion, '2.19.2') < 0) {
+ console.error('当前微信基础库版本过低,需要 2.19.2 或以上版本');
+ return;
+ }
// 调用微信视频号播放API
- if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
+ if (wx.openChannelsActivity) {
wx.openChannelsActivity({
feedId: item.feedId,
+ finderUserName: item.finderUserName,
success: (res) => {
console.log('打开视频号成功', res);
},
fail: (err) => {
console.error('打开视频号失败', err);
+ // 错误码处理
+ switch (err.errCode) {
+ case 40001:
+ console.error('错误:40001,检查主体要求或嵌入式打开的关联关系');
+ break;
+ case 40002:
+ console.error('错误:40002,参数错误,检查 feedId 和 finderUserName');
+ break;
+ default:
+ console.error('错误:' + err.errCode + ',' + (err.errMsg || '未知错误'));
+ break;
+ }
}
});
} else {
@@ -153,6 +189,12 @@ export default {
imgError(index) {
// 图片加载失败的处理逻辑
console.log('图片加载失败:', index);
+ // 为失败的图片设置默认图片
+ const item = this.value.list[index];
+ if (item) {
+ // 使用默认图片替代加载失败的图片
+ item.coverUrl = 'addon/personnel/shop/view/enterprise/default-video-cover.png';
+ }
}
}
}
diff --git a/components-diy/diy-wechat-channel.vue b/components-diy/diy-wechat-channel.vue
index 748c456..e6f96a5 100644
--- a/components-diy/diy-wechat-channel.vue
+++ b/components-diy/diy-wechat-channel.vue
@@ -8,7 +8,15 @@
-
+
+
+
+
+
@@ -66,15 +74,51 @@ export default {
await this.__$emitEvent({
eventName: 'video-play', data: this.value, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return;
+ // 检查微信环境
+ if (typeof wx === 'undefined') {
+ console.error('当前环境不是微信小程序');
+ return;
+ }
+ // 检查基础库版本
+ const systemInfo = wx.getSystemInfoSync();
+ const SDKVersion = systemInfo.SDKVersion;
+ const versionCompare = (v1, v2) => {
+ const arr1 = v1.split('.');
+ const arr2 = v2.split('.');
+ for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {
+ const num1 = parseInt(arr1[i] || 0);
+ const num2 = parseInt(arr2[i] || 0);
+ if (num1 > num2) return 1;
+ if (num1 < num2) return -1;
+ }
+ return 0;
+ };
+ if (versionCompare(SDKVersion, '2.19.2') < 0) {
+ console.error('当前微信基础库版本过低,需要 2.19.2 或以上版本');
+ return;
+ }
// 调用微信视频号播放API
- if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
+ if (wx.openChannelsActivity) {
wx.openChannelsActivity({
feedId: this.value.feedId,
+ finderUserName: this.value.finderUserName,
success: (res) => {
console.log('打开视频号成功', res);
},
fail: (err) => {
console.error('打开视频号失败', err);
+ // 错误码处理
+ switch (err.errCode) {
+ case 40001:
+ console.error('错误:40001,检查主体要求或嵌入式打开的关联关系');
+ break;
+ case 40002:
+ console.error('错误:40002,参数错误,检查 feedId 和 finderUserName');
+ break;
+ default:
+ console.error('错误:' + err.errCode + ',' + (err.errMsg || '未知错误'));
+ break;
+ }
}
});
} else {
diff --git a/docs/WECHAT_CHANNEL_INTEGRATION.md b/docs/WECHAT_CHANNEL_INTEGRATION.md
index ffb5ac7..28f65ab 100644
--- a/docs/WECHAT_CHANNEL_INTEGRATION.md
+++ b/docs/WECHAT_CHANNEL_INTEGRATION.md
@@ -33,60 +33,20 @@
}
```
-### 2.2 微信视频号API权限
+### 2.2 微信视频号API权限与关联
-#### 2.2.1 开通视频号相关权限
+#### 2.2.1 权限说明
-1. **登录微信小程序后台**
- - 访问 [微信公众平台](https://mp.weixin.qq.com/)
- - 使用小程序管理员账号登录
+`wx.openChannelsActivity` API 是小程序的基础能力,不需要单独开通权限,但需要满足以下条件:
-2. **进入开发管理**
- - 左侧菜单:开发 → 开发管理
- - 进入「接口设置」页面
+- **跳转打开视频号视频**:无主体限制,基础库版本 2.19.2 及以上
+- **内嵌视频号视频**:
+ - 从基础库版本 2.25.1 至 2.31.1,小程序需与视频号视频相同主体或关联主体
+ - 从基础库版本 2.31.1 开始,非个人主体小程序可内嵌非同主体/关联主体视频号视频
-3. **开通视频号权限**
- - 找到「视频号」相关接口,具体名称为「打开视频号内容」
- - 点击「开通」按钮
- - 阅读并同意相关协议
- - 等待审核通过(通常为即时审核,无需人工审核)
+#### 2.2.2 小程序与视频号关联(可选)
-4. **权限开通失败处理**
- - 确保小程序已发布上线
- - 确保小程序未被处罚或限制
- - 如仍无法开通,请联系微信公众平台客服
-
-#### 2.2.2 小程序后台配置相关权限
-
-1. **配置manifest.json**
- 在UniApp项目的 `manifest.json` 文件中,需要确保以下配置正确:
-
- ```json
- "mp-weixin": {
- "appid": "你的小程序appid",
- "setting": {
- "urlCheck": false,
- "postcss": false,
- "es6": true,
- "minified": true
- },
- "usingComponents": true,
- "requiredPrivateInfos": [],
- "__usePrivacyCheck__": true,
- "optimization": {
- "subPackages": true
- }
- }
- ```
-
-2. **小程序后台权限设置**
- - 登录微信小程序后台
- - 左侧菜单:设置 → 基本设置
- - 向下滚动找到「服务内容声明」部分
- - 确保已勾选「视频」相关服务内容
- - 如有必要,上传相关资质证明
-
-#### 2.2.3 小程序与视频号关联
+虽然跳转打开视频号视频无主体限制,但如果需要内嵌非同主体视频号视频(基础库 2.31.1 以下),则需要关联小程序与视频号:
1. **小程序管理员操作**
- 登录微信小程序后台
@@ -110,7 +70,7 @@
- 检查视频号名称或ID是否输入正确
- 如超过24小时未确认,需要重新发送关联邀请
-#### 2.2.4 关联条件
+#### 2.2.3 关联条件
- **小程序要求**:必须已经发布上线,未被处罚或限制
- **视频号要求**:必须已经完成实名认证,状态正常
@@ -118,9 +78,9 @@
- **权限要求**:关联操作需要小程序管理员和视频号管理员共同确认
- **主体要求**:小程序和视频号的主体可以不同,但需要双方管理员确认
-#### 2.2.5 权限验证
+#### 2.2.4 功能验证
-完成关联后,可以通过以下方式验证权限是否开通:
+可以通过以下方式验证视频号功能是否可用:
1. **在微信开发者工具中验证**
- 在微信开发者工具中打开小程序
@@ -128,18 +88,17 @@
```javascript
console.log('是否支持视频号API:', typeof wx !== 'undefined' && typeof wx.openChannelsActivity === 'function');
```
- - 如果返回 `true`,则表示权限开通成功
+ - 如果返回 `true`,则表示API可用
2. **在真机环境中验证**
- 使用微信扫码打开小程序
- 触发视频号相关功能
- 检查是否能正常打开视频号内容
-3. **权限验证失败处理**
- - 确认小程序是否已与视频号关联
- - 确认视频号API权限是否已开通
- - 检查微信小程序基础库版本是否支持视频号API(建议使用最新版本)
- - 尝试重新关联视频号
+3. **功能验证失败处理**
+ - 检查微信小程序基础库版本是否满足要求(跳转打开需要 2.19.2+,内嵌打开需要 2.25.1+)
+ - 对于内嵌打开,检查主体是否满足要求或是否已关联
+ - 检查 `feedId` 等参数是否正确
## 3. 组件使用
@@ -208,12 +167,17 @@
## 4. 视频播放实现
+小程序提供两种打开视频号视频的方式:跳转打开和内嵌打开。
+
+### 4.1 跳转打开视频号视频
+
组件内部使用微信小程序的 `wx.openChannelsActivity` API 来打开视频号内容:
```javascript
if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
wx.openChannelsActivity({
feedId: item.feedId, // 视频号内容ID,必填
+ finderUserName: item.finderUserName, // 视频号ID(可选)
success: (res) => {
console.log('打开视频号成功', res);
},
@@ -234,30 +198,82 @@ if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
}
```
-### 4.1 API参数说明
+### 4.2 内嵌视频号视频
+
+从基础库 2.25.1 开始支持,小程序可以通过 `channel-video` 组件在小程序中内嵌视频号视频,且支持无弹窗跳转打开视频号对应视频,使用该组件时需注意:
+
+- 组件调用无资质要求
+- 暂不支持纯图片视频号内容
+
+```vue
+
+
+
+```
+
+### 4.3 API参数说明
- **feedId**:视频号内容ID,必填,必须是有效的视频号内容ID
+- **finderUserName**:视频号ID,可选
+- **feedToken**:非同主体视频号视频的标识,从基础库 2.31.1 开始支持,非个人主体小程序可使用
- **success**:调用成功的回调函数
- **fail**:调用失败的回调函数
- **complete**:调用完成的回调函数(无论成功或失败)
-### 4.2 错误码说明
+### 4.4 错误码说明
| 错误码 | 说明 | 解决方案 |
|--------|------|----------|
-| 40001 | 未授权 | 检查小程序是否与视频号关联,确认视频号API权限是否已开通 |
+| 40001 | 未授权 | 对于内嵌打开,检查主体是否满足要求或是否已关联 |
| 40002 | 参数错误 | 检查feedId是否正确,确保是有效的视频号内容ID |
| 40003 | 视频号内容不存在或已被删除 | 确认feedId对应的视频号内容是否仍然存在 |
| 40004 | 系统错误 | 稍后重试,或联系微信公众平台客服 |
+### 4.5 获取参数方法
+
+1. **获取finderUserName(视频号ID)**
+ - 登录视频号助手
+ - 在首页可以查看自己的视频号ID
+
+2. **获取feedId(视频号内容ID)**
+ - 登录视频号助手
+ - 在「动态管理」模块可以复制自己发表的每个视频对应的feedId
+
+3. **获取feed-token(非同主体视频号视频标识)**
+ - 登录MP平台,在「设置-基本设置-隐私与安全」找到「获取视频号视频ID权限」,并将开关打开
+ - 移动端找到想要内嵌的视频号视频,并复制该视频的feed-token
+ - 注意:打开开关后24小时内生效,失效后需要再次打开开关;开关打开状态仅对当前操作者生效
+
+### 4.6 主体判断逻辑
+
+#### 主体信息查询
+小程序主体信息可通过小程序资料页-开发团队进行查询,视频号主体信息可通过视频号首页-认证进行查询。
+
+#### 主体判断逻辑
+- **跳转打开视频号视频**:无主体限制,基础库版本 2.19.2 及以上
+- **内嵌视频号视频**:
+ - 从基础库版本 2.25.1 至 2.31.1,小程序需与视频号视频相同主体或关联主体
+ - 从基础库版本 2.31.1 开始,非个人主体小程序可内嵌非同主体/关联主体视频号视频
+
+关联主体申请流程可以参考:https://kf.qq.com/faq/190726e6JFja190726qMJBn6.html
+
+
+
## 5. 注意事项
### 5.1 环境限制
- 微信视频号API只能在微信小程序环境中使用,其他环境(如H5、App)不支持
-- 需要在微信小程序后台配置相关权限
-- 小程序需要与视频号进行关联
-- 微信小程序基础库版本建议使用2.10.0及以上
+- 跳转打开视频号视频需要微信小程序基础库版本 2.19.2 及以上
+- 内嵌视频号视频需要微信小程序基础库版本 2.25.1 及以上
+- 小程序与视频号关联仅在需要内嵌非同主体视频号视频(基础库 2.31.1 以下)时需要
### 5.2 数据格式
@@ -281,17 +297,16 @@ if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
### 6.1 视频无法播放
- 检查 `feedId` 是否正确,确保是有效的视频号内容ID
-- 确认小程序是否与视频号关联
-- 确认小程序是否开通了视频号相关权限
-- 检查微信小程序基础库版本是否支持视频号API
+- 检查微信小程序基础库版本是否满足要求(跳转打开需要 2.19.2+,内嵌打开需要 2.25.1+)
+- 对于内嵌打开,检查主体是否满足要求(基础库 2.31.1 以下需要相同主体或关联主体)
- 检查视频号内容是否仍然存在(未被删除)
-### 6.2 权限开通失败
+### 6.2 功能不可用
-- 确保小程序已发布上线
-- 确保小程序未被处罚或限制
-- 确认小程序管理员账号权限是否正确
-- 如仍无法开通,请联系微信公众平台客服
+- 确认当前环境是否为微信小程序环境
+- 检查微信小程序基础库版本是否满足要求
+- 对于内嵌打开,检查主体条件是否满足
+- 检查 `feedId` 等参数是否正确
### 6.3 关联失败
From 10465b7cf287aabc550848c7acaac0569569dac6 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 7 Jan 2026 17:17:24 +0800
Subject: [PATCH 8/9] =?UTF-8?q?chore(=E5=BE=AE=E4=BF=A1=E8=A7=86=E9=A2=91?=
=?UTF-8?q?=E5=8F=B7):=20=E6=B7=BB=E5=8A=A0MP-WEIXIN=20=E5=AE=8F=E9=99=90?=
=?UTF-8?q?=E5=88=B6channel-video?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components-diy/diy-wechat-channel.vue | 2 ++
1 file changed, 2 insertions(+)
diff --git a/components-diy/diy-wechat-channel.vue b/components-diy/diy-wechat-channel.vue
index e6f96a5..bc4f4db 100644
--- a/components-diy/diy-wechat-channel.vue
+++ b/components-diy/diy-wechat-channel.vue
@@ -9,12 +9,14 @@
+
+
From 7fde30063ba03801b277bfb3c0d6673dde705d89 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 7 Jan 2026 17:27:42 +0800
Subject: [PATCH 9/9] =?UTF-8?q?chore(=E5=BE=AE=E4=BF=A1=E8=A7=86=E9=A2=91?=
=?UTF-8?q?=E5=8F=B7):=20=E4=BC=98=E5=8C=96channel-video=E7=BB=84=E4=BB=B6?=
=?UTF-8?q?=E7=9A=84=E6=98=BE=E7=A4=BA=EF=BC=8C=E6=9B=B4=E6=96=B0=E6=8A=80?=
=?UTF-8?q?=E6=9C=AF=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components-diy/diy-wechat-channel.vue | 14 +++---
docs/WECHAT_CHANNEL_INTEGRATION.md | 72 ++++++++++++++++++++++++---
2 files changed, 72 insertions(+), 14 deletions(-)
diff --git a/components-diy/diy-wechat-channel.vue b/components-diy/diy-wechat-channel.vue
index bc4f4db..b0c856b 100644
--- a/components-diy/diy-wechat-channel.vue
+++ b/components-diy/diy-wechat-channel.vue
@@ -10,12 +10,14 @@
-
-
+
+
+
+
diff --git a/docs/WECHAT_CHANNEL_INTEGRATION.md b/docs/WECHAT_CHANNEL_INTEGRATION.md
index 28f65ab..dfd987e 100644
--- a/docs/WECHAT_CHANNEL_INTEGRATION.md
+++ b/docs/WECHAT_CHANNEL_INTEGRATION.md
@@ -204,17 +204,20 @@ if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
- 组件调用无资质要求
- 暂不支持纯图片视频号内容
+- 在 UniApp 中使用时,需要用 `` 包裹以确保组件正确显示
```vue
-
+
+
+
```
@@ -274,6 +277,7 @@ if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
- 跳转打开视频号视频需要微信小程序基础库版本 2.19.2 及以上
- 内嵌视频号视频需要微信小程序基础库版本 2.25.1 及以上
- 小程序与视频号关联仅在需要内嵌非同主体视频号视频(基础库 2.31.1 以下)时需要
+- 必须确保在 `manifest.json` 中设置 `usingComponents: true` 以启用组件支持
### 5.2 数据格式
@@ -334,6 +338,58 @@ if (typeof wx !== 'undefined' && wx.openChannelsActivity) {
- 在其他环境中,组件会显示但无法播放视频
- 建议在非小程序环境中添加友好的提示信息
+### 6.7 在uni-app中使用原生组件时,可能会遇到组件不显示的问题
+
+在uni-app中使用原生组件时,可能会遇到组件不显示的问题。以下是已验证的解决方案:
+
+#### 解决方案
+
+**方法一:使用 `` 包裹**
+
+在 UniApp 中使用 `channel-video` 组件时,必须用 `` 包裹以确保组件正确显示:
+
+``` vue
+
+
+
+
+
+
+
+
+
+```
+
+**方法二:检查 `manifest.json` 配置**
+
+确保在 `manifest.json` 文件中正确设置了 `usingComponents: true`,特别是在 `mp-weixin` 部分:
+
+``` json
+"mp-weixin": {
+ "appid": "你的小程序appid",
+ "usingComponents": true,
+ // 其他配置...
+}
+```
+
+**方法三:检查微信小程序基础库版本**
+
+确保微信小程序基础库版本满足要求:
+- 跳转打开视频号视频需要基础库版本 2.19.2 及以上
+- 内嵌视频号视频需要基础库版本 2.25.1 及以上
+
+**方法四:检查参数是否正确**
+
+确保传递给 `channel-video` 组件的参数正确:
+- `feedId`:视频号内容ID,必填
+- `finderUserName`:视频号ID,可选
+- `feedToken`:非同主体视频号视频的标识,可选(基础库 2.31.1+)
+
## 7. 示例代码
### 7.1 单个视频号示例