Heim  >  Artikel  >  WeChat-Applet  >  Entwicklung der öffentlichen WeChat-Plattform Sitzungsverarbeitung

Entwicklung der öffentlichen WeChat-Plattform Sitzungsverarbeitung

高洛峰
高洛峰Original
2017-03-06 09:12:301807Durchsuche

Im WeChat-Fenster sind die Eingabeinformationen begrenzt und wir müssen einige Informationen mehrmals anfordern.

Zum Beispiel: Wenn wir Benutzer binden, müssen wir relevante Informationen des Benutzers eingeben, wie zum Beispiel: Benutzername, Passwort oder Name, Telefonnummer und ob die Serverseite verifiziert ist , dann sind die Systembenutzer an WeChat-Benutzer gebunden.

Dann verfügt dieses WeChat-Konto über bestimmte Funktionsberechtigungen und Sie können Punkte, Verbrauchsaufzeichnungen usw. überprüfen. Servicekonto: Die Kreditkarte der China Merchants Bank hat viele Funktionen.

Der WeChat-Client kann keine Informationen zwischenspeichern und die Eingabeinformationen sind begrenzt, um den aktuellen Sitzungsstatus auf dem Server zu speichern. Dies erfordert eine Sitzung.

In diesem Artikel werden Benutzerauthentifizierung und Kontobindung als Beispiel verwendet, um die spezifische Verarbeitung zu veranschaulichen.

1. Erstellen Sie einen universellen Sitzungsverarbeitungsmechanismus.

Um das Prinzip besser zu erklären und die Erweiterung zu erleichtern, werden wir die Sitzung selbst gestalten. Natürlich kann hier auch System.Web.SessionState.HttpSessionState verwendet werden, ein häufig verwendeter Sitzungsmechanismus im Web.

1. Benutzerdefinierte Sitzung

wird zum Speichern von Sitzungsfragmenten und zugehörigen Daten verwendet.

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. Vorgangstyp

Notieren Sie den spezifischen Vorgangstyp und identifizieren Sie den spezifischen Vorgang der aktuellen Sitzung

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

3. Die Vorgangsprozessaufzählung

wird verwendet, um den aktuellen Vorgang und die Phase zu identifizieren, in der er sich befindet. Verschiedene Phasen führen unterschiedliche Verarbeitungen durch.

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

4. Sitzungs-Cache-Element

Cache-Datensatzelement, das den Operationstyp, die Operationsschritte und das Sitzungsobjekt aufzeichnet. Um die Sitzungsverwaltung zu erleichtern, werden auch die letzte Zugriffszeit und die Angabe, ob das Logo automatisch gelöscht werden soll, hinzugefügt.

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

Zweitens müssen wir die Sitzungsverarbeitung zur Nachrichtenverarbeitung hinzufügen.

1. Cache-Elementdatenobjekt hinzufügen

Dieses Objekt zeichnet die relevanten Informationen auf, die der Benutzer während der Sitzung eingegeben hat. Es wird auch als Objekt für Geschäftsverarbeitungsdaten verwendet.

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

2. Authentifizierungsprozess

1) Beginnen Sie mit der Eingabe der Authentifizierung und markieren Sie sie entsprechend der Authentifizierung Schlüsselwort, Sitzung starten und relevante Daten zwischenspeichern

2) Aufforderung zur Eingabe persönlicher Kontoinformationen

3) WeChat-Benutzer geben persönliches Konto ein, der Server zeichnet die Kontoinformationen auf und fordert zur Eingabe des Mitarbeiters auf Kartennummer

4) Der WeChat-Benutzer gibt die Kartennummerninformationen ein, der Server zeichnet die Kartennummerninformationen auf und ruft die spezifische Authentifizierungslogik auf

5) Der Benutzer besteht die Authentifizierung und bindet den WeChat OpenId fordert zur Eingabe erfolgreicher Bindungsinformationen auf und löscht die Sitzung.

Während des Authentifizierungsprozesses muss die Rechtmäßigkeit der vom Benutzer eingegebenen Informationen überprüft werden, und während der Sitzung wird dem Benutzer geholfen, den aktuellen Vorgang zu verlassen.

/// 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. Beenden Sie die Sitzung und bereinigen Sie die Sitzung

Während des Authentifizierungsprozesses kann der Benutzer den aktuellen Vorgang zwangsweise beenden Durch Befehle müssen beim Beenden des aktuellen Vorgangs Sitzungsinformationen gelöscht werden.

/// 631fb227578dfffda61e1fa4d04b7d25
        /// 退出,并清理Session
        /// 039f3e95db2a684c7b74365531eb6044
        /// 48c89b85c0dea34386a1ce7621016c778bb7487ae6a16a43571bc14c7fcf93c2
        /// ac0426a4c30f960f93a3daeaf71812178bb7487ae6a16a43571bc14c7fcf93c2
        /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3
        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;
        }

3. Benutzerauthentifizierung bestanden, WeChat-Konto binden

Benutzerauthentifizierung bestanden und WeChat OpenId binden, über OpenId, das sind Sie Sie können jetzt Ihr Adressbuch, Ihre persönlichen Punkte und Ihre Verbrauchsaufzeichnungen überprüfen. Die Benutzerauthentifizierung ist ein Identitätsauthentifizierungsprozess und ein Benutzerbindungsprozess. Wenn die Benutzeridentität authentifiziert ist, können Sie über Ihr WeChat-Konto bestimmte Informationen abfragen. Zu diesem Zeitpunkt kann die Geschäftsschicht benutzerbezogene Informationen basierend auf der von WeChat zugewiesenen OpenId direkt abfragen.

4. Postscript

Mit dieser Methode können öffentliche Konten immer komplexere Geschäftsanwendungen durch kleine Texteingabefelder realisieren. Natürlich ist es intuitiver und bequemer, Informationen über die Bereitstellung einer Webseite einzugeben.

Weitere Artikel zur Entwicklung der öffentlichen WeChat-Plattform und zur Sitzungsverarbeitung finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn