1. 微信扫码登录技术方案选型
在实现网站微信扫码登录功能时,我们主要面临两种技术方案的选择:
- 基于公众号消息推送的方案:需要用户关注公众号,通过消息事件触发登录流程
- 基于开放平台网站应用的方案:使用OAuth2.0协议,直接通过扫码完成授权
我们最终选择了第二种方案,主要基于以下考虑:
- 用户体验更优:用户无需关注公众号即可完成登录
- 技术实现更简洁:不需要处理复杂的消息推送逻辑
- 企业级支持:更适合需要正式审核的企业应用场景
- 无功能冲突:不会与公众号已有的关键词回复功能产生冲突
提示:如果您的应用场景需要更轻量级的实现,且用户群体已经关注了公众号,可以考虑使用基于消息推送的方案。但对于大多数网站应用,OAuth2.0方案是更优选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发前准备工作
2.1 账号申请与配置
2.1.1 开放平台账号注册
- 访问微信开放平台
- 使用企业资质完成注册(个人开发者无法申请网站应用)
- 等待1-7个工作日的审核期
2.1.2 创建网站应用
-
登录开放平台后,进入"管理中心"
-
选择"网站应用"→"创建网站应用"
-
填写应用基本信息:
- 应用名称:您的网站名称
- 应用简介:简要描述您的网站功能
- 网站域名:填写您的主域名和必要的子域名
- 授权回调域:设置您的回调域名(如:yourdomain.com)
-
提交审核并等待通过
2.1.3 获取AppID和AppSecret
审核通过后,在应用详情页可以获取到:
- AppID:应用唯一标识
- AppSecret:应用密钥(需妥善保管)
2.2 服务器环境准备
建议的服务器配置:
- 操作系统:Linux (推荐Ubuntu 20.04+)
- Web服务器:Nginx 1.18+
- 数据库:MySQL 8.0 或 PostgreSQL 13+
- 编程语言:Golang 1.18+
2.3 数据库设计
我们需要设计三张核心表来支持微信扫码登录功能:
2.3.1 用户表(users)
sql复制CREATE TABLE `users` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL,
`nickname` varchar(50) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`status` varchar(20) NOT NULL DEFAULT 'active',
`login_type` varchar(20) NOT NULL DEFAULT 'account',
`last_login_at` datetime DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
UNIQUE KEY `idx_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
关键字段说明:
login_type:标识用户是通过账号密码(account)还是微信(wechat)登录status:用户状态,active/disabled
2.3.2 微信绑定表(wechat_bindings)
sql复制CREATE TABLE `wechat_bindings` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint unsigned NOT NULL,
`open_id` varchar(100) NOT NULL,
`union_id` varchar(100) DEFAULT NULL,
`nickname` varchar(100) DEFAULT NULL,
`avatar` varchar(500) DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_open_id` (`open_id`),
UNIQUE KEY `uk_user_id` (`user_id`),
KEY `i
