微信登录:能不碰就不碰

微信登录方式多、坑多、成本不透明。先搞清楚什么情况必须用它,什么情况应该绕开。

我见过太多独立开发者在微信登录上浪费了一两周,最后发现自己的场景根本不合适。

这篇先把结论给你——什么情况下放心用,什么情况下赶紧绕道——再讲具体怎么做。

先说结论

默认选择:手机号验证码登录

如果你是做网站、App、H5,从手机号+验证码登录开始,这是通用性最强、接入成本最低的方案。

  • 用户只要有一部手机就能用
  • 不限平台、不限浏览器
  • 不需要申请任何资质
  • 小程序、网站、App 全端通用
  • 一个手机号就能把各端的用户统一起来

很多开发者被"微信登录"这个名字迷惑了,觉得微信登录用户更方便。真相是:微信登录在大多数场景下,开发者比用户麻烦得多。

小程序内登录:放心用

小程序是唯一推荐直接用微信登录的场景。小程序基础库直接提供 wx.login() 接口,不需要额外资质,体验流畅。

小程序码统一登录:跨平台首选

如果你的产品同时有网站、H5、App 还想接入微信登录,最佳方案不是申请开放平台,而是用小程序的二维码作为统一入口

思路很简单:你只有一个小程序,所有外部平台(网站、H5、App)的微信登录,最终都跳转到这个小程序里完成确认。开发者也只需要维护一套登录逻辑。

  • 不需要微信开放平台的网站应用或移动应用
  • 不需要服务号
  • 只需要一个小程序
  • 小程序以后还能发模板消息、做客服

需要开放平台的场景:等产品上线了再说

开放平台只有一种场景真正需要:你要在小程序和网站/App 之间打通 UNIONID,让系统识别出是同一个用户。这个需求在 MVP 阶段几乎不存在,等产品上线了再补都来得及。

各个方案的成本对比

方案一:小程序内 wx.login() 原生登录

项目说明
费用免费
资质有小程序账号即可(个人主体也能用)
体验最好,静默授权或弹窗确认
接入一天内可完成
结论推荐使用

这是最简单的方案。调用 wx.login() 获取 code,传给后端换取 openid,就完成了识别。如果需要在微信生态内绑定手机号,用 <button open-type="getPhoneNumber"> 组件,用户点击确认即可拿到加密手机号。

方案二:小程序码统一登录(网站/H5/App → 小程序确认)

这是一个被低估但非常实用的方案。你在网站或 App 上展示一个小程序码,用户扫码后直接打开你的小程序,在小程序里点一下"确认登录",网站这边就登录成功了。

项目说明
费用免费
资质非个人主体小程序(企业/个体户)
体验中等,需要扫码后跳转小程序确认
接入1 周左右
跨端能力网站/H5/App 全支持
结论跨平台微信登录的首选方案

技术流程

网站展示小程序码 → 用户用微信扫码 → 打开小程序确认页
→ 用户点击"确认登录" → 小程序上报服务端 → 网站轮询到结果 → 登录成功

具体实现

后端先生成一个登录会话 ID(比如一个临时 ticket),调微信的 wxacode.getUnlimited 接口把 ticket 编入 scene 参数,拿到一张小程序码图片,交给前端展示。

POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
Body: { "scene": "login_ticket_abc123", "page": "pages/login/confirm" }

scene 参数最长 32 字节(可见字符),存放登录凭据足够了。

小程序端在 App.onLaunchApp.onShow 中读取 scene:

App({
  onLaunch(options) {
    // 从 scene 参数中拿到登录 ticket
    const scene = decodeURIComponent(options.query.scene || '')
    // scene = "login_ticket_abc123"
    // 将 ticket 存入全局或页面,等待用户确认
  }
})

小程序显示确认页,用户点击"确认登录"后,小程序调用你的后端 API 绑定登录态,后端标记 ticket 对应的登录会话为已认证。网站端轮询或通过 WebSocket 收到通知后,完成登录跳转。

H5 场景下的简化方案

如果用户是在手机上访问 H5 页面,还可以直接用 URL Link 省掉扫码的步骤。H5 页面放一个"微信登录"按钮,点击后通过 URL Link 直接拉起微信打开你的小程序:

