code2session失败主因是js_code无效或cURL配置不当:需确保js_code未过期/未复用/来源正确;PHP8.5下须设CURL_SSLVERSION为TLSv1_2、禁用urldecode、正确解析JSON并安全存储openid。

code2session 接口返回 40013 或 40001
这是最常卡住的地方:微信服务器拒绝了你的请求,但错误码不直接告诉你哪错了。常见原因不是 AppID/Secret 写错(那会报 40001),而是 js_code 本身无效——它过期(5分钟)、已被使用过、或压根不是当前小程序前端调用 wx.login() 拿到的。
js_code必须在前端wx.login()成功回调里立刻传给后端,不能缓存、不能跨次复用- PHP 端收到后要原样转发给微信,别用
urldecode()或其他函数处理,微信要求原始字符串 - 检查
appid和secret是「小程序」后台的,不是公众号或开放平台的;PHP8.5 下注意curl默认启用CURLOPT_SSL_VERIFYPEER,若证书异常需显式设为false(仅测试环境)
PHP8.5 中用 curl_init() 调用微信接口失败
PHP8.5 对 cURL 的默认行为更严格,尤其 TLS 版本和证书验证。直接 file_get_contents() 基本不可用(不支持 POST + JSON),必须用 curl,且要手动配置几个关键项。
- 必须设置
CURLOPT_SSLVERSION为CURL_SSLVERSION_TLSv1_2,微信已不接受 TLS 1.0/1.1 - 生产环境务必保留
CURLOPT_SSL_VERIFYPEER => true,否则可能被中间人劫持;若报证书错误,优先更新系统 CA 包,而非关验证 - 微信返回的是纯 JSON 字符串,记得用
json_decode($response, true)解析,别漏掉第二个参数true,否则是对象,后续取$data['openid']会报错
拿到 openid 后怎么安全存 session
微信只给 openid,不给用户信息,也不提供长期 token。你不能拿它当登录态直接塞进 Cookie 或 localStorage,必须自己生成服务端 session 并绑定。
- 别把
openid当作 session_id 直接用——它可预测、无时效控制、无法主动销毁 - 推荐用 PHP 内置
session_start(),然后$_SESSION['openid'] = $data['openid'];PHP8.5 默认用php_session文件存储,注意session.save_path权限是否可写 - 若用 Redis 存 session,确认扩展已启用,且
session.save_handler = redis配置生效;否则看似成功,实际 session 数据根本没落地
为什么本地开发时总提示 invalid appid 却线上正常
大概率是用了开发环境的 APP_ID 和 APP_SECRET,但微信后台「开发管理 → 开发者ID」里填的 AppID 是正式版的。开发版、体验版、正式版共用同一套 AppID,没有独立 ID。
- 检查你代码里读取的配置来源:是硬编码?环境变量?还是配置文件?确保加载的是小程序后台显示的那个 AppID(6-18 位字母数字组合)
- PHP8.5 下
getenv('APP_SECRET')在某些 SAPI(如 Apache mod_php)中默认不生效,要用$_ENV或parse_ini_file() - 微信接口不校验域名,但你的 HTTPS 请求若被本地代理(如 Charles/Fiddler)拦截,证书不被信任也会导致 cURL 失败,表现为超时或空响应
真正麻烦的是 openid 和 unionid 的边界:同一个用户在不同小程序里 openid 不同,只有绑定同一微信开放平台账号的小程序才能拿到一致 unionid。这事没法在 code2session 这步解决,得提前规划好账号体系。