微信登录:能不碰就不碰
微信登录方式多、坑多、成本不透明。先搞清楚什么情况必须用它,什么情况应该绕开。
微信登录的麻烦不在技术——每一套方案单看都不难。麻烦的是有六七种方案,各自适用场景、资质要求、年费都不一样。选错了一个月后发现走不通,得回头重来。
默认选择:手机号验证码登录
除非确定必须走微信,否则从手机号+验证码开始。通用性最强:
- 用户只要有一部手机
- 不限平台、不限浏览器
- 不需要申请任何资质
- 小程序、网站、App 全端通用
- 一个手机号就能把各端用户统一
很多场景里,微信登录是开发者比用户麻烦得多。用户端无非多输一次验证码,开发者要配开放平台、等审核、处理兼容问题。
方案一:小程序内 wx.login() 原生登录
| 项目 | 说明 |
|---|---|
| 费用 | 免费 |
| 资质 | 有小程序账号即可(个人主体也能用) |
| 体验 | 最好,静默授权或弹窗确认 |
| 接入 | 一天内可完成 |
| 结论 | 推荐使用 |
调用 wx.login() 获取 code,传给后端换 openid。需要绑定手机号就用 <button open-type="getPhoneNumber">。
唯一前提:你得有小程序。
方案二:小程序码统一登录(网站/H5/App → 小程序确认)
网站和 App 也要接微信登录时,大部分人第一反应是去申请开放平台。但有一替代方案:用小程序作为统一入口。
网站或 App 展示小程序码 → 用户扫码 → 打开小程序确认页 → 点"确认登录" → 网站登录成功。所有外部平台的微信登录都跳转到小程序完成。
| 项目 | 说明 |
|---|---|
| 费用 | 免费 |
| 资质 | 非个人主体小程序(企业/个体户) |
| 体验 | 中等,需要扫码后跳转小程序确认 |
| 接入 | 1 周左右 |
| 跨端能力 | 网站/H5/App 全支持 |
| 结论 | 跨平台微信登录的首选方案 |
流程:
网站展示小程序码 → 用户微信扫码 → 打开小程序确认页
→ 用户点击"确认登录" → 小程序上报服务端 → 网站轮询到结果 → 登录成功后端生成登录 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 字节。小程序端在 onLaunch / onShow 中读取:
App({
onLaunch(options) {
const scene = decodeURIComponent(options.query.scene || '')
}
})H5 URL Link 简化
移动端 H5 可以用 URL Link 省掉扫码:
https://wxaurl.cn/TICKET?cq=CUSTOM_PARAMS点击直接拉起微信打开小程序确认页。每天生成上限 50 万次、打开上限 600 万次。需要非个人主体小程序。
方案三:开放平台网站扫码登录(传统方案)
| 项目 | 说明 |
|---|---|
| 费用 | 300 元/年(开放平台认证费) |
| 资质 | 微信开放平台 + 网站应用审核 |
| 体验 | 一般,用户需要掏出手机扫码 |
| 接入 | 1-2 周 |
| 需要 ICP 备案 | 是 |
| 结论 | 不推荐,除非需要 UNIONID 打通 |
网页展示微信二维码,用户扫码确认。需要微信开放平台账号,每年 300 元,网站应用还要 ICP 备案号。早期项目很可能没有备案。
功能上方案二(小程序码登录)等价且免费、免备案。
方案四:服务号 H5 授权登录
| 项目 | 说明 |
|---|---|
| 费用 | 300 元/年(服务号认证费) |
| 资质 | 微信服务号(订阅号不行,要认证) |
| 体验 | 好,微信内点击→跳转授权页→确认→跳回 |
| 适用范围 | 仅限微信浏览器内 |
| 结论 | 只适用于在微信群里传播的 H5 |
流程:微信内打开 H5 → 点"微信登录" → 跳 OAuth 授权页 → 用户同意 → 微信带 code 跳回 → 后端换 access_token。
在微信内体验顺畅,出了微信浏览器就废。
方案五:App 微信登录
| 项目 | 说明 |
|---|---|
| 费用 | 300 元/年(开放平台认证费,和网站应用各自独立) |
| 资质 | 微信开放平台 + 移动应用单独审核 |
| 体验 | 好,拉起微信 App 授权 |
| 接入 | 1-2 周(含审核) |
| 结论 | 绕不开,需要就老实申请 |
开放平台下网站应用和移动应用是独立的应用类型,各自注册、各自审核、各自缴费。
| 应用类型 | 用于 | 是否独立审核 |
|---|---|---|
| 网站应用 | PC 网页微信扫码登录 | 是,需要 ICP 备案 |
| 移动应用 | iOS/Android App 微信登录 | 是,需要软著或应用商店截图 |
| 小程序 | 不需要通过开放平台注册 | 走小程序自己的流程 |
| 公众号 | 不需要通过开放平台注册 | 走公众号自己的流程 |
URL Scheme 拉起小程序绕过开放平台的方式不太可靠:
- 判断用户是否装了微信仍需要 WeChat SDK
- 只用 URL Scheme 仍需要在开放平台注册移动应用拿 AppID
- 各厂商对 URL Scheme 的限制越来越多
App 接微信登录基本绕不开开放平台。
接入方式
方式一:小程序原生 + 小程序码统一登录(推荐)
方案一和方案二的组合:
- 小程序内:
wx.login()→ code → openid - 网站/PC:展示小程序码,用户扫码进小程序确认
- H5 移动端:URL Link 直接跳小程序
- App 内:WebView 展示小程序码,用户截图到微信扫码
后端四个接口:
POST /api/auth/miniprogram-login— 小程序 code 换 openidPOST /api/auth/create-ticket— 生成登录 ticket,返回小程序码图片POST /api/auth/confirm-login— 小程序确认页调用来标记 ticket 已认证GET /api/auth/poll-login?ticket=xxx— 网站轮询 ticket 状态
方式二:腾讯云开发(CloudBase)集成
封装了 OAuth 跳转、AccessToken 管理、用户身份映射:
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 自动判断环境——微信浏览器内跳授权页,普通浏览器降级为扫码。
注意:底层仍需要开放平台配置,资质门槛没少。只封装了前端交互。
方式三:原生微信 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=...
UNIONID
小程序和网站(或 App)要识别出同一用户,需要 UNIONID。前提是各应用在微信开放平台绑定在同一账号下。
没绑定的话,同一用户在不同端会有不同的 OPENID。MVP 阶段不需要纠结,上线后补都来得及。
两个常见误区
误区一:能接微信登录 = 能开通微信支付
两套体系。微信支付商户需要企业资质或个体工商户,另有一套申请流程。
误区二:小程序登录不需要开放平台
小程序登录本身不需要。但要打通小程序和网站的用户数据(UNIONID),就需要开放平台绑定应用。
总结
| 需求 | 推荐方案 | 年费 | 复杂度 |
|---|---|---|---|
| 只要小程序 | wx.login() 原生登录 | 免费 | 低 |
| 网站/H5 也要微信登录 | 小程序码统一登录 | 免费 | 中 |
| App 要微信登录 | 开放平台移动应用注册 + 小程序码兜底 | 300元 | 高 |
| 微信内 H5 页面 | 服务号网页授权 | 300元 | 低 |
| 需要 UNIONID 打通 | 开放平台绑定所有应用 + 小程序码登录 | 300元起 | 高 |
| 还没想清楚 | 手机号验证码登录 | 最低 | 最低 |
MVP 阶段路径:手机号验证码登录 → 用户量上来后补微信登录(小程序码方案)→ 再往后才考虑 UNIONID 打通。
这篇文档有问题?