https://wxaurl.cn/TICKET?cq=CUSTOM_PARAMS

用户点击 → 跳转微信 → 打开小程序确认页 → 确认登录 → 返回 H5。

URL Link 也有额度:每天生成上限 50 万次(含加密 URL Scheme),打开次数上限 600 万次/天。对于 MVP 阶段完全够用。注意需要非个人主体小程序才能使用。

方案三:开放平台网站扫码登录(传统方案)

项目说明
费用300 元/年(开放平台认证费)
资质微信开放平台 + 网站应用审核
体验一般,用户需要掏出手机扫码
接入1-2 周
需要 ICP 备案
结论不推荐,除非需要 UNIONID 打通

这是最传统的方案。网页展示微信二维码,用户掏出手机扫一扫,在手机上确认,网页登录成功。

问题在于:你需要微信开放平台账号(不是公众号,不是小程序,是另一个平台),每年 300 元认证费。而且网站应用审核需要 ICP 备案号,很多早期项目压根没有备案。

方案四:服务号 H5 授权登录

项目说明
费用300 元/年(服务号认证费)
资质微信服务号(订阅号不行,需要认证)
体验好,微信内点击按钮 → 跳转授权页 → 确认 → 跳回
适用范围仅限微信浏览器内
结论只适用于在微信群里传播的 H5

具体流程:用户在微信里打开你的 H5 页面 → 点击"微信登录"按钮 → 跳转到微信官方的 OAuth 授权页(显示你的服务号名称和头像,以及"xxx将获得以下权限") → 用户点击"同意" → 微信带着 code 参数跳回你的 H5 → 你的后端用 code 换 access_token 和用户信息。

这个流程在微信内体验是顺畅的——用户本来就打开着微信,点击跳转授权页没什么阻力。但一旦脱离微信浏览器(普通浏览器、App WebView),这个方法完全废掉。

方案五:App 微信登录

