微信登录:能不碰就不碰
微信登录方式多、坑多、成本不透明。先搞清楚什么情况必须用它,什么情况应该绕开。
我见过太多独立开发者在微信登录上浪费了一两周,最后发现自己的场景根本不合适。
这篇先把结论给你——什么情况下放心用,什么情况下赶紧绕道——再讲具体怎么做。
先说结论
默认选择:手机号验证码登录
如果你是做网站、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.onLaunch 或 App.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 登录,体验上也差一些。
后端需要准备三个接口:
POST /api/auth/miniprogram-login— 小程序wx.login()的 code 换 openidPOST /api/auth/create-ticket— 生成登录 ticket,返回小程序码图片POST /api/auth/confirm-login— 小程序确认页调用,标记 ticket 已认证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 打通。