thinkphp 8.0 微信授权必须严格遵循 oauth2 授权码流程:配置开放平台回调域名(如 www.example.com,不带协议/路径/端口)、开通“网页授权”权限并审核通过;构造含正确 redirect_uri 和 state 的授权链接跳转;回调时校验 state 后用 code 换取 access_token 和 openid,二者缺一不可;建议封装为服务类隔离逻辑,严禁暴露 appsecret 或跳过校验。

ThinkPHP 8.0 实现微信授权必须走微信 OAuth2 授权码流程,不能跳过 redirect_uri 校验、不能用前端拼接 code 去换 token、也不能把 appsecret 暴露给浏览器——否则用户扫码后永远停留在白屏或报错页面。
配置微信开放平台回调域名与接口权限
登录微信开放平台 → 进入“网站应用” → 点击“修改” → 在“授权回调域名”栏填写完整域名(如 【www.example.com】),注意:不带 http:// 或 https://,不带路径,不加端口,末尾不能有斜杠。这一步填错会导致后续所有授权请求返回 errcode=10003。
确认已开通“网页授权获取用户基本信息”权限,且该网站应用状态为“审核通过”。未通过审核的应用只能在开发者白名单内测试,白名单最多填 10 个 openid,需手动添加。
生成授权链接并跳转用户到微信登录页
在控制器中构造授权 URL:
① 拼接 base_url = 'https://open.weixin.qq.com/connect/qrconnect';
② 构建 query 参数:appid(从 .env 读取)、redirect_uri(URL 编码后的后端回调地址)、response_type=code、scope=snsapi_login(扫码登录用)、state=唯一随机字符串(防 CSRF,建议存入 session);
③ 将参数用 http_build_query() 组装,再拼上 #wechat_redirect 后缀;
④ 返回重定向响应:return redirect($fullUrl);
注意:redirect_uri 必须和开放平台配置的域名完全一致,包括协议(https)、子域名(www)、路径(/auth/callback)、末尾斜杠——任意一处不匹配都会触发微信 10003 错误。
接收微信回调并换取用户身份凭证
微信会向你配置的 redirect_uri 发起 GET 请求,携带 code 和 state 参数。后端必须立即校验 state 是否匹配,防止重放攻击。
方法一:用 GuzzleHttp\Client 请求微信接口
向 https://api.weixin.qq.com/sns/oauth2/access_token 发起 POST 请求,传入 appid、secret、code、grant_type=authorization_code;
方法二:用 think\Http::post()
必须显式设置 header['Content-Type'] = 'application/x-www-form-urlencoded',否则微信可能返回 400;
拿到响应后,先判断是否含 errcode 字段——若存在且非 0(如 40029、40001),直接抛出异常或返回错误提示;
【必须校验 access_token 和 openid 同时存在,缺一不可】;
若成功,用 openid 查询本地用户表,不存在则创建;生成 JWT 或 Redis token 并写入响应 Cookie 或返回 JSON。
封装成服务类避免控制器臃肿
新建 app/service/WechatAuthService.php,构造函数注入 Config 和 Cache;
提供 loginUrl() 方法生成带签名和 state 的跳转链接;
提供 callbackHandle(string $code, string $state) 方法完成校验、请求、用户绑定、凭证签发全流程;
在控制器里只调用 $this->wechatAuth->callbackHandle($code, $state),其余逻辑全部隔离;
这一步操作起来很简单,直接把文件拖进去就行。但若跳过 state 校验,攻击者可伪造 code 请求,导致账户劫持。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











