PHP 封装微信网页授权(OAuth2.0)开发指南

Elena
Elena
发布时间:2026-10-13 | 3人浏览过
原创

微信网页授权是微信公众号(特别是服务号)的高级功能,基于标准的 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

完成判断与注意事项

  1. 返回值检查:当 get_access_token 或 get_user_info 返回非 FALSE 值且包含 openid、nickname 等字段时,表示调用成功。
  2. 域名配置:务必确认你的回调域名已在公众平台配置白名单,否则会报 domain error。
  3. Token 安全:access_token 具有时效性,应在服务端妥善缓存或使用 refresh_token 机制刷新,避免频繁请求导致封禁。

以上就是基于 PHP 实现微信网页授权获取用户信息的详细内容,更多关于 PHP 对接微信接口的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表