微信公众平台开发教程(八)Session处理

在微信窗口,输入的信息有限,我们需要将一些信息分多次请求。

比如:在进行用户绑定时,我们需要输入用户的相关信息,比如:用户名、密码,或者姓名、电话号码,服务端验证通过,即可将系统用户与微信用户绑定。

然后,此微信账户就有一定的功能权限了,可以查积分,消费记录等。服务号:招商银行信用卡,就有很多功能。

微信客户端无法缓存信息,而且输入信息有限,需要进行多次请求,在服务端保存当前会话状态。这就需要Session。

本文以用户认证,绑定账号为例,来说明具体处理。 

一、创建通用的Session处理机制。

为了更好的说明原理,便于扩展,我们来自己设计Session。当然,这里也可以使用System.Web.SessionState.HttpSessionState,这是Web常用的Session机制。

1、自定义Session

用于存储会话片段以及相关数据。

 1     class Session
 2     {
 3         /// <summary>
 4         /// 缓存hashtable
 5         /// </summary>
 6         private static Hashtable mDic = new Hashtable();
 7         /// <summary>
 8         /// 添加
 9         /// </summary>
10         /// <param name="key">key</param>
11         /// <param name="value">value</param>
12         public static void Add(string key, object value)
13         {
14             mDic[key] = value;
15         }
16         /// <summary>
17         /// 移除
18         /// </summary>
19         /// <param name="key">key</param>
20         public static void Remove(string key)
21         {
22             if (Contains(key))
23             {
24                 mDic.Remove(key);
25             }
26         }
27         /// <summary>
28         /// 设置值
29         /// </summary>
30         /// <param name="key"></param>
31         /// <param name="value"></param>
32         public static void Set(string key, object value)
33         {
34             mDic[key] = value;
35         }
36         /// <summary>
37         /// 获取值
38         /// </summary>
39         /// <param name="key"></param>
40         /// <returns></returns>
41         public static object Get(string key)
42         {
43             return mDic[key];
44         }
45         /// <summary>
46         /// 是否含有
47         /// </summary>
48         /// <param name="key">key</param>
49         /// <returns>bool</returns>
50         public static bool Contains(string key)
51         {
52             return mDic.ContainsKey(key);
53         }
54         /// <summary>
55         /// 清空所有项
56         /// </summary>
57         public static void Clear()
58         {
59             mDic.Clear();
60         }
61     }

 

2、操作类型

记录具体的操作类型,标识当前会话的具体操作

 1     /// <summary>
 2     /// 操作类型
 3     /// </summary>
 4     enum Operation
 5     {
 6         /// <summary>
 7         /// 认证
 8         /// </summary>
 9         Auth,
10         /// <summary>
11         /// 添加用户
12         /// </summary>
13         CreateUser
14     }

 

3、操作过程枚举

用于标识当前操作,处于哪一个阶段,不同阶段做不同的处理。

 1    /// <summary>
 2     /// 操作过程
 3     /// </summary>
 4     enum OperationStage
 5     {
 6         /// <summary>
 7         /// 默认
 8         /// </summary>
 9         Default,
10         /// <summary>
11         /// 第一步
12         /// </summary>
13         First,
14         /// <summary>
15         /// 第二步
16         /// </summary>
17         Second,
18         /// <summary>
19         /// 第三步
20         /// </summary>
21         Third
22     }

 

4、Session缓存项

缓存记录的项,这里面记录了操作类型、操作步骤以及会话对象。为了便于进行Session管理,还增加了最后访问时间,是否自动清除标识。

 1     class SessionItem
 2     {
 3         /// <summary>
 4         /// 操作类型
 5         /// </summary>
 6         public Operation Oper { get; set; }
 7         /// <summary>
 8         /// 当前步骤
 9         /// </summary>
10         public OperationStage Stage { get; set; }
11         /// <summary>
12         /// 数据对象
13         /// </summary>
14         public object Data { get; set; }
15         /// <summary>
16         /// 是否自动删除
17         /// </summary>
18         public bool AutoRemove
19         {
20             get;
21             set;
22         }
23         /// <summary>
24         /// 最后更新时间
25         /// </summary>
26         public DateTime UpdateTime { get; set; }
27     }

 

 

二、就要在消息处理中,加入Session处理。

1、增加缓存项数据对象

这个对象,记录用户在会话过程中,录入的相关信息。也是作为业务处理数据提供对象。

 1     class AuthSessionItem
 2     {
 3         /// <summary>
 4         /// 用户名
 5         /// </summary>
 6         public string FromUserName { get; set; }
 7         /// <summary>
 8         /// 账号
 9         /// </summary>
10         public string Code { get; set; }
11         /// <summary>
12         /// 唯一标识
13         /// </summary>
14         public string ID { get; set; }
15     }

 

 

2、认证处理过程

1)开始进入认证,根据认证关键字进行标识,启动会话,并缓存相关数据

2)提示录入个人账号信息

