织梦微信分享缩略图设置方法

缩略图不显示的原因

微信内分享织梦文章时,缩略图经常空白或显示默认图标。核心原因有三点:

  1. 未配置微信JS-SDK:微信不再自动抓取页面图片,必须通过JS-SDK的onMenuShareAppMessage指定imgUrl。
  2. 缩略图URL非绝对路径:微信要求imgUrl为完整的http(s)绝对地址,织梦litpic默认是相对路径。
  3. 图片尺寸不达标:缩略图需大于300×300px,且体积不超过32KB,否则微信会忽略。

第一步:公众号配置

登录微信公众平台,在"设置——公众号设置——功能设置"中配置JS接口安全域名,填写不带http的域名(如www.example.com),需上传校验文件到网站根目录。

在"开发——基本配置"中获取AppID和AppSecret,记录下来后续后端生成签名用。

第二步:后端签名生成

新建/plus/wxsign.php生成JS-SDK签名:

require_once(dirname(__FILE__).'/../include/common.inc.php');
$appid='wx1234567890';
$secret='你的AppSecret';

// 获取access_token(缓存7200秒)
$tokenFile=DEDEDATA.'/wx_token.txt';
if(file_exists($tokenFile) && (time()-filemtime($tokenFile))<7200){
    $token=file_get_contents($tokenFile);
}else{
    $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
    $token=json_decode(file_get_contents($url),true)['access_token'];
    file_put_contents($tokenFile,$token);
}

// 获取jsapi_ticket(缓存7200秒)
$ticketFile=DEDEDATA.'/wx_ticket.txt';
if(file_exists($ticketFile) && (time()-filemtime($ticketFile))<7200){
    $ticket=file_get_contents($ticketFile);
}else{
    $url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$token";
    $ticket=json_decode(file_get_contents($url),true)['ticket'];
    file_put_contents($ticketFile,$ticket);
}

// 生成签名
$noncestr=md5(uniqid());
$timestamp=time();
$url=$_SERVER['HTTP_REFERER'];
$string="jsapi_ticket=$ticket&noncestr=$noncestr×tamp=$timestamp&url=$url";
$signature=sha1($string);

echo json_encode(array(
    'appid'=>$appid,'timestamp'=>$timestamp,
    'noncestr'=>$noncestr,'signature'=>$signature
));
access_token和jsapi_ticket有7200秒缓存且每日获取次数受限,必须做服务端缓存,否则很快耗尽配额。

第三步:前端引入JS-SDK

在文章模板<head>中引入:

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
$.get('/plus/wxsign.php',function(res){
    wx.config({
        debug:false,
        appId:res.appid,
        timestamp:res.timestamp,
        nonceStr:res.noncestr,
        signature:res.signature,
        jsApiList:['onMenuShareAppMessage','onMenuShareTimeline']
    });
    wx.ready(function(){
        var shareData={
            title:'{dede:field.title/}',
            desc:'{dede:field.description function="html2text(@me)"/}',
            link:location.href,
            imgUrl:'{dede:global.cfg_cmshost/}{dede:field.litpic/}'
        };
        wx.onMenuShareAppMessage(shareData);
        wx.onMenuShareTimeline(shareData);
    });
},'json');
</script>
缩略图预览

缩略图URL处理要点

拼接绝对路径

织梦{dede:field.litpic/}输出形如/uploads/allimg/2024/01/xxx.jpg,需拼上域名:

imgUrl:'{dede:global.cfg_cmshost/}{dede:field.litpic/}'
// 结果:https://www.example.com/uploads/allimg/2024/01/xxx.jpg

也可以用{dede:global.cfg_basehost/}变量,注意它是否已包含https://前缀。

无缩略图时给默认图

文章未设置缩略图时litpic为空,需兜底:

var pic='{dede:field.litpic/}';
if(!pic || pic.indexOf('http')===-1 && pic.length<10){
    pic='/images/wx-default.jpg';
}
var imgUrl='{dede:global.cfg_cmshost/}' + pic;

常见故障排查

signature签名无效

用微信官方的JS-SDK签名校验工具对比。最常见原因是url参数取错——必须取当前页面URL(含?后面的参数),且不能encode。建议用$_SERVER['HTTP_REFERER']或前端传location.href.split('#')[0]给后端。

缩略图仍不显示

用浏览器直接访问imgUrl,确认能打开。微信对图片有白名单限制,imgUrl的域名必须与JS接口安全域名一致。CDN域名需在公众号后台额外配置。

debug模式报错invalid domain

安全域名配置有误或未生效。注意域名不带http://,且校验文件必须能通过http(s)://域名/校验文件名访问到。

后续优化方向

新版本微信已推出updateAppMessageShareDataupdateTimelineShareData接口替代旧版API,建议优先使用新接口以兼容未来版本。同时为不同分类的文章预设专属分享缩略图模板,统一品牌视觉,提升分享时的识别度与点击率。