PHP开发微信公众号JS-SDK集成指南

白榆
白榆
发布时间:2026-10-14 | 5人浏览过
原创

在微信公众号内容分发中,通过分享链接进入的页面若缺乏自定义信息,用户体验较差。利用PHP后端配合微信JS-SDK,可精准控制“分享到朋友圈”和“发送给好友”时的标题、摘要及封面图。本文梳理了从域名配置到代码实现的完整流程。

JS-SDK 解决的核心问题

微信公众号推送文章时,若在聊天窗口直接展示,效果受限于公众号后台配置的模板。而当用户将文章链接转发给好友或分享至朋友圈时,微信会抓取页面内容进行展示。此时显示效果的差异主要源于:公众号原生推送由服务器端接口控制,而转发后的预览界面则依赖前端页面调用的 JS-SDK 接口权限。

例如:

 

点开第一篇文章后:

 

若将此文章链接发送给朋友,默认显示效果如下:

若将其分享到朋友圈,效果会有所不同:

为了优化分享体验,我们需要手动调用 JS-SDK 接口来拦截并修改这些转发卡片的信息。具体来说,涉及以下两个核心接口的调用:

  • 发送给好友: 调用 onMenuShareAppMessage 获取点击状态及自定义分享内容。
  • 分享到朋友圈: 调用 onMenuShareTimeline 获取点击状态及自定义分享内容。

开发与调试环境准备

在进行本地测试或服务器部署前,请确保满足以下条件:

  1. 服务器环境: PHP运行环境(如 Nginx/Apache + PHP)。注意:某些受限平台(如早期的 SAE 应用引擎)可能限制文件写入操作,导致测试失败,建议使用支持文件读写功能的服务器(如 BAE 或其他云服务器)进行初期调试。
  2. 官方素材包: 下载微信官方 JS-SDK Demo 以获取 PHP 签名计算逻辑。原始下载地址为 http://demo.open.weixin.qq.com/jssdk/sample.zip。
  3. 目录结构: 解压后会发现多个 PHP 文件。通常其中前 3 个为配置文件,保持原样不动即可;重点关注入口文件(如 sample.php),这里存放页面主体逻辑。

 

进入目录查看结构:

 

配置步骤

第1步:设置 JS 接口安全域名

目的: 授权你的服务器域名可以使用微信 JS-SDK。
操作: 登录微信公众平台,依次点击左侧菜单 公众号设置 → 功能设置 → 找到 JS接口安全域名 区域。
完成状态: 成功填入你的业务域名,并完成 ICPCN 域名的 TXT 验证上传至服务器根目录。

第2步:获取签名参数 (Server-Side)

目的: 生成供前端调用所需的 appId, timestamp, nonceStr, signature 四个关键参数。
入口: 后端 PHP 文件(如 jssdk.php)。

<?php
// 引入官方 SDK 类
require_once "jssdk.php";

// 实例化 JSSDK,替换为你公众号的 AppID 和 AppSecret
$jssdk = new JSSDK("wxaf471be5d2bc9521", "93f5c3817074d43e7a7ab3f403cc72dd");
// 获取签名包数组
$signPackage = $jssdk->GetSignPackage();
?>

第3步:前端配置与 API 调用 (Client-Side)

目的: 在前端 HTML 页面引入 SDK 脚本,初始化配置,并在 ready 回调中注册分享行为。
动作: 编写 HTML/JS 页面,绑定按钮事件或直接监听页面加载完成。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>JS-SDK 测试</title>
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
</head>
<body>
 <div>我靠</div>
 <div>猪八戒</div>
 <button style="color: red" id="btn">你好</button>
 <button id="btn1">唐生</button>
 
 <!-- 必须引入微信 JS-SDK -->
 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
 
 <script>
 // 获取 DOM 元素
 var button = document.getElementsByTagName("button");
 var btn = document.getElementById("btn");
 var div = document.getElementsByTagName("div")[0];
 var btn1 = document.getElementById("btn1");
 
 /* 核心:配置 wx.config */
 wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '<?php echo $signPackage["appId"];?>', // 必填,公众号的唯一标识
  timestamp: <?php echo $signPackage["timestamp"];?>, // 必填,生成签名的时间戳
  nonceStr: '<?php echo $signPackage["nonceStr"];?>', // 必填,生成签名的随机串
  signature: '<?php echo $signPackage["signature"];?>', // 必填,签名
  jsApiList: [
   'onMenuShareAppMessage', // 分享给朋友
   'chooseImage',           // 拍照或选图
   'openLocation'           // 使用腾讯地图
  ]
 });
 
 /* 核心:在 ready 回调中执行 API */
 wx.ready(function () {
  // 1. 自定义“发送给好友”的内容
  wx.onMenuShareAppMessage({
   title: '大圣', // 分享标题
   desc: '我要坚持', // 分享描述
   link: 'http://www.baidu.com', // 分享链接
   imgUrl: 'http://discuz.comli.com/weixin/weather/icon/cartoon.jpg', // 分享图标
   type: 'link', // 分享类型,music、video或link,不填默认为link
   dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
   success: function () { 
    // 用户确认分享后执行的回调函数
    alert("success");
   },
   cancel: function () { 
    // 用户取消分享后执行的回调函数
    alert("error");
   }
  });
 
  // 2. 示例:点击按钮选择图片
  btn.onclick = function(){
   wx.chooseImage({
    count: 1, // 默认9
    sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
    sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
    success: function (res) {
     var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
    }
   })
  };
 
  // 3. 示例:点击按钮打开微信内置地图
  btn1.onclick = function() {
   wx.openLocation({
    latitude: 0, // 纬度,浮点数,范围为90 ~ -90
    longitude: 0, // 经度,浮点数,范围为180 ~ -180。
    name: '', // 位置名
    address: '', // 地址详情说明
    scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
    infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
   });
  }
 });
 
 /* 错误处理(可选) */
 wx.error(function(res){
  // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
 });
 
</script>
</body>
</html>

常见问题排查

  • SAE 服务器测试报错: 如果使用新浪云 SAE 平台,由于其沙箱机制限制文件系统的写入,可能导致 JS-SDK 签名生成失败或缓存出错。建议在支持普通文件读写的服务器环境上进行调试,确保证书签名算法正确执行。
  • 签名无效 (invalid signature): 绝大多数情况是由于 URL 未参与签名计算,或者后端缓存了旧的 Ticket 导致 Timestamp 不一致。请检查 GetSignPackage() 内部逻辑是否正确获取了 access_token 和 jsapi_ticket。
  • 调试开关: 始终在初期设置 debug: true。一旦发现问题,可以在控制台 Console 中看到详细的 JavaScript 错误日志,这比单纯猜测错误原因要高效得多。

如需了解更多高级接口及其详细参数定义,请访问微信官方开发者文档:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html。

以上就是利用 PHP 开发微信公众号 JS-SDK 的详细内容,更多关于微信公众号自定义分享的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表