php微信公众号网页授权 2024-09-09

<?php

// 调用示例

// 引入WechatAuth类
require_once 'path/to/WechatAuth.php';
// 定义应用ID、应用密钥和重定向URI
$appId = 'YOUR_APP_ID';
$appSecret = 'YOUR_APP_SECRET';
$redirectUri = 'http://example.com/auth.php'; // 应该是当前脚本的完整URL

// 实例化WechatAuth对象
$wechatAuth = new WechatAuth($appId, $appSecret, $redirectUri);

// 检查是否已经获得了code
if (isset($_GET['code'])) {
    $code = $_GET['code'];
    // 通过code获取access_token
    $accessTokenResponse = $wechatAuth->getAccessToken($code);

    if (isset($accessTokenResponse['access_token'])) {
        // 获取用户信息
        $userInfo = $wechatAuth->getUserInfo($accessTokenResponse['access_token'], $accessTokenResponse['openid']);

        // 输出用户信息
        echo "<h1>用户信息:</h1>";
        echo "<p>OpenID: {$userInfo['openid']}</p>";
        echo "<p>Nickname: {$userInfo['nickname']}</p>";
        echo "<img src='{$userInfo['headimgurl']}' alt='用户头像'>";
    } else {
        echo "获取access_token失败:" . print_r($accessTokenResponse, true);
    }
} else {
    // 如果没有code,则跳转到授权页面
    $authUrl = $wechatAuth->getAuthUrl();
    header("Location: {$authUrl}");
    exit;
}


/**
 * 微信公众号网页授权
 * Class WechatAuth
 * @package app\index\controller
 */
class WechatAuth
{
    private $appId;
    private $appSecret;
    private $redirectUri;

    public function __construct($appId, $appSecret, $redirectUri)
    {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
        $this->redirectUri = $redirectUri;
    }


    /**
     * 第一步:引导用户进入授权页面同意授权,获取code
     *
     * @param string $state
     * @return string
     */
    public function getAuthUrl($state = 'STATE')
    {
        $encodedRedirectUri = urlencode($this->redirectUri);
        return "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appId}&redirect_uri={$encodedRedirectUri}&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
    }


    /**
     * 第二步:通过code换取网页授权access_token(与基础支持中的access_token不同)
     * @param $code
     * @return mixed
     */
    public function getAccessToken($code)
    {
        //启动session的初始化
        session_start();

        if (isset($_SESSION['access_expires']) && isset($_SESSION['access_info'])) {
            if (time() < $_SESSION['access_expires']) {
                return $_SESSION['access_info'];
            }
        }

        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appId}&secret={$this->appSecret}&code={$code}&grant_type=authorization_code";
        $response = $this->request($url);
        if (!$response) {
            return false;
        }

        //存入session
        $_SESSION['access_expires'] = time() + $response['expires_in'];
        $_SESSION['access_info'] = $response;

        return $response;
    }


    /**
     * 第三步:刷新access_token,避免过期(如果需要)
     * @param $refreshToken
     * @return mixed
     */
    public function refreshAccessToken($refreshToken)
    {
        $url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={$this->appId}&grant_type=refresh_token&refresh_token={$refreshToken}";
        $response = $this->request($url);
        if (!$response) {
            return false;
        }
        return $response;
    }

    /**
     * 第四步:通过网页授权access_token和openid获取用户基本信息(需scope为 snsapi_userinfo)(支持UnionID机制)
     * @param $accessToken
     * @param $openid
     * @return mixed
     */
    public function getUserInfo($accessToken, $openid)
    {
        $url = "https://api.weixin.qq.com/sns/userinfo?access_token={$accessToken}&openid={$openid}&lang=zh_CN";
        $response = $this->request($url);
        if (!$response) {
            return false;
        }
        return $response;
    }

    protected function request($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // 设置连接超时时间
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

        $data = curl_exec($ch);
        curl_close($ch);

        if ($data === false) {
            return false;
        }

        return json_decode($data, true);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容