項目同時支援 PC 端與微信端,要求「一套賬號,雙端互通」:無論在哪端註冊,另一端均可直接登入。核心挑戰在於建立 PC 端匿名會話與微信 OpenID 的可信綁定。本文提出**掃碼攜帶唯一授權碼**方案,通過輪詢實現無感綁定,附完整 C# MVC + EF 實現代碼與數據庫設計。
微信 OpenID 對應公眾號/開放平台下的唯一用戶,天然具備「身份證」屬性。關鍵在於**如何在 PC 端獲取用戶 OpenID**。
uuid(授權碼),構造微信授權鏈接 https://.../loginfor?uuid=xxx,生成二維碼Loginfor Action,攜帶 uuid (state 參數) 與 openidopenid 與 uuid 寫入用戶表UserLogin(uuid) API,檢測到綁定成功 → 寫入 Cookie 完成登入public ActionResult Login() {
if (User.Identity.IsAuthenticated) return RedirectToAction("Index", "Home");
string uuid = Guid.NewGuid().ToString();
string url = $"https://{Request.Url.Host}/home/loginfor?uuid={uuid}";
ViewBag.QrUrl = url;
ViewBag.Uuid = uuid;
return View();
}
// 前端:jquery.qrcode.js 生成二維碼 (IE 相容指定 render: "table")
$('#qrcode').qrcode({ render: "table", text: "@ViewBag.QrUrl" });
// 輪詢綁定狀態
setInterval(() => {
$.post("@Url.Action("UserLogin")", { uuid: "@ViewBag.Uuid" }, (data) => {
if (data === "success") location.href = '@Url.Action("Index", "Home")';
});
}, 200);
public string UserLogin(string uuid) {
if (string.IsNullOrEmpty(uuid)) return "param_error";
var user = db.WX_UserRecord.FirstOrDefault(u => u.uuId == uuid);
if (user == null) return "not_authcode";
// 綁定成功:寫入認證 Cookie,清空 uuid 防重複使用
FormsAuthentication.SetAuthCookie(user.OpenId, false);
user.uuId = null;
db.SaveChanges();
return "success";
}
public ActionResult Loginfor(string uuid) {
// 1. 獲取微信用戶信息 (snsapi_userinfo)
var wx = new WechatUserContext(HttpContext.Current, uuid);
wx.GetUserInfo();
if (string.IsNullOrEmpty(wx.openid)) return View();
// 2. 查找或創建用戶記錄
var user = db.WX_UserRecord.FirstOrDefault(u => u.OpenId == wx.openid);
if (user == null) {
user = new WX_UserRecord {
OpenId = wx.openid,
Nickname = wx.nickname,
HeadImgUrl = wx.headimgurl,
Sex = wx.sex,
Province = wx.province,
City = wx.city,
Country = wx.country,
Unionid = wx.unionid,
CreateTime = DateTime.Now
};
db.WX_UserRecord.Add(user);
}
// 3. 關鍵:將 uuid 寫入用戶記錄,完成 PC 會話與 OpenID 綁定
user.uuId = uuid;
db.SaveChanges();
return View();
}
CREATE TABLE WX_UserRecord (
Id INT PRIMARY KEY IDENTITY,
OpenId NVARCHAR(100) NOT NULL UNIQUE, -- 微信唯一標識
Unionid NVARCHAR(100), -- 開放平台統一標識
Nickname NVARCHAR(100),
HeadImgUrl NVARCHAR(500),
Sex INT,
Province NVARCHAR(50),
City NVARCHAR(50),
Country NVARCHAR(50),
CreateTime DATETIME,
uuId NVARCHAR(50) NULL -- 掃碼授權碼,綁定後清空
);
uuid 一次性使用,綁定後立即清空,防重放uuid 並重新生成二維碼(建議 2 分鐘)openid,前端輪詢超時提示重試NVARCHAR,讀寫指定 UTF-8此方案已在多個生產項目穩定運行,是 PC 端接入微信生態的標準化最佳實踐。