>  기사  >  위챗 애플릿  >  WeChat 공개 플랫폼 개발 세션 처리

WeChat 공개 플랫폼 개발 세션 처리

高洛峰
高洛峰원래의
2017-03-06 09:12:301807검색

위챗 창에서는 입력 정보가 ​​제한되어 있어 일부 정보를 여러 번 요청해야 합니다.

예: 사용자를 바인딩할 때 사용자 이름, 비밀번호 또는 이름, 전화번호와 같은 사용자 관련 정보를 입력해야 하며 서버 측이 확인되었는지 여부 , 시스템 사용자는 WeChat 사용자에게 바인딩됩니다.

그러면 해당 위챗 계정에 특정 기능 권한이 부여되며, 포인트, 소비 기록 등을 확인할 수 있습니다. 서비스 계좌: 중국초상은행 신용카드에는 다양한 기능이 있습니다.

WeChat 클라이언트는 정보를 캐시할 수 없으며 입력 정보가 ​​제한되어 있습니다. 현재 세션 상태를 서버에 저장하려면 여러 번의 요청이 필요합니다. 여기에는 세션이 필요합니다.

이 문서에서는 특정 처리를 설명하기 위해 사용자 인증 및 계정 바인딩을 예로 들어 설명합니다.

1. 범용 세션 처리 메커니즘을 만듭니다.

원리를 더 잘 설명하고 확장을 촉진하기 위해 세션을 직접 디자인합니다. 물론 여기에서는 웹에서 일반적으로 사용되는 세션 메커니즘인 System.Web.SessionState.HttpSessionState를 사용할 수도 있습니다.

1. 맞춤 세션

은 세션 조각 및 관련 데이터를 저장하는 데 사용됩니다.

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();
        }
    }

2. 작업 유형

구체적인 작업 유형을 기록하고 현재 세션의 구체적인 작업을 식별합니다

/// 631fb227578dfffda61e1fa4d04b7d25
    /// 操作类型
    /// 039f3e95db2a684c7b74365531eb6044
    enum Operation
    {
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 认证
        /// 039f3e95db2a684c7b74365531eb6044
        Auth,
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 添加用户
        /// 039f3e95db2a684c7b74365531eb6044
        CreateUser
    }

3. 작업 프로세스 열거

는 현재 작업과 현재 진행 중인 단계를 식별하는 데 사용됩니다. 단계마다 다른 프로세스가 수행됩니다.

/// 631fb227578dfffda61e1fa4d04b7d25
    /// 操作过程
    /// 039f3e95db2a684c7b74365531eb6044
    enum OperationStage
    {
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 默认
        /// 039f3e95db2a684c7b74365531eb6044
        Default,
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 第一步
        /// 039f3e95db2a684c7b74365531eb6044
        First,
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 第二步
        /// 039f3e95db2a684c7b74365531eb6044
        Second,
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 第三步
        /// 039f3e95db2a684c7b74365531eb6044
        Third
    }

4. 세션 캐시 항목

작업 유형, 작업 단계 및 세션 개체를 기록하는 캐시 기록 항목입니다. 세션 관리를 용이하게 하기 위해 마지막 접속 시간과 로고 자동 삭제 여부도 추가됩니다.

class SessionItem
    {
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 操作类型
        /// 039f3e95db2a684c7b74365531eb6044
        public Operation Oper { get; set; }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 当前步骤
        /// 039f3e95db2a684c7b74365531eb6044
        public OperationStage Stage { get; set; }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 数据对象
        /// 039f3e95db2a684c7b74365531eb6044
        public object Data { get; set; }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 是否自动删除
        /// 039f3e95db2a684c7b74365531eb6044
        public bool AutoRemove
        {
            get;
            set;
        }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 最后更新时间
        /// 039f3e95db2a684c7b74365531eb6044
        public DateTime UpdateTime { get; set; }
    }

둘째, 메시지 처리에 세션 처리를 추가해야 합니다.

1. 캐시 아이템 데이터 객체 추가

이 객체는 세션 중에 사용자가 입력한 관련 정보를 기록합니다. 업무용 데이터 처리를 위한 객체로도 사용됩니다.

rreee

2. 인증 과정

1) 인증 입력을 시작하고, 인증 키워드에 따라 표시하고, 세션 시작 및 관련 데이터 캐시

2) 개인 계정 정보 입력 메시지

3) WeChat 사용자가 개인 계정을 입력하면 서버가 계정 정보를 기록하고 사원 카드 번호를 입력하라는 메시지가 나타납니다

4) 위챗 사용자가 카드번호 정보를 입력하면 서버가 카드번호 정보를 기록하고 특정 인증 로직을 호출합니다

5) 사용자가 인증을 통과하고 위챗 OpenId를 바인딩하고 프롬프트를 표시합니다. 성공적인 바인딩 정보를 확인하고 세션을 지웁니다.

인증 과정에서는 사용자가 입력한 정보의 적법성을 검증해야 하며, 세션 중에는 사용자가 현재 작업을 종료할 수 있도록 지원됩니다.

class AuthSessionItem
    {
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 用户名
        /// 039f3e95db2a684c7b74365531eb6044
        public string FromUserName { get; set; }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 账号
        /// 039f3e95db2a684c7b74365531eb6044
        public string Code { get; set; }
        /// 631fb227578dfffda61e1fa4d04b7d25
        /// 唯一标识
        /// 039f3e95db2a684c7b74365531eb6044
        public string ID { get; set; }
    }

3. 세션 종료 및 세션 정리

인증 과정에서 사용자는 명령을 통해 현재 작업을 강제 종료할 수 있습니다. . 현재 작업을 종료한 후 세션 정보를 지워야 합니다.

/// 631fb227578dfffda61e1fa4d04b7d25
        /// 认证用户信息
        /// 039f3e95db2a684c7b74365531eb6044
        /// 48c89b85c0dea34386a1ce7621016c778bb7487ae6a16a43571bc14c7fcf93c2
        /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
        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;
        }

3. 사용자 인증 통과, WeChat 계정 결합

사용자 인증 통과, WeChat OpenId 결합, OpenId 주소록을 통해 쿼리 가능 , 개인 포인트, 소비 기록 및 기타 작업을 쿼리합니다. 사용자 인증은 신원 인증 과정이자 사용자 바인딩 과정입니다. 사용자 신원이 인증되면 위챗 계정을 통해 특정 정보를 조회할 수 있습니다. 이때, 비즈니스 레이어는 위챗에서 할당한 OpenId를 기반으로 사용자 관련 정보를 직접 조회할 수 있습니다.

4. 포스트스크립트

이 방법을 통해 공용 계정은 작은 텍스트 입력 상자를 통해 점점 더 복잡한 비즈니스 애플리케이션을 구현할 수 있습니다. 물론, 웹페이지를 제공하여 정보를 입력하는 것이 더 직관적이고 편리합니다.

WeChat 공개 플랫폼 개발 및 세션 처리에 관한 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.