例如:在進行使用者綁定時,我們需要輸入使用者的相關訊息,例如:使用者名稱、密碼,或姓名、電話號碼,服務端驗證通過,即可將系統用戶與微信用戶綁定。
然後,此微信帳戶就有一定的功能權限了,可以查積分,消費記錄等。服務號碼:招商銀行信用卡,就有很多功能。
微信客戶端無法快取訊息,且輸入訊息有限,需要進行多次要求,在服務端保存目前會話狀態。這就需要Session。
本文以使用者認證,綁定帳號為例,來說明具體處理。
為了更好的說明原理,方便擴展,我們來自己設計Session。當然,這裡也可以使用System.Web.SessionState.HttpSessionState,這是Web常用的Session機制。
用於儲存會話片段以及相關資料。
class Session { /// <summary> /// 缓存hashtable /// </summary> private static Hashtable mDic = new Hashtable(); /// <summary> /// 添加 /// </summary> /// <param name="key">key</param> /// <param name="value">value</param> public static void Add(string key, object value) { mDic[key] = value; } /// <summary> /// 移除 /// </summary> /// <param name="key">key</param> public static void Remove(string key) { if (Contains(key)) { mDic.Remove(key); } } /// <summary> /// 设置值 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public static void Set(string key, object value) { mDic[key] = value; } /// <summary> /// 获取值 /// </summary> /// <param name="key"></param> /// <returns></returns> public static object Get(string key) { return mDic[key]; } /// <summary> /// 是否含有 /// </summary> /// <param name="key">key</param> /// <returns>bool</returns> public static bool Contains(string key) { return mDic.ContainsKey(key); } /// <summary> /// 清空所有项 /// </summary> public static void Clear() { mDic.Clear(); } }
#記錄特定的操作類型,識別目前會話的特定操作
/// <summary> /// 操作类型 /// </summary> enum Operation { /// <summary> /// 认证 /// </summary> Auth, /// <summary> /// 添加用户 /// </summary> CreateUser }
用於識別目前操作,處於哪一個階段,不同階段做不同的處理。
/// <summary> /// 操作过程 /// </summary> enum OperationStage { /// <summary> /// 默认 /// </summary> Default, /// <summary> /// 第一步 /// </summary> First, /// <summary> /// 第二步 /// </summary> Second, /// <summary> /// 第三步 /// </summary> Third }
快取記錄的項,這裡面記錄了操作類型、操作步驟以及會話物件。為了方便進行Session管理,也增加了最後造訪時間,是否自動清除標識。
class SessionItem { /// <summary> /// 操作类型 /// </summary> public Operation Oper { get; set; } /// <summary> /// 当前步骤 /// </summary> public OperationStage Stage { get; set; } /// <summary> /// 数据对象 /// </summary> public object Data { get; set; } /// <summary> /// 是否自动删除 /// </summary> public bool AutoRemove { get; set; } /// <summary> /// 最后更新时间 /// </summary> public DateTime UpdateTime { get; set; } }
這個對象,記錄使用者在會話過程中,錄入的相關資訊。也是作為業務處理資料提供對象。
class AuthSessionItem { /// <summary> /// 用户名 /// </summary> public string FromUserName { get; set; } /// <summary> /// 账号 /// </summary> public string Code { get; set; } /// <summary> /// 唯一标识 /// </summary> public string ID { get; set; } }
1)開始進入認證,根據認證關鍵字進行標識,啟動會話,並快取相關資料
2)提示錄入個人帳號資訊
3)微信使用者輸入個人帳號,服務端記錄帳號訊息,並提示錄入員工卡號
# 4)微信使用者輸入卡號訊息,服務端記錄卡片訊息,並呼叫特定的認證邏輯
#5)使用者認證通過,綁定微信OpenId,提示成功綁定訊息,並清除會話。
在認證過程中,需要對使用者輸入資訊進行合法性驗證,而且在會話過程中,支援使用者退出目前操作。
/// <summary> /// 认证用户信息 /// </summary> /// <param name="tm"></param> /// <returns></returns> private bool Auth(TextMessage tm, ref string response) { SessionItem sessionItem = null; if (string.Equals(tm.Content, "Auth", StringComparison.OrdinalIgnoreCase)) { //检查是否已经认证,业务组件验证 if (UserManager.IsAuth(tm.FromUserName)) { //如果已经认证,提示 tm.Content = "您已经认证过了,无需再次认证!"; } else { AuthSessionItem authSessionItem = new AuthSessionItem(); authSessionItem.FromUserName = tm.FromUserName; sessionItem.Oper = Operation.Auth; sessionItem.Stage = OperationStage.First; sessionItem.Data = authSessionItem; Session.Set(tm.FromUserName, sessionItem); //输入账号,并将数据和步骤,写入缓存 tm.Content = "请输入您的个人账号"; } response = ResponseText(tm); return false; } //从Session获取用户信息 sessionItem = Session.Get(tm.FromUserName) as SessionItem; //如果会话存在,且当前操作为用户认证 if (sessionItem != null && sessionItem.Oper == Operation.Auth) { if (sessionItem.Stage == OperationStage.First) { tm.Content = tm.Content.Trim(); if (string.IsNullOrEmpty(tm.Content) || tm.Content.Length > 20) { tm.Content = "输入的个人账号不合法,请重新输入。"; response = ResponseText(tm); return false; } AuthSessionItem authSessionItem = sessionItem.Data as AuthSessionItem; if (authSessionItem != null) { authSessionItem.Code = tm.Content; } //更新缓存 sessionItem.Stage = OperationStage.Second; Session.Set(tm.FromUserName, sessionItem); tm.Content = "请输入您的员工卡号!\n退出认证请输入Exit。"; response = ResponseText(tm); } else if (sessionItem.Stage == OperationStage.Second) { string cardNum = null; if (!Common.TryConvertToCardNum(tm.Content, out cardNum)) { tm.Content = "员工卡号不合法,请重新输入。\n退出认证请输入Exit。"; response = ResponseText(tm); return false; } AuthSessionItem authSessionItem = sessionItem.Data as AuthSessionItem; if (authSessionItem != null) { authSessionItem.ID = cardNum; } //认证 string message; if (UserManager.Authenticate(authSessionItem, out message)) { tm.Content = "祝贺您,已经认证成功,可以使用通讯录的查询功能呢。"; //清理缓存 Session.Remove(tm.FromUserName); response = ResponseText(tm); return true; } else if (!string.IsNullOrEmpty(message)) { tm.Content = message; } else { tm.Content = "您输入的信息有误。\n重新认证请输入:Auth!"; } //过程结束:清理Session Session.Remove(tm.FromUserName); response = ResponseText(tm); return false; } } return false; }
在認證過程中,使用者可以通過命令,強制退出當前操作,在退出當前操作時,需要清理會話資訊。
/// <summary> /// 退出,并清理Session /// </summary> /// <param name="tm"></param> /// <param name="response"></param> /// <returns></returns> private bool Exit(TextMessage tm, ref string response) { //退出 if (string.Equals(tm.Content, "Exit", StringComparison.OrdinalIgnoreCase)) { //清除Session Session.Remove(tm.FromUserName); tm.Content = "您已退出当前操作,请执行其他操作。"; response = ResponseText(tm); return true; } return false; }
用戶認證通過,並綁定微信OpenId,透過OpenId即可查詢通訊錄、查詢個人積分以及消費記錄等操作了。使用者認證是一個身分認證過程,也是一個使用者綁定過程。使用者身分認證通過,即可透過微信帳號查詢具體資訊了。這時候業務層可以根據微信分配的OpenId直接查詢用戶相關資訊。
透過這種方法,公眾帳號,可以透過小小的文字輸入框,實現更多、更複雜的業務應用。當然,還是透過提供網頁來進行資訊輸入,更直觀便捷。
更多微信大眾平台開發Session處理相關文章請關注PHP中文網!