You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
class WeChatOAuth {
/**
* 获取微信授权的URL并跳转用户到微信授权页面
* @param string $redirect_uri 授权后重定向的回调链接地址,需 urlencode 编码
* @param int $state 重定向后会带上 state 参数,可标识用户的不同身份
* @param string $scope 应用授权作用域,此处默认为 snsapi_base
* @return void 直接进行页面跳转,无返回值
*/
public function getCode($redirect_uri, $state=1, $scope='snsapi_base') {
// 确保 redirect_uri 符合微信要求,去除前导斜杠
$redirect_uri = ltrim($redirect_uri, '/');
// 构建微信授权URL拼接所有必要的参数
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?" .
"appid=" . WECHAT_APPID .
"&redirect_uri=" . urlencode("http://" . $_SERVER['HTTP_HOST'] . "/" . $redirect_uri) .
"&response_type=code" .
"&scope=" . $scope .
"&state=" . $state .
"#wechat_redirect";
// 使用 HTTP 头实现页面跳转跳至微信授权页面
header("Location: $url");
exit;
}
/**
* 通过授权码获取 access_token 和 openid
* @param string $code 授权回调时带来的授权码参数
* @return array|bool 返回包含 access_token 和 openid 的数组,或在失败时返回 false
*/
public function getAccessTokenAndOpenId($code) {
// 构建请求微信接口的URL用于获取 access_token 和 openid
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?" .
"appid=" . WECHAT_APPID .
"&secret=" . WECHAT_APPSECRET .
"&code=" . $code .
"&grant_type=authorization_code";
// 发起请求,获取响应结果
$result = Curl::callWebServer($url, null);
// 解析响应结果,检查是否获取成功
$res = json_decode($result, true);
return isset($res['access_token'], $res['openid']) ? $res : false;
}
/**
* 使用 refresh_token 刷新 access_token
* @param string $refreshToken 用于刷新的旧 access_token
* @return array|bool 成功时返回新的 access_token 和 openid失败时返回 false
*/
public function refreshToken($refreshToken) {
// 构建请求微信接口的URL用于刷新 access_token
$url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?" .
"appid=" . WECHAT_APPID .
"&grant_type=refresh_token" .
"&refresh_token=" . $refreshToken;
// 发起请求,获取响应结果
$result = Curl::callWebServer($url, null);
// 解析响应结果,检查是否成功刷新
$res = json_decode($result, true);
return isset($res['access_token'], $res['openid']) ? $res : false;
}
/**
* 获取用户的基本信息
* @param string $accessToken 有效的 access_token
* @param string $openId 用户标识
* @param string $lang 返回国家语言,这里默认为简体中文 'zh_CN'
* @return array 返回包含用户信息的数组
*/
public function getUserInfo($accessToken, $openId, $lang='zh_CN') {
// 构建请求微信接口的URL用于获取用户信息
$url = "https://api.weixin.qq.com/sns/userinfo?" .
"access_token=" . $accessToken .
"&openid=" . $openId .
"&lang=" . $lang;
// 发起请求,获取响应结果
$result = Curl::callWebServer($url, null);
// 解析响应结果,直接返回
return json_decode($result, true);
}
/**
* 检查 access_token 是否有效
* @param string $accessToken 需要检查的 access_token
* @param string $openId 用户标识
* @return bool 有效返回 true无效返回 false
*/
public function checkAccessToken($accessToken, $openId) {
// 构建请求微信接口的URL用于验证 access_token 有效性
$url = "https://api.weixin.qq.com/sns/auth?" .
"access_token=" . $accessToken .
"&openid=" . $openId;
// 发起请求,获取响应结果
$result = Curl::callWebServer($url, null);
// 解析响应结果,检查 errcode 是否为 0表示 access_token 有效
$res = json_decode($result, true);
return $res['errcode'] == 0;
}
}