PHP 封装微信网页授权(OAuth2.0)开发指南
微信网页授权是微信公众号(特别是服务号)的高级功能,基于标准的 OAuth2.0 协议工作。它的核心价值在于:开发者无需等待用户发送消息或关注公众号,即可在用户授权后直接获取其昵称、头像等基本信息。
实现目标与流程
要实现该功能,通常遵循以下标准三步走策略:
- 用户授权获取 code:将用户引导至官方授权页面,由用户点击同意。
- 根据 code 换取 access_token:服务端拿到临时 code 后,向服务器发起请求换取有效期较短的 access_token。
- 获取用户信息:利用获取到的 token 和 openid,进一步请求用户的详细个人资料。
准备工作
在编写代码前,需从微信公众平台后台「设置 → 公众号设置 → 功能设置」中,配置好「网页授权域名」。同时准备你的 AppID 和 AppSecret,这是调用接口的凭证。
具体操作顺序
第 1 步:构造授权跳转链接
目的:生成引导用户进行授权的 URL。
关键参数:需指定应用回调地址(redirect_uri)、响应类型(response_type=code)及权限范围(scope=snsapi_userinfo)。
动作:对回调地址进行 URL 编码,拼接固定域名。注意末尾必须带 #wechat_redirect 以解决微信内置浏览器的问题。
第 2 步:封装底层 HTTP 请求方法
目的:建立与服务端 API 通信的基础通道。
动作:初始化 cURL,设置超时时间、返回模式及传输方式。此处需确保开启 CURLOPT_RETURNTRANSFER 以便接收数据。
第 3 步:根据 code 获取 access_token
目的:获得访问用户数据的凭证。
动作:在回调页中接收 URL 里的 code 参数,调用 get_access_token 方法。该方法会自动携带 AppID、AppSecret 向微信服务器发起 POST 请求。
第 4 步:拉取用户详细信息
目的:拿到最终的用户画像。
动作:使用上一步解析出的 access_token 和 openid,调用 get_user_info 接口。若成功,即可获得 JSON 格式的详细用户资料。
PHP 完整封装类代码
为方便集成,已将上述逻辑整合为一个 PHP Class。使用时请替换内部的 APPID 和 APPSECRET。
<?php
/**
* 微信网页授权核心处理类
*/
class Wechat {
// 【必填】请在下方填入你在微信公众平台获取的真实凭证
private $app_id = 'YOUR_APP_ID';
private $app_secret = 'YOUR_APP_SECRET';
/**
* 获取微信授权链接
* @param string $redirect_uri 授权回调地址(建议绝对路径)
* @param string $state 状态码,用于防止 CSRF 攻击
*/
public function get_authorize_url($redirect_uri = '', $state = '') {
$redirect_uri = urlencode($redirect_uri);
return "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->app_id}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
}
/**
* 根据 code 换取网页授权 access_token
*/
public function get_access_token($code = '') {
if (empty($code)) return false;
$token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->app_id}&secret={$this->app_secret}&code={$code}&grant_type=authorization_code";
$token_data = $this->http($token_url, 'GET');
if ($token_data['code'] == 200) {
return json_decode($token_data['body'], TRUE);
}
return FALSE;
}
/**
* 获取授权后的微信用户信息
*/
public function get_user_info($access_token = '', $open_id = '') {
if (!$access_token || !$open_id) return FALSE;
$info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
$info_data = $this->http($info_url, 'GET');
if ($info_data['code'] == 200) {
return json_decode($info_data['body'], TRUE);
}
return FALSE;
}
/**
* 底层 HTTP 请求封装
*/
private function http($url, $method, $postfields = null, $headers = array(), $debug = false) {
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ci, CURLOPT_TIMEOUT, 30);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE);
switch ($method) {
case 'POST':
curl_setopt($ci, CURLOPT_POST, true);
if (!empty($postfields)) {
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
}
break;
}
curl_setopt($ci, CURLOPT_URL, $url);
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ci);
$http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
curl_close($ci);
return array('code' => $http_code, 'body' => $response);
}
}
<?php
完成判断与注意事项
- 返回值检查:当
get_access_token或get_user_info返回非 FALSE 值且包含openid、nickname等字段时,表示调用成功。 - 域名配置:务必确认你的回调域名已在公众平台配置白名单,否则会报
domain error。 - Token 安全:
access_token具有时效性,应在服务端妥善缓存或使用 refresh_token 机制刷新,避免频繁请求导致封禁。
以上就是基于 PHP 实现微信网页授权获取用户信息的详细内容,更多关于 PHP 对接微信接口的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









