最典型报错是{"errcode":40003,"errmsg":"invalid openid"}或{"errcode":48001,"errmsg":"api unauthorized"},前者因openid错误或非粉丝,后者因未开通“获取用户基本信息”权限且需企业认证;环境问题包括curl/https未启用、服务器时间偏差超5分钟、allow_url_fopen关闭、反向代理未透传IP/Host;授权流程必须完整:scope=snsapi_userinfo、redirect_uri完全匹配备案域名、用code换网页授权access_token和openid再请求userinfo;PHP需显式json_decode、区分网页与全局token、注意未关注用户限制及UTF-8编码处理。

微信公众号获取用户信息失败的常见报错
最典型的错误是调用 getUserInfo(或通过 code 换取 access_token 和 openid 后请求用户信息接口)时返回:{"errcode":40003,"errmsg":"invalid openid"},或更隐蔽的 {"errcode":48001,"errmsg":"api unauthorized"}。前者多因 openid 错误或非当前公众号粉丝;后者基本可断定:你没在「公众号后台 → 开发 → 接口权限」里开通「获取用户基本信息(UnionID 机制)」权限,且该权限需企业认证主体才可申请。
PHP 部署线上后无法正确拿到用户信息的环境问题
本地调试通、上线就失败,大概率是服务端环境或配置差异导致:
-
curl被禁用或未开启https支持(检查phpinfo()中curl扩展是否启用,OpenSSL是否 loaded) - 服务器时间严重偏差(微信接口校验
timestamp,误差超 5 分钟直接拒绝) - PHP 的
allow_url_fopen关闭,而你用了file_get_contents()请求微信接口(建议统一改用curl) - 线上环境用了反向代理(如 Nginx),但未透传真实 IP 或 Host,导致微信回调地址校验失败,进而拿不到合法
code
获取用户信息前必须走完的授权流程链路
不是直接调用接口就能拿用户信息——微信强制要求 OAuth2 授权流程,漏掉任一环都会失败:
- 用户点击链接跳转到微信授权页,URL 必须含
scope=snsapi_userinfo(静默授权只支持snsapi_base,只能拿openid) - 重定向地址(
redirect_uri)必须和公众号后台「开发 → 接口权限 → 网页授权获取用户基本信息」中填写的域名完全一致(协议、端口、路径均需匹配,且必须是备案域名) - 拿到
code后,需用appid+secret+code向https://api.weixin.qq.com/sns/oauth2/access_token换取access_token和openid,再用这对凭证去请求https://api.weixin.qq.com/sns/userinfo - 注意:网页授权的
access_token有效期 2 小时,且与基础接口的access_token完全不通用
PHP 实操中容易被忽略的关键点
写法看着对,但几个细节不对就白忙活:
立即学习“PHP免费学习笔记(深入)”;
- 微信返回的是 JSON 字符串,但部分老版本 PHP 默认不自动解析,记得用
json_decode($response, true)显式转数组 - 请求
sns/userinfo时,access_token和openid必须是上一步换来的,不能混用公众号全局access_token - 如果用户未关注公众号,且你用的是
snsapi_base授权,则拿不到用户信息(微信限制);必须用snsapi_userinfo并确保用户已授权 - 中文字段(如
nickname)可能含 UTF-8 BOM 或特殊符号,入库前建议过一遍mb_convert_encoding($str, 'UTF-8', 'UTF-8')防乱码











