codeigniter 调用 code2session 拿不到 unionid 的最常见原因是小程序或公众号未绑定到同一微信开放平台账号,导致微信不返回 unionid;需手动检查开放平台绑定状态、正确传参、封装健壮服务类并按 unionid 关联用户。

CodeIgniter 本身不内置微信 UnionID 机制,必须靠开发者手动对接微信开放平台的接口逻辑,并确保账号已在开放平台完成绑定。没做这步,code2Session 返回里永远不会有 unionid 字段。
为什么 CodeIgniter 调用 code2Session 拿不到 unionid
最常见原因是:小程序或公众号没和微信开放平台账号绑定,或者绑定的是不同开放平台主体。微信只在「同一开放平台账号下」的多个应用之间才返回 unionid。
- 检查微信开放平台「管理中心 → 绑定关系」里,你的小程序 AppID 和公众号 AppID 是否都显示为「已绑定」状态
- 确认后端请求
https://api.weixin.qq.com/sns/jscode2session时传的appid是小程序的 AppID(不是公众号的),且该小程序已绑定到开放平台 - 如果用的是公众号网页授权(
snsapi_userinfo),需确保公众号是认证服务号,且在开放平台中已绑定该公众号 -
code2Session返回中出现unionid的前提是:用户在该开放平台下其他应用(如另一个小程序或移动 App)已登录过,且当时也成功获取过unionid
CodeIgniter 中封装 code2Session 请求的要点
别直接拼 URL 发 cURL,容易漏参数、没重试、难 debug。建议封装成独立服务类,例如 WechatAuthService,并在构造函数注入配置。
- 必须校验返回 JSON 中是否含
errcode字段,比如40029(code 无效)、45011(调用超频)要单独处理 - 不要把
appSecret写死在控制器里,应从config/wechat.php加载,支持多环境切换 - 注意 PHP 的
file_get_contents默认无超时,建议改用curl_init并设置CURLOPT_TIMEOUT_MS≤ 3000 - 返回的
session_key别存数据库,它仅用于解密敏感数据;openid和unionid才是用户标识主键
绑定逻辑里 unionid 作为唯一用户标识怎么落地
不能只靠 unionid 创建新用户,得先查库:已有 unionid 就关联老账号;没有就新建,同时记录 openid(按来源区分字段,如 mp_openid、web_openid)。
- 数据库表至少要有
unionid(唯一索引)、source_type(枚举:'miniapp'/'mp'/'web')、openid、last_login_at - 如果用户先用微信公众号登录(拿到
unionid),再用小程序登录(同样unionid),两次请求应命中同一用户记录,而不是生成两条 - 避免用
INSERT ... ON DUPLICATE KEY UPDATE简单覆盖,因为不同来源的openid可能需要分别保留 - 特别注意:小游戏暂不支持
code2Session返回unionid,必须走getPaidUnionID或开放平台用户信息接口补全
真正麻烦的不是写代码,而是微信侧的绑定状态不可见于 API 响应——哪怕你代码全对,只要开放平台后台漏绑一个 AppID,unionid 就永远为空。每次上线前,务必手动点开「微信开放平台 → 绑定关系」逐个确认状态。











