1. UniApp微信登录统一方案概述
在移动应用开发中,多端统一登录一直是个棘手的问题。以微信生态为例,同一个用户在小程序、H5和APP中登录会获得不同的OpenID,这给用户管理和数据同步带来了巨大挑战。我在最近的一个电商项目中就遇到了这个问题:用户在小程序下单后,在APP端看不到订单记录,因为系统把ta识别成了两个不同用户。
微信开放平台提供的UnionID机制正是解决这个问题的金钥匙。UnionID是用户在同一个微信开放平台账号下的唯一标识,不受应用类型限制。通过它,我们可以实现真正的多端用户统一识别。下面我将分享一套经过实战检验的UniApp微信登录统一方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心概念解析
2.1 OpenID与UnionID的区别
OpenID是用户在单个应用中的唯一标识。比如:
- 小程序A中的OpenID:oX8Y5J...(唯一)
- 公众号B中的OpenID:oY7H3K...(唯一)
- APP C中的OpenID:oZ9M2N...(唯一)
UnionID则是用户在微信开放平台账号维度的唯一标识。只要这些应用都绑定到同一个开放平台账号下,无论用户通过哪个应用登录,获取到的UnionID都是相同的。
重要提示:获取UnionID的前提是所有应用(小程序、公众号、APP)必须绑定到同一个微信开放平台账号下,否则即使同一个微信用户,在不同平台账号下的UnionID也会不同。
2.2 多端登录流程对比
| 平台类型 | 授权方式 | 获取字段 | 接口调用 |
|---|---|---|---|
| 小程序 | wx.login() | code → openid, unionid | jscode2session |
| H5 | OAuth2.0跳转 | code → openid → unionid | 分两步:oauth2/access_token + userinfo |
| APP | 原生SDK授权 | code → openid, unionid | oauth2/access_token |
3. 系统架构设计
3.1 数据库设计
用户表(users)核心字段:
sql复制CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(64) NOT NULL COMMENT '系统统一用户ID',
`union_id` varchar(64) NOT NULL COMMENT '微信UnionID',
`nickname` varchar(100) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`status` tinyint DEFAULT '1' COMMENT '0-禁用 1-正常',
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_union_id` (`union_id`),
UNIQUE KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
微信绑定表(wechat_bindings):
sql复制CREATE TABLE `wechat_bindings` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(64) NOT NULL,
`platform` enum('miniprogram','h5','app') NOT NULL,
`open_id` varchar(64) NOT NULL,
`union_id` varchar(64) NOT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_platform_openid` (`platform`,`open_id`),
KEY `idx_union_id` (`union_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 服务端架构
code复制 +---------------+
| 客户端 |
| (UniApp) |
+-------┬-------+
