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 @@ + + + + + \ 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 @@ + + + + + \ 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 单个视频号示例