微信公众号对接是开发微信生态功能的基础,PHP作为常用的后端开发语言,可通过标准接口实现与微信公众号的交互。对接过程主要分为服务器验证、接口调用、消息处理三个核心环节,下面逐步讲解具体实现方法。

一、微信公众号后台配置
首先需要在微信公众平台完成基础配置,登录公众平台后进入开发-基本配置页面,找到服务器配置模块,需要填写以下信息:
- URL:你的服务器接收微信请求的地址,例如http://ipipp.com/wechat/callback.php
- Token:自定义的令牌字符串,需要和后端代码中的Token保持一致
- EncodingAESKey:可选择随机生成,用于消息加解密,本文先以明文模式为例
- 消息加解密方式:选择明文模式,后续可切换为安全模式
配置完成后先不要点击启用,需要完成后端验证代码后再启用。
二、服务器验证实现
微信服务器会向配置的URL发送GET请求,携带signature、timestamp、nonce、echostr四个参数,我们需要按照微信的验证规则校验签名,校验通过则返回echostr完成验证。
验证规则为:将Token、timestamp、nonce三个参数按字典序排序,拼接成字符串后进行sha1加密,得到的加密字符串和signature对比,一致则验证通过。
以下是PHP验证代码示例:
<?php
// 自定义Token,需要和公众号后台配置的Token一致
define("TOKEN", "your_custom_token_here");
// 验证服务器地址有效性
function checkSignature() {
// 获取微信传递的参数
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$echostr = $_GET["echostr"];
// 1. 将Token、timestamp、nonce三个参数按字典序排序
$tmpArr = array(TOKEN, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
// 2. 拼接成字符串
$tmpStr = implode($tmpArr);
// 3. sha1加密
$tmpStr = sha1($tmpStr);
// 4. 对比签名
if ($tmpStr == $signature) {
// 验证通过,返回echostr
echo $echostr;
return true;
} else {
return false;
}
}
// 判断是否为验证请求
if (isset($_GET["echostr"])) {
checkSignature();
exit;
}
?>
将以上代码部署到配置的URL对应的服务器路径,然后在公众号后台点击启用配置,若提示配置成功,说明服务器验证环节已完成。
三、获取access_token
access_token是调用微信公众平台接口的必要凭证,有效期为7200秒,需要定时刷新存储,避免重复获取。获取access_token需要用到公众号的appid和appsecret,这两个参数可以在公众平台基本配置页面查看。
以下是获取并存储access_token的PHP代码示例,这里使用文件存储的方式,实际项目中可替换为Redis等存储方式:
<?php
// 公众号appid和appsecret
define("APPID", "your_appid_here");
define("APPSECRET", "your_appsecret_here");
// access_token存储文件路径
define("TOKEN_FILE", "access_token.txt");
function getAccessToken() {
// 先判断本地文件是否存在且未过期
if (file_exists(TOKEN_FILE)) {
$content = file_get_contents(TOKEN_FILE);
$data = json_decode($content, true);
// 有效期设置为7100秒,预留100秒缓冲
if ($data["expire_time"] > time()) {
return $data["access_token"];
}
}
// 本地没有有效token,调用接口获取
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;
$result = file_get_contents($url);
$result = json_decode($result, true);
if (isset($result["access_token"])) {
$access_token = $result["access_token"];
$expire_time = time() + 7100;
// 存储到本地文件
$data = array(
"access_token" => $access_token,
"expire_time" => $expire_time
);
file_put_contents(TOKEN_FILE, json_encode($data));
return $access_token;
} else {
// 获取失败,返回错误信息
return false;
}
}
// 调用示例
$token = getAccessToken();
if ($token) {
echo "获取access_token成功:".$token;
} else {
echo "获取access_token失败";
}
?>
四、接收和回复微信消息
用户给公众号发送消息时,微信服务器会以POST方式向我们的回调URL发送XML格式的消息数据,我们需要解析XML,处理业务逻辑后再返回XML格式的回复内容。
以下是接收文本消息并回复相同内容的PHP代码示例:
<?php
// 禁止XML解析时的外部实体加载,防止安全漏洞
libxml_disable_entity_loader(true);
// 接收微信发送的POST数据
$postStr = file_get_contents("php://input");
if (!empty($postStr)) {
// 解析XML为对象
$postObj = simplexml_load_string($postStr, "SimpleXMLElement", LIBXML_NOCDATA);
// 获取消息类型
$msgType = $postObj->MsgType;
// 获取发送方openid
$fromUser = $postObj->FromUserName;
// 获取公众号原始id
$toUser = $postObj->ToUserName;
// 获取消息创建时间
$createTime = $postObj->CreateTime;
// 处理文本消息
if ($msgType == "text") {
// 获取用户发送的内容
$content = $postObj->Content;
// 构造回复的XML内容
$replyXml = "<xml>
<ToUserName><![CDATA[".$fromUser."]]></ToUserName>
<FromUserName><![CDATA[".$toUser."]]></FromUserName>
<CreateTime>".time()."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你发送的内容是:".$content."]]></Content>
</xml>";
echo $replyXml;
exit;
}
}
?>
五、常见问题排查
- 服务器验证失败:检查Token是否和公众号后台一致,URL是否可公网访问,服务器是否支持HTTPS(部分接口要求HTTPS)
- 获取access_token失败:检查appid和appsecret是否正确,服务器是否可以访问微信接口域名api.weixin.qq.com
- 消息接收不到:检查消息加解密方式是否为明文模式,回调URL是否正确,POST请求是否被服务器防火墙拦截
以上流程完成后,就实现了PHP和微信公众号的基础对接,后续可以基于access_token调用更多微信公众平台的高级接口,实现自定义菜单、模板消息、用户管理等功能。
PHP微信公众号对接微信接口access_token修改时间:2026-07-16 15:45:39