项目说明
费用300 元/年(开放平台认证费,且与网站应用的费用各自独立
资质微信开放平台 + 移动应用单独审核
体验好,拉起微信 App 授权
接入1-2 周(含审核)
结论绕不开,需要就老实申请

这里必须说清楚开放平台有多蛋疼:微信开放平台下面,网站应用移动应用是两种独立的应用类型,需要各自单独注册、单独审核。你不能说"我已经注册了网站应用,再给 App 加个微信登录",不行的,你得在开放平台上再创建一个移动应用,重新走一遍审核。而且认证费是各算各的。

传统的 App 微信登录流程:你的 App 调起 WeChat SDK → 用户跳转到微信确认授权 → 授权完成自动跳回 App。

之前提到用 URL Scheme 拉起小程序来绕过——这个在实践中不太靠谱。因为:

  • 要判断用户是否安装了微信,仍然需要 WeChat SDK
  • 即使只用 URL Scheme,也需要先在开放平台注册移动应用拿到 AppID,才能让微信识别你的 App
  • 大部分手机对 URL Scheme 的跳转有各种限制,成功率不可控

所以 App 要接入微信登录,基本绕不开开放平台的移动应用注册。

接入方式

如果你已经决定了要用微信登录,下面几种做法供你参考。

方式一:小程序原生 + 小程序码统一登录(推荐)

这是上面方案一和方案二的组合:

  • 小程序内:直接用 wx.login() 获取 code,传给后端换取 openid
  • 网站/PC:展示小程序码,用户扫码后进入小程序确认页完成登录
  • H5 移动端:用 URL Link 直接跳转小程序,免扫码
  • App 内:如果 App 内嵌了 WebView,可以在 WebView 里展示小程序码,用户截图到微信扫码完成登录。或者通过 URL Scheme 拉起小程序。但注意——这不能完全取代 App 原生的微信 SDK 登录,体验上也差一些。

后端需要准备三个接口:

  1. POST /api/auth/miniprogram-login — 小程序 wx.login() 的 code 换 openid
  2. POST /api/auth/create-ticket — 生成登录 ticket,返回小程序码图片
  3. POST /api/auth/confirm-login — 小程序确认页调用,标记 ticket 已认证
  4. GET /api/auth/poll-login?ticket=xxx — 网站轮询接口,查询 ticket 状态

方式二:腾讯云开发(CloudBase)集成

腾讯云开发(CloudBase)提供了整合的登录授权服务,能省去很多对接微信接口的复杂工作。它帮你处理 OAuth 跳转流程、AccessToken 管理、用户身份映射到统一 UID。

网站/PC 扫码登录

import cloudbase from '@cloudbase/js-sdk';

const app = cloudbase.init({ env: 'your-env-id' });
const auth = app.auth();

const { data, error } = await auth.signInWithOAuth({
  provider: 'wechat'
});

SDK 会自动展示微信二维码,用户扫码后在手机上确认,网页端自动完成登录。

H5 微信内授权登录:代码和上面完全一样。SDK 会自动判断环境——在微信浏览器内跳转授权页,在普通浏览器里降级为扫码模式。

但注意 CloudBase 的 OAuth 登录仍然需要你在开放平台配置应用,它只是封装了前端的交互逻辑。

方式三:原生微信 API(不依赖云服务)

直接接微信官方 API。成本最低,但你得自己处理:

  • 维护 AccessToken 刷新
  • 处理 code 换 session_key 的后端逻辑
  • 管理 session 和续期

小程序原生wx.login() → code → 后端 code2Session 接口换取 openid。

网站原生:通过开放平台 OAuth 2.0,构造 https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=...,或用 JS 内嵌二维码。

开放平台到底有多蛋疼

微信开放平台可能是微信生态里最 confusing 的产品。做一次你就明白了:

开放平台下各应用类型是彼此独立的。

你在开放平台注册了一个网站应用,这只代表你的网站能调微信登录。如果你想在 App 里加微信登录,需要再注册一个移动应用,重新提交资料重新审核。认证费各算各的,网站应用 300 元/年,移动应用 300 元/年。

应用类型用于是否独立审核
网站应用PC 网页微信扫码登录是,需要 ICP 备案
移动应用iOS/Android App 微信登录是,需要软著或应用商店截图
小程序不需要通过开放平台注册走小程序自己的流程
公众号不需要通过开放平台注册走公众号自己的流程

小程序和公众号不需要通过开放平台注册,它们有自己的注册流程。开放平台主要是用来把各种应用绑定在一起,产生 UNIONID。

所以最蛋疼的场景是:你已经做了小程序(免费、好用),再加一个网站想用微信登录,你发现小程序码登录用得好好的,但为了"官方方案"你要额外注册开放平台网站应用,交 300 元/年,提交 ICP 备案号…… 这就是为什么我说小程序码统一登录比开放平台方案更实用。

关于 UNIONID

如果你同时有小程序、公众号、网站,想让用户在所有端用一个账号,需要 UNIONID。

UNIONID 是微信同一主体下不同应用的统一标识。条件是各应用在微信开放平台绑定在同一个账号下。

没绑定的话,同一个用户在你的小程序和公众号里会有两个不同的 OPENID,需要用户手动关联。MVP 阶段不需要纠结这个,先让用户能用起来再说。

两个常见误区

误区一:微信登录 = 微信支付

能接入微信登录不代表能自动开通微信支付。微信支付商户是另一套申请体系,需要企业资质或个体工商户。

误区二:小程序登录不需要开放平台

小程序登录本身不需要开放平台。但如果你想打通小程序和网站的用户数据,就需要开放平台绑定应用获取 UNIONID。

我的最终建议

放在一起比较:

需求推荐方案年费复杂度
只要小程序wx.login() 原生登录免费
网站/H5 也要微信登录小程序码统一登录免费
App 要微信登录开放平台移动应用注册(官方)+ 小程序码兜底300元
微信内 H5 页面服务号网页授权300元
需要 UNIONID 打通开放平台绑定所有应用 + 小程序码登录300元起
还没想清楚手机号验证码登录最低最低

MVP 阶段的最佳路径:手机号验证码登录 → 用户量上来后 → 补一个微信登录入口(小程序码方案)→ 再往后才考虑 UNIONID 打通

微信支付是另一回事,看这篇:支付接入。技术栈选择看:技术栈选择指南