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.

109 lines
4.5 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并跳转用户到微信授权页面
public function getCode($redirect_uri, $state=1, $scope='snsapi_base') {
// 处理 $redirect_uri去掉开头的 '/' 以符合微信的要求
if (substr($redirect_uri, 0, 1) == '/') {
$redirect_uri = substr($redirect_uri, 1);
}
// 微信授权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";
// 使用 Location 头进行页面重定向,跳转到微信授权页面
header("Location: $url");
exit;
}
// 通过授权码获取 access_token 和 openid
public function getAccessTokenAndOpenId($code) {
// 构造微信API获取access_token的URL
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
. "appid=" . WECHAT_APPID
. "&secret=" . WECHAT_APPSECRET
. "&code=" . $code
. "&grant_type=authorization_code";
// 调用自定义的Curl方法发送请求到微信API
$result = Curl::callWebServer($url, null);
// 解析微信返回的数据JSON格式
$res = json_decode($result, true);
// 判断请求是否成功
if (isset($res['access_token']) && isset($res['openid'])) {
return $res; // 返回access_token和openid
} else {
return false; // 请求失败返回false
}
}
// 使用 refresh_token 刷新 access_token
public function refreshToken($refreshToken) {
// 构造微信API刷新access_token的URL
$url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?"
. "appid=" . WECHAT_APPID
. "&grant_type=refresh_token"
. "&refresh_token=" . $refreshToken;
// 调用自定义的Curl方法发送请求到微信API
$result = Curl::callWebServer($url, null);
// 解析返回的数据
$res = json_decode($result, true);
// 判断请求是否成功
if (isset($res['access_token']) && isset($res['openid'])) {
return $res; // 返回新的access_token和openid
} else {
return false; // 请求失败返回false
}
}
// 获取用户的基本信息
public function getUserInfo($accessToken, $openId, $lang='zh_CN') {
// 构造微信API获取用户信息的URL
$url = "https://api.weixin.qq.com/sns/userinfo?"
. "access_token=" . $accessToken
. "&openid=" . $openId
. "&lang=" . $lang;
// 调用自定义的Curl方法发送请求到微信API
$result = Curl::callWebServer($url, null);
// 解析返回的JSON数据
return json_decode($result, true);
}
// 检查 access_token 是否有效
public function checkAccessToken($accessToken, $openId) {
// 构造微信API验证access_token有效性的URL
$url = "https://api.weixin.qq.com/sns/auth?"
. "access_token=" . $accessToken
. "&openid=" . $openId;
// 调用自定义的Curl方法发送请求到微信API
$result = Curl::callWebServer($url, null);
// 解析返回的结果
$res = json_decode($result, true);
// 如果返回值为 errcode 为 0说明access_token有效
if ($res['errcode'] == 0) {
return true;
} else {
return false;
}
}
}
getCode方法用于获取微信授权的URL并跳转用户到微信授权页面。处理 redirect_uri构造微信授权URL并使用 Location 头进行页面重定向。
getAccessTokenAndOpenId方法通过授权码获取 access_token openid。构造微信API获取 access_token 的URL发送请求并解析返回的JSON数据。
refreshToken方法使用 refresh_token 刷新 access_token。构造微信API刷新 access_token 的URL发送请求并解析返回的JSON数据。
getUserInfo方法获取用户的基本信息。构造微信API获取用户信息的URL发送请求并解析返回的JSON数据。
checkAccessToken方法检查 access_token 是否有效。构造微信API验证 access_token 有效性的URL发送请求并解析返回的结果。