3)微信用户录入个人账号,服务端记录账号信息,并提示录入员工卡号

4)微信用户录入卡号信息,服务端记录卡号信息,并调用具体的认证逻辑

5)用户认证通过,绑定微信OpenId,提示成功绑定信息,并清除会话。

在认证过程中,需要对用户录入信息进行合法性验证,而且在会话过程中,支持用户退出当前操作。

  1         /// <summary>
  2         /// 认证用户信息
  3         /// </summary>
  4         /// <param name="tm"></param>
  5         /// <returns></returns>
  6         private bool Auth(TextMessage tm, ref string response)
  7         {
  8             SessionItem sessionItem = null;
  9             if (string.Equals(tm.Content, "Auth", StringComparison.OrdinalIgnoreCase))
 10             {
 11                 //检查是否已经认证,业务组件验证
 12                 if (UserManager.IsAuth(tm.FromUserName))
 13                 {
 14                     //如果已经认证,提示
 15                     tm.Content = "您已经认证过了,无需再次认证!";                    
 16                 }
 17                 else
 18                 {
 19                     AuthSessionItem authSessionItem = new AuthSessionItem();
 20                     authSessionItem.FromUserName = tm.FromUserName;
 21 
 22                     sessionItem.Oper = Operation.Auth;
 23                     sessionItem.Stage = OperationStage.First;
 24                     sessionItem.Data = authSessionItem;
 25                     Session.Set(tm.FromUserName, sessionItem);
 26 
 27                     //输入账号,并将数据和步骤,写入缓存
 28                     tm.Content = "请输入您的个人账号";
 29                 }
 30 
 31                 response = ResponseText(tm);
 32                 return false;
 33             }
 34 
 35             //从Session获取用户信息
 36             sessionItem = Session.Get(tm.FromUserName) as SessionItem;
 37             //如果会话存在,且当前操作为用户认证
 38             if (sessionItem != null && sessionItem.Oper == Operation.Auth)
 39             {
 40                 if (sessionItem.Stage == OperationStage.First)
 41                 {
 42                     tm.Content = tm.Content.Trim();
 43                     if (string.IsNullOrEmpty(tm.Content) || tm.Content.Length > 20)
 44                     {
 45                         tm.Content = "输入的个人账号不合法,请重新输入。";
 46                         response = ResponseText(tm);
 47                         return false;
 48                     }
 49                     AuthSessionItem authSessionItem = sessionItem.Data as AuthSessionItem;
 50                     if (authSessionItem != null)
 51                     {
 52                         authSessionItem.Code = tm.Content;
 53                     }
 54 
 55                     //更新缓存
 56                     sessionItem.Stage = OperationStage.Second;
 57                     Session.Set(tm.FromUserName, sessionItem);
 58                     tm.Content = "请输入您的员工卡号!\n退出认证请输入Exit。";
 59                     response = ResponseText(tm);  
 60                 }
 61                 else if (sessionItem.Stage == OperationStage.Second)
 62                 {
 63                     string cardNum = null;
 64                     if (!Common.TryConvertToCardNum(tm.Content, out cardNum))
 65                     {                       
 66                         tm.Content = "员工卡号不合法,请重新输入。\n退出认证请输入Exit。";
 67                         response = ResponseText(tm);
 68                         return false;
 69                     }
 70                     AuthSessionItem authSessionItem = sessionItem.Data as AuthSessionItem;
 71                     if (authSessionItem != null)
 72                     {
 73                         authSessionItem.ID = cardNum;
 74                     }
 75                     //认证
 76                     string message;
 77                     if (UserManager.Authenticate(authSessionItem, out message))
 78                     {
 79                         tm.Content = "祝贺您,已经认证成功,可以使用通讯录的查询功能呢。";
 80                         //清理缓存
 81                         Session.Remove(tm.FromUserName);
 82                         response = ResponseText(tm);
 83                         return true;
 84                     }
 85                     else if (!string.IsNullOrEmpty(message))
 86                     {
 87                         tm.Content = message;
 88                     }
 89                     else
 90                     {
 91                         tm.Content = "您输入的信息有误。\n重新认证请输入:Auth!";
 92                     }
 93                     //过程结束:清理Session
 94                     Session.Remove(tm.FromUserName);
 95                     response = ResponseText(tm);
 96                     return false;
 97                 }
 98             }
 99 
100             return false;
101         }

 

3、退出会话,清理Session

在认证过程中,用户可以通过命令,强制退出当前操作,在退出当前操作时,需要清理会话信息。

    /// <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直接查询用户相关信息。

四、后记

通过这种方法,公众账号,可以通过小小的文本输入框,实现更多、更复杂的业务应用。当然,还是通过提供网页来进行信息录入,更直观便捷。 

 

 

文章转载自  http://www.cnblogs.com/yank/p/3476874.html

posted @ 2017-06-27 15:32  晨曦时丶梦见兮  阅读(177)  评论(0编辑  收藏  举报