微信平台PHP开发完整指南
本教程将带你全面了解微信平台的PHP开发,主要包括三个核心部分:公众号开发、小程序开发和企业微信开发,无论你是初学者还是有经验的开发者,这份指南都能为你提供清晰的路径和关键的代码示例。

第一部分:微信公众号PHP开发
公众号开发是微信生态中最成熟、应用最广泛的部分,主要涉及服务器配置、消息接收与发送、用户管理、网页授权等。
准备工作
-
注册公众号:
- 订阅号:适合媒体和个人,信息传播为主。
- 服务号:适合企业和组织,提供服务和高级接口。
- 开发者文档:务必熟读 官方文档,这是最重要的参考资料。
-
获取开发者凭证:
- 登录公众号后台 -> 设置与开发 -> 基本配置。
- 记录下 AppID (应用ID) 和 AppSecret (应用密钥)。
-
搭建开发环境:
(图片来源网络,侵删)- PHP 环境:推荐使用 PHP 7.4 或更高版本。
- Web 服务器:Nginx 或 Apache。
- 域名:需要一个公网域名,并在公众号后台配置为网页授权域名和JS接口安全域名。
核心概念与流程
A. 服务器配置与Token验证
这是公众号开发的第一步,用于验证你的服务器是否有效。
-
原理:微信服务器会向你的服务器发送一个GET请求,包含四个参数:
signature,timestamp,nonce,echostr,你的服务器需要按照特定规则(sha1( token + timestamp + nonce ))生成一个字符串,并与signature对比,如果一致,则返回echostr的内容,验证成功。 -
PHP 代码示例 (
server.php)
<?php
// 你的Token,必须与公众号后台配置的完全一致
define("TOKEN", "your_token_here");
$wechatObj = new wechatCallbackapiTest();
// 如果是验证服务器有效性,则验证
if (isset($_GET['echostr'])) {
$wechatObj->valid();
} else {
// 否则,处理接收到的消息
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
// 验证服务器
public function valid()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
echo $_GET["echostr"];
exit;
}
}
// 接收和回复消息
public function responseMsg()
{
// 获取POST数据 (XML格式)
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)) {
// 解析XML
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName; // 发送方账号
$toUsername = $postObj->ToUserName; // 公众号
$keyword = trim($postObj->Content); // 用户发送的内容
$time = time(); // 时间戳
// 文本消息模板
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
// 如果用户发送的是特定关键词,则回复相应内容
if ($keyword == "你好") {
$contentStr = "你好,欢迎关注!";
} elseif ($keyword == "教程") {
$contentStr = "这里是PHP微信开发教程。";
} else {
$contentStr = "您输入的是: " . $keyword;
}
// 格式化并发送回复
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
echo $resultStr;
} else {
echo "";
exit;
}
}
}
?>
B. 接收与发送消息
公众号可以接收和发送多种类型的消息(文本、图片、语音、视频等),也可以主动向用户发送客服消息或模板消息。

