微信小程序调用手册

用登录 code 校验小程序用户身份

把 wx.login 的临时 code 交给服务端换取 OpenID 和会话密钥,区分微信会话和自己的业务登录态。

官方资料核对 2026-10-15示例代码,未进行真实接口实测
← 返回平台功能

接入准备

  • 已绑定小程序开发成员,持有该小程序 AppID 与 AppSecret。
  • 在小程序客户端调用 wx.login,把 success 回调的 code 经自己的 HTTPS 服务发送到后台;不要把 AppSecret 放进小程序。

准备环境变量

示例值需要替换为自己的凭证或资源 ID。代码在本机或服务端运行;密钥不应放进公开网页。

WX_MINI_APP_ID
自有小程序 AppID,不是公众号 AppID。
WX_MINI_APP_SECRET
同一小程序的 AppSecret,只保存在服务端。
WX_MINI_LOGIN_CODE
必须来自当前小程序 wx.login 的临时登录凭证,不是手机号 code。
终端
export WX_MINI_APP_ID='wx_replace_with_your_miniprogram_appid'
export WX_MINI_APP_SECRET='replace_with_your_miniprogram_secret'
export WX_MINI_LOGIN_CODE='replace_with_fresh_wx_login_code'

以上 export 适用于 macOS / Linux 的终端。按调用步骤保存代码文件,再在同一终端执行。

调用步骤

  1. 01

    在同一终端设置小程序凭证和新取得的 WX_MINI_LOGIN_CODE;code 只能消费一次。

  2. 02

    保存下方 Node.js 代码为 request.mjs 并运行 node request.mjs。

  3. 03

    成功后在自己的后台用 OpenID 关联业务会话,session_key 仅留服务端;本例脚本不实现完整业务会话系统。

调用 01

交换登录凭证

服务端构造编码后的查询参数,不向客户端暴露密钥;代码只输出必要身份信息。

GEThttps://api.weixin.qq.com/sns/jscode2session?appid=${WX_MINI_APP_ID}&secret=${WX_MINI_APP_SECRET}&js_code=${WX_MINI_LOGIN_CODE}&grant_type=authorization_code

参数说明

参数表可左右滑动,查看完整说明。

字段 / 位置类型 / 必填说明
appidQuerystring必填当前小程序 AppID。
secretQuerystring必填同一小程序 AppSecret,仅服务端使用。
js_codeQuerystring必填wx.login 返回的一次性 code。
grant_typeQuerystring必填固定 authorization_code。

调用代码

替换示例 ID 与请求体内容后运行。

Node.js
// Node.js 22+,保存为 request.mjs,环境变量在同一终端设置。
const required = name => {
  const value = process.env[name];
  if (!value) throw new Error('缺少环境变量 ' + name);
  return value;
};
async function request(url, body) {
  const response = await fetch(url, {
    method: body === undefined ? 'GET' : 'POST',
    headers: { 'Content-Type': 'application/json' },
    ...(body === undefined ? {} : { body: JSON.stringify(body) }),
    redirect: 'error', signal: AbortSignal.timeout(20000),
  });
  const raw = await response.text();
  if (!response.ok) throw new Error('HTTP ' + response.status);
  let result;
  try { result = JSON.parse(raw); } catch { throw new Error('平台未返回有效 JSON'); }
  if (!result || typeof result !== 'object' || Array.isArray(result)) throw new Error('响应结构不正确');
  if (Object.hasOwn(result, 'errcode') && result.errcode !== 0) {
    throw new Error('微信业务错误 ' + result.errcode + ': ' + (result.errmsg || ''));
  }
  return result;
}
const url = new URL('https://api.weixin.qq.com/sns/jscode2session');
url.search = new URLSearchParams({
  appid: required('WX_MINI_APP_ID'), secret: required('WX_MINI_APP_SECRET'),
  js_code: required('WX_MINI_LOGIN_CODE'), grant_type: 'authorization_code',
}).toString();
const result = await request(url);
if (!result.openid || !result.session_key) throw new Error('响应缺少登录身份或会话密钥');
// session_key 只留服务端,不返回小程序,也不输出到日志。
// 正式服务把它与自己的业务会话关联,给前端返回自己的登录态。
console.log(JSON.stringify({ openid: result.openid,
  ...(result.unionid ? { unionid: result.unionid } : {}),
  session_key_received: true }, null, 2));

返回示例

虚构结构示意,非实测。unionid 仅在绑定等条件满足时返回,不保证存在。 以下为结构示意,非本站实测结果。

JSON
{
  "openid": "OPENID_EXAMPLE",
  "session_key": "BASE64_SESSION_KEY_EXAMPLE",
  "unionid": "OPTIONAL_UNIONID_EXAMPLE"
}

常见错误与排查

40029code 无效、过期或已消费。
重新在同一小程序调用 wx.login,避免重放旧 code。
40226登录被平台风控拦截。
按官方诊断流程检查,不通过重复请求绕过。
40013 / 40125账号或密钥不正确。
核对小程序 AppID、AppSecret 与账号类型,避免混用公众号凭证。
45009 / 45011日配额或调用频率受限。
按官方后台额度控制请求,不重复强制刷新或无限重试。

调用注意

  • 不要缓存登录 code 重复兑换,不把 session_key 下发到客户端或写入业务日志。

注意事项

  • OpenID 属于当前小程序,不能拿其他小程序的标识代替。
  • 服务端自定义登录态、过期与撤销由自己的应用实现,本页仅演示微信接口调用。

核验来源

本站按官方资料整理本场景的必要调用步骤与代码,覆盖范围以本页列出的接口为准。官方资料用于追溯规范及查看变更。

  1. 01
    登录流程与 session_key 边界核验日期 2026-10-15
  2. 02
    code2Session 参数及错误码核验日期 2026-10-15

微信小程序的其他调用手册

← 返回微信小程序的全部功能