微信分享功能使用说明
微信分享功能全面分析报告
一、系统架构分析
1.1 核心组件
1. WechatShareService(微信分享服务类)
位置: Banyan/Lib/Service/WechatShareService.class.php
功能:
- 统一构建微信分享配置
- 自动获取站点配置(标题、描述、Logo等)
- 处理URL绝对路径转换
- 提供默认分享配置和自定义配置合并
当前实现逻辑:
// 默认图片获取逻辑
$defaultImage = '';
if (!empty($settings['site']['logo'])) {
$defaultImage = config_weixin_img($settings['site']['logo']);
} else {
$defaultImage = $host . '/static/default/wap/image/logo.png';
}
// 默认标题获取逻辑
'title' => isset($settings['site']['sitename']) && $settings['site']['sitename']
? $settings['site']['sitename']
: (isset($settings['site']['title']) ? $settings['site']['title'] : ''),
问题分析:
- ❌ 缺少后台可配置的默认分享图片:当前只使用站点Logo,如果页面没有图片,会使用固定路径
/static/default/wap/image/logo.png,无法在后台配置 - ❌ 标题可能为空:如果
sitename和title都为空,标题会为空字符串,导致微信分享时可能显示URL地址
2. wechat-share.js(前端分享脚本)
位置: static/default/wap/js/wechat-share.js
功能:
- 初始化微信JS-SDK
- 配置分享到朋友圈、分享给朋友等接口
- 处理分享成功/取消回调
- 兼容新旧版本微信JS-SDK接口
图片回退逻辑:
function findFallbackImage() {
var images = document.images;
for (var i = 0; i < images.length; i++) {
var img = images[i];
var width = img.naturalWidth || img.width || 0;
if (width >= 60) {
return ensureAbsoluteUrl(img.src);
}
}
return '';
}
// 在 normaliseShareConfig() 中
if (!normalised.imgUrl) {
normalised.imgUrl = findFallbackImage();
}
问题分析:
- ✅ 有图片回退机制:如果配置的图片为空,会尝试从页面中查找符合条件的图片
- ❌ 缺少最终回退:如果页面中也没有符合条件的图片,
imgUrl仍可能为空,应该使用后台配置的默认图片
3. JSSDK(微信JS-SDK封装类)
位置: Banyan/Lib/Net/Jssdk.class.php
功能:
- 获取微信JS-SDK签名包(appId、timestamp、nonceStr、signature)
- 管理access_token和jsapi_ticket缓存
- 生成签名算法
1.2 集成方式
Wap模块(前端用户)
位置: Banyan/Lib/Action/Wap/CommonAction.class.php
实现:
// 在_initialize()方法中
import("@/Net.Jssdk");
$jssdk = new JSSDK($this->_CONFIG['weixin']["appid"], $this->_CONFIG['weixin']["appsecret"]);
$signPackage = $jssdk->GetSignPackage();
$this->assign('signPackage', $signPackage);
import("@/Service.WechatShareService");
$this->setWechatShare();
模板集成: themes/default/Wap/public/footer_share.html
- 输出微信签名和分享配置到全局变量
- 引入微信JS-SDK和分享脚本
Worker模块(员工端)
位置: Banyan/Lib/Action/Worker/CommonAction.class.php
实现: 类似Wap模块,仅在微信环境下初始化
二、各模块分享配置情况
2.1 已配置分享的模块
1. NewsAction(资讯模块)
位置: Banyan/Lib/Action/Wap/NewsAction.class.php
配置情况:
$this->setWechatShare(array(
'title' => '资讯',
'desc' => '资讯',
'link' => U('news/index', $linkArr),
'imgUrl' => $this->_CONFIG['site']['logo']
));
问题:
- ✅ 有自定义分享配置
- ❌ 标题和描述过于简单(都是"资讯")
- ❌ 图片只使用站点Logo,没有使用文章图片
2. ShopAction(商家模块)
位置: Banyan/Lib/Action/Wap/ShopAction.class.php
配置情况: ❌ 未找到自定义分享配置,使用默认配置
3. LifeAction(生活信息模块)
位置: Banyan/Lib/Action/Wap/LifeAction.class.php
配置情况: ❌ 未找到自定义分享配置,使用默认配置
4. HuiyuanAction(会员模块)
位置: Banyan/Lib/Action/Wap/HuiyuanAction.class.php
配置情况: 需要进一步检查
2.2 未配置分享的模块
根据文件列表,以下模块可能未配置自定义分享:
- IndexAction(首页)
- ShopAction(商家)
- LifeAction(生活信息)
- MallAction(商城)
- CouponAction(优惠券)
- ActivityAction(活动)
- ArticleAction(文章详情)
- 等等...
三、问题分析
3.1 标题显示定位地址的问题
原因分析:
- 标题为空时的处理:
- WechatShareService::build() 中,如果 title 为空,会使用空字符串
- 前端 wechat-share.js 中:
title: share.title || document.title || '',
- 如果 share.title 为空,会使用 document.title
- 如果 document.title 也为空或格式不正确,微信可能会使用URL作为标题
- URL作为标题的情况:
- 当页面标题为空或格式异常时
- 微信JS-SDK可能会回退到使用当前页面URL
- 特别是包含定位参数的URL(如 ?city_id=1&lat=xxx&lng=xxx)
解决方案:
- 确保所有页面都有明确的标题
- 在
WechatShareService中添加标题验证和默认值 - 在前端
wechat-share.js中添加标题回退逻辑
3.2 图片显示问题
当前逻辑:
- 后端:使用站点Logo或固定路径
/static/default/wap/image/logo.png - 前端:如果后端图片为空,尝试从页面中查找图片
- 问题:如果页面中也没有图片,最终
imgUrl可能为空
解决方案:
- 在后台添加"微信分享默认图片"配置项
- 在
WechatShareService中优先使用后台配置的默认图片 - 在前端
wechat-share.js中添加最终回退逻辑
四、适配情况分析
4.1 已适配的模块
- ✅ Wap模块:所有Action都继承
CommonAction,自动初始化分享功能 - ✅ Worker模块:在微信环境下自动初始化分享功能
4.2 未适配的模块
- ❌ 其他模块:需要检查是否有其他模块需要微信分享功能
4.3 各版块详细情况
| 模块 | Action文件 | 是否继承CommonAction | 是否有自定义分享配置 | 状态 |
|---|---|---|---|---|
| 首页 | IndexAction | ✅ | ❌ | 使用默认配置 |
| 商家 | ShopAction | ✅ | ❌ | 使用默认配置 |
| 资讯 | NewsAction | ✅ | ✅ | 有自定义配置 |
| 生活信息 | LifeAction | ✅ | ❌ | 使用默认配置 |
| 会员 | HuiyuanAction | ✅ | 待检查 | 待确认 |
| 商城 | MallAction | ✅ | ❌ | 使用默认配置 |
| 优惠券 | CouponAction | ✅ | ❌ | 使用默认配置 |
| 活动 | ActivityAction | ✅ | ❌ | 使用默认配置 |
| 文章详情 | ArticleAction | ✅ | ❌ | 使用默认配置 |
五、优化建议
5.1 后台配置增强
需要添加的配置项:
- 微信分享默认图片 (
weixin.share_default_image)
- 当页面没有符合的图片时,使用此图片
- 支持上传和预览
- 微信分享默认标题 (
weixin.share_default_title)
- 当页面标题为空时,使用此标题
- 支持变量替换(如 {city_name}, {site_name})
- 微信分享默认描述 (
weixin.share_default_desc)
- 当页面描述为空时,使用此描述
- 支持变量替换
5.2 代码优化
- WechatShareService优化:
- 添加标题验证和默认值
- 优先使用后台配置的默认图片
- 支持变量替换
- 前端脚本优化:
- 添加最终图片回退逻辑
- 添加标题回退逻辑
- 优化图片查找算法
- 各模块优化:
- 为重要页面(如商家详情、文章详情)添加自定义分享配置
- 使用页面实际内容作为分享标题和描述
- 使用页面相关图片作为分享图片
六、实施计划
阶段1:后台配置增强
- 在后台微信设置页面添加"微信分享默认图片"配置项
- 添加"微信分享默认标题"和"微信分享默认描述"配置项(可选)
- 修改
WechatShareService使用后台配置
阶段2:代码优化
- 优化
WechatShareService的标题和图片处理逻辑 - 优化前端
wechat-share.js的回退逻辑 - 修复标题显示定位地址的问题
阶段3:各模块适配
- 为重要页面添加自定义分享配置
- 测试各模块的分享功能
- 优化分享内容的质量
报告日期:2026-01-24
报告版本:v1.0