-
接收消息:如上所示,服务器会收到POST请求,解析XML即可获取消息类型、内容、发送者等信息。
-
发送消息:
- 被动回复:在
responseMsg函数中直接回复,如上例。 - 主动发送(客服消息):通过调用API,在用户48小时内互动后,主动发送消息。
- 被动回复:在
-
发送客服消息PHP示例
<?php
$appid = 'YOUR_APPID';
$appsecret = 'YOUR_APPSECRET';
// 1. 获取access_token
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($ch);
curl_close($ch);
$token_info = json_decode($json);
$access_token = $token_info->access_token;
// 2. 构造发送消息的数据
$touser = "OPENID_OF_THE_USER"; // 用户的OpenID
$msgtype = "text";
$content = "这是一条主动发送的客服消息。";
$post_data = json_encode([
"touser" => $touser,
"msgtype" => $msgtype,
"text" => [
"content" => $content
]
]);
// 3. 发送请求
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={$access_token}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
C. 网页授权获取用户信息
当用户在浏览器中访问你的网页时,可以通过网页授权获取其基本信息(昵称、头像、OpenID等)。
-
流程:
- 用户访问你的网页URL。
- 你的服务器将用户重定向到微信授权页面。
- 用户同意授权后,微信重定向回你指定的回调URL,并携带
code。 - 你的服务器用
code换取access_token和openid。 - (可选)用
access_token和openid获取用户详细信息。
-
PHP代码示例 (获取OpenID)
<?php
$appid = 'YOUR_APPID';
$redirect_uri = urlencode('YOUR_REDIRECT_URL'); // 回调地址,必须配置在公众号后台
$scope = 'snsapi_userinfo'; // snsapi_base (只获取openid) 或 snsapi_userinfo (获取信息并弹出授权页)
// 构造重定向URL
$auth_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appid}&redirect_uri={$redirect_uri}&response_type=code&scope={$scope}&state=STATE#wechat_redirect";
// 重定向用户
header("Location: " . $auth_url);
exit;
?>
在回调页面 (YOUR_REDIRECT_URL) 中处理 code:
<?php
$appid = 'YOUR_APPID';
$appsecret = 'YOUR_APPSECRET';
if (isset($_GET['code'])) {
$code = $_GET['code'];
$get_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$code}&grant_type=authorization_code";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $get_token_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($ch);
curl_close($ch);
$token_info = json_decode($json);
$openid = $token_info->openid;
$access_token = $token_info->access_token;
// 现在你有了openid,可以用来识别用户,或者获取用户信息
echo "用户的OpenID是: " . $openid;
// 如果scope是snsapi_userinfo,可以进一步获取用户信息
if (isset($token_info->scope) && $token_info->scope == 'snsapi_userinfo') {
$get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}";
// ... 使用curl获取用户信息 ...
}
}
?>
第二部分:微信小程序PHP开发
小程序后端与公众号共享服务器,主要区别在于API调用方式和前端交互。
准备工作
- 注册小程序账号:在 微信公众平台 注册,获取 AppID。
- 安装开发者工具:下载并安装微信开发者工具。
- 创建项目:在开发者工具中创建新项目,选择后端服务(PHP)。
核心概念与流程
小程序后端的核心任务是:
- 提供API接口:供小程序前端调用(如登录、获取数据)。
- 处理用户登录:通过
code获取session_key和openid,并自定义登录态(如生成3rd_session)。
A. 小程序登录流程
这是小程序后端开发的基石。
-
流程:
- 小程序前端调用
wx.login()获取临时code。 code发送到你的PHP后端。- PHP后端用
code+ AppID + AppSecret 向微信服务器请求,换取session_key和openid。 - PHP后端生成一个自定义登录态(如
3rd_session,可以是随机字符串),并存储openid和session_key的映射关系(如Redis或数据库)。 - 将
3rd_session返回给小程序前端。 - 后续请求,前端携带
3rd_session,后端验证其有效性,即可识别用户。
- 小程序前端调用
-
PHP登录接口示例 (
login.php)
<?php
header('Content-Type:application/json; charset=utf-8');
$appid = 'YOUR_MINIPROGRAM_APPID';
$appsecret = 'YOUR_MINIPROGRAM_APPSECRET';
// 1. 接收前端传来的code
$post_data = file_get_contents('php://input');
$data = json_decode($post_data);
$code = $data->code;
if (!$code) {
echo json_encode(['errcode' => 40013, 'errmsg' => 'code missing']);
exit;
}
// 2. 用code换取openid和session_key
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$appsecret}&js_code={$code}&grant_type=authorization_code";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($ch);
curl_close($ch);
$session_info = json_decode($json);
if (isset($session_info->errcode)) {
// 微信返回了错误
echo json_encode(['errcode' => $session_info->errcode, 'errmsg' => $session_info->errmsg]);
exit;
}
$openid = $session_info->openid;
$session_key = $session_info->session_key;
// 3. 生成自定义登录态 (3rd_session)
$third_session = bin2hex(random_bytes(16)); // 生成一个随机字符串
// 4. 存储session_key和openid的映射关系 (这里用伪代码表示,实际应存入Redis或数据库)
// redis.set("session:" . $third_session, json_encode(['openid' => $openid, 'session_key' => $session_key]), 7200);
// 5. 返回3rd_session给前端
echo json_encode([
'session' => $third_session,
'openid' => $openid // 可选,前端也可以不用直接拿
]);
?>
B. 数据解密
小程序用户信息(如昵称、头像)是加密的,需要在后端解密。
-
流程:
- 小程序前端调用
wx.getUserProfile获取加密数据encryptedData和iv。 - 将
encryptedData,iv,session_key(通过3rd_session从你的存储中获取) 发送到PHP后端。
- 注意:
session_key是解密的关键,必须在后端处理,不能传给前端。
- PHP后端使用
AES-128-CBC算法解密数据。
- 小程序前端调用
-
PHP解密示例 (
decrypt.php)
你需要先安装 mcrypt 扩展(PHP 7.1+ 已移除,建议使用 openssl)。
<?php
// 接收前端数据
$post_data = file_get_contents('php://input');
$data = json_decode($post_data);
$encryptedData = $data->encryptedData;
$iv = $data->iv;
$third_session = $data->third_session;
// 1. 从你的存储中 (如Redis) 根据$third_session获取session_key
// $session_key_json = redis.get("session:" . $third_session);
// $session_key_info = json_decode($session_key_json);
// $session_key = $session_key_info->session_key;
// 为了演示,我们假设已经获取到了
$session_key = "YOUR_SESSION_KEY_FROM_STORAGE"; // 替换为实际从存储中获取的值
// 2. 解密数据
function decryptData($session_key, $iv, $encryptedData) {
$aesKey = base64_decode($session_key);
$aesIV = base64_decode($iv);
$aesCipher = base64_decode($encryptedData);
// 使用openssl解密
$result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, OPENSSL_RAW_DATA, $aesIV);
$dataObj = json_decode($result);
return $dataObj;
}
$decryptedData = decryptData($session_key, $iv, $encryptedData);
if ($decryptedData) {
echo json_encode(['errcode' => 0, 'user_info' => $decryptedData]);
} else {
echo json_encode(['errcode' => -1, 'errmsg' => '解密失败']);
}
?>
第三部分:企业微信PHP开发
企业微信更侧重于企业内部管理和外部客户联系,其开发模式与公众号类似,但API和权限体系不同。
准备工作
- 注册企业:拥有一个企业实体。
- 注册企业微信:在 企业微信官网 注册,创建企业。
- 创建应用:在“应用管理”中创建一个自建应用,获取 AgentId 和 Secret。
- 获取企业ID:在“我的企业” -> “企业信息”中找到 CorpID。
核心概念与流程
企业微信开发的核心是调用其API来管理通讯录、发送消息等。
A. 获取Access Token
与公众号类似,企业微信的API调用也需要 access_token,但其获取方式和参数不同。
-
获取地址:
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=CorpID&corpsecret=Secret -
PHP代码示例
<?php
$corpid = 'YOUR_CORP_ID';
$corpsecret = 'YOUR_APP_SECRET';
$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$corpid}&corpsecret={$corpsecret}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($ch);
curl_close($ch);
$result = json_decode($json);
if ($result->errcode == 0) {
$access_token = $result->access_token;
// 使用这个access_token去调用其他API
echo "Access Token: " . $access_token;
} else {
echo "Error: " . $result->errmsg;
}
?>
B. 发送应用消息
企业微信可以给成员或部门发送应用消息(文本、图片、文件等)。
-
API地址:
https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN -
请求方式:POST (JSON格式)
-
PHP发送文本消息示例
<?php
$access_token = "YOUR_ACCESS_TOKEN"; // 通过上面的方法获取
$touser = "user1|user2"; // 接收者用户ID,多个用|分隔
$toparty = "party1|party2"; // 接收者部门ID,多个用|分隔
$totag = "tag1|tag2"; // 接收者标签ID
$msgtype = "text";
$content = "这是一条来自企业微信的自建应用消息。";
$post_data = json_encode([
"touser" => $touser,
"toparty" => $toparty,
"totag" => $totag,
"msgtype" => $msgtype,
"agentid" => YOUR_AGENT_ID, // 你的应用AgentId
"text" => [
"content" => $content
],
"safe" => 0 // 表示是否是保密消息,0表示否,1表示是
], JSON_UNESCAPED_UNICODE);
$url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={$access_token}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
总结与最佳实践
- 封装SDK:不要每次都写重复的
curl代码,将获取access_token、发送消息、网页授权等常用操作封装成自己的PHP SDK或类库,提高复用性。 - Token缓存:
access_token和jscode2session的session_key都有有效期,务必将其缓存起来(如使用Redis或文件缓存),避免频繁向微信服务器请求。 - 错误处理:调用微信API时,务必检查返回的
errcode,做好错误处理和日志记录。 - HTTPS:所有与微信交互的URL都必须是
https且域名已备案。 - 官方文档是圣经:微信的接口和规则更新频繁,遇到任何问题,第一时间查阅最新的官方开发者文档。
这份教程为你提供了一个全面的起点,你需要根据具体的业务需求,深入学习更高级的接口和功能,不断实践和完善你的应用,祝你开发顺利!
