WeChatパブリックプラットフォーム開発チュートリアル(3) 基本的なフレームワーク構築

高洛峰
リリース: 2017-02-16 16:15:11
オリジナル
1908 人が閲覧しました

WeChat パブリック プラットフォーム開発チュートリアル (3) 基本フレームワークの構築

前の章では、最初に WeChat パブリック アカウント開発の基本原則を説明しました。今日は設計の実装について説明します。

まず、モジュール階層図を設計しました。もちろん、この図は実装方法を示すだけであり、これに限定されるものではありません。詳細については、以下の図を参照してください。

主な機能は次のように紹介されます:

1) インターフェース層をリクエストします。 HTTP リクエストとレスポンスの処理

2) ディストリビューション層。リクエストはインターフェイス層から渡され、リクエストの種類が具体的に分析されて、さまざまなプロセッサに分配されます

3) ビジネスロジック層。リクエストに応じて、具体的なビジネスロジックを実装します。

4) データ層。アプリケーションを実装するとき、データベースまたはファイルなどのデータにアクセスする必要がある場合があります。単純なアプリケーションの場合、このレイヤーは使用できない場合があります。

実際には、この構造上で特定のアプリケーションを拡張することができ、メッセージ オブジェクト層、ビジネス オブジェクト層、データ アクセス層、機能管理層などを拡張できます。これはアイデアを提供するためのものであり、これに限定されるものではありません。

微信公众平台开发教程(三) 基础框架搭建

階層図に基づいてフローチャートを設計し、各実装プロセスを詳細に説明します。プロセス全体を理解するために。以下の図に示すように:

微信公众平台开发教程(三) 基础框架搭建

フローチャートによれば、メッセージ処理のプロセス全体と具体的な実装手順を明確に理解できます。

以下に各プロセスのコードを実装します。

1. HTTP リクエストを受信する

WeChat サーバーの HTTP リクエストを処理するには、HttpHandler または Web ページが必要です。

ここでは HttpHandler を使用します。高い柔軟性と優れたパフォーマンスのため。

具体的な実装は以下の通りです。

    public class WeiXinHttpHandler:IHttpHandler
    {        /// <summary>
        /// 
        /// </summary>
        public bool IsReusable
        {            get { return true; }
        }        /// <summary>
        /// 处理请求        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {            //由微信服务接收请求,具体处理请求
            WeiXinService wxService = new WeiXinService(context.Request);            string responseMsg = wxService.Response();
            context.Response.Clear();
            context.Response.Charset = "UTF-8";
            context.Response.Write(responseMsg);
            context.Response.End();
        }
    }
ログイン後にコピー

HTTPHandlerの場合は、設定ファイルで特定のアプリケーションを設定する必要があります。具体的なノード構成については説明しません。直接例を挙げて、以下のように HttpHandler ノードを設定します

<httpHandlers>
   <add verb="*" path="WXService.ashx" type="namespace.WeiXinHttpHandler,WXWeb" validate="true"/></httpHandlers>
ログイン後にコピー

2. 配布リクエスト

関数をカプセル化するために、これも処理コンポーネント内でカプセル化しました。実際には、HttpHandler に配置できます。

1) 署名を検証します

最初のリクエストの場合、署名を検証する必要があります。これは HTTP ハンドシェイクに相当します。前の章では、サーバーの URL とトークンの値を設定しました。この機能は、リンクが成功したかどうかを確認するためのものです。

このリクエストは GET リクエストです。以下の具体的な手順 (公式):

ビジネス ロジック:

暗号化/検証プロセス:

<1> 3 つのパラメーターのトークン、タイムスタンプ、nonce を辞書順に並べ替えます

<2>文字列は SHA1 暗号化のために 1 つの文字列に結合されます

<3> 開発者が取得した暗号化された文字列を署名と比較して、リクエストが WeChat からのものであることを識別できます

公式は PHP コードの例のみを提供しています。物事は C# で書かれています 中国語は直訳ではありません。したがって、ここにはいくつかの特別な治療法もあります。まずは公式コードを見てみましょう:

    private function checkSignature()
    {        $signature = $_GET["signature"];        $timestamp = $_GET["timestamp"];        $nonce = $_GET["nonce"];    
                
        $token = TOKEN;        $tmpArr = array($token, $timestamp, $nonce);        sort($tmpArr);        $tmpStr = implode( $tmpArr );        $tmpStr = sha1( $tmpStr );        
        if( $tmpStr == $signature ){            return true;
        }else{            return false;
        }
    }
ログイン後にコピー

それをC#バージョンに変換します:

        /// <summary>
        /// 检查签名        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private bool CheckSignature()
        {            string signature = Request.QueryString[SIGNATURE];            string timestamp = Request.QueryString[TIMESTAMP];            string nonce = Request.QueryString[NONCE];

            List<string> list = new List<string>();
            list.Add(TOKEN);
            list.Add(timestamp);
            list.Add(nonce);            //排序            list.Sort();            //拼串
            string input = string.Empty;            foreach (var item in list)
            {
                input += item;
            }            //加密
            string new_signature = SecurityUtility.SHA1Encrypt(input);            //验证
            if (new_signature == signature)
            {                return true;
            }            else
            {                return false;
            }
        }
ログイン後にコピー

ここでは、具体的なアルゴリズムは次のとおりです:

        /// <summary>
        /// SHA1加密        /// </summary>
        /// <param name="intput">输入字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string SHA1Encrypt(string intput)
        {            byte[] StrRes = Encoding.Default.GetBytes(intput);
            HashAlgorithm mySHA = new SHA1CryptoServiceProvider();
            StrRes = mySHA.ComputeHash(StrRes);
            StringBuilder EnText = new StringBuilder();            foreach (byte Byte in StrRes)
            {
                EnText.AppendFormat("{0:x2}", Byte);
            }            return EnText.ToString();
        }
ログイン後にコピー

2) 配布リクエスト

次のステップは特定のメッセージリクエストです。ここにすべての POST リクエストがあります。

複数のメッセージ タイプがあるため、ファクトリ クラスを通じてそれらをカプセル化し、各メッセージを処理する専用のプロセッサーを持ちます。特定の実装ロジック:

        /// <summary>
        /// 处理请求        /// </summary>
        /// <returns></returns>
        private string ResponseMsg()
        {            string requestXml = Common.ReadRequest(this.Request);
            IHandler handler = HandlerFactory.CreateHandler(requestXml);            if (handler != null)
            {                return handler.HandleRequest();
            }            return string.Empty;
        }
ログイン後にコピー

リクエストを処理するための外部メソッド (これは HttpHandler によって呼び出されるメソッド)、つまり:

        /// <summary>
        /// 处理请求,产生响应        /// </summary>
        /// <returns></returns>
        public string Response()
        {            string method = Request.HttpMethod.ToUpper();            //验证签名
            if (method == "GET")
            {                if (CheckSignature())
                {                    return Request.QueryString[ECHOSTR];
                }                else
                {                    return "error";
                }
            }            //处理消息
            if (method == "POST")
            {                return ResponseMsg();
            }            else
            {                return "无法处理";
            }
        }
ログイン後にコピー

3. メッセージ プロセッサは、特にメッセージを処理します

1 ) メッセージ タイプ

まず、具体的なメッセージ タイプを見てみましょう。実際、メッセージ インターフェイスは前の図で明確に示されています。

ここで、どのようなタイプのメッセージがリクエストされるか、どのようなタイプのメッセージが返信されるかなどを詳しく見てみましょう。

リクエストされたメッセージはテキストタイプであり、返信メッセージは必ずしもテキストである必要はなく、グラフィック、テキスト、音楽など、あらゆる種類の返信可能なメッセージであることに注意してください。詳細については、以下の表を参照してください。

微信公众平台开发教程(三) 基础框架搭建

2) 特定のメッセージ インターフェイスに従ってメッセージ クラスを設計します。

这里给出类图,供参考。

微信公众平台开发教程(三) 基础框架搭建

 

3)针对不同的消息,会有不同的处理器,来看下具体的类图。

 微信公众平台开发教程(三) 基础框架搭建  

4)具体业务处理 

每个handler里面就是可以处理具体请求。输入的什么消息,访问那些数据,调用服务等,都在这里处理。

还是建议大家对具体的业务进行单独封装,在Handler中,只提供调用的接口。

因为随着业务的增加,一个Handler可能要处理很多业务,如果所有的操作逻辑都写在这里,势必影响阅读,也不易于维护与扩展。 

5)产生回复消息

在处理完请求后,需要生成回复消息,响应到终端。消息格式,就是我们介绍那些消息类型,但必须是可用于回复的,当前支持的有:文本、图文、音乐等。

一定要明确:回复的消息类型不一定要与请求的消息类型一样,比如,请求是文本,回复的可以是图文、音乐。

产生回复消息的过程,其实,就是特定的消息对象格式化为对应的XML的过程,然后将XML响应至微信服务器。

6)实例

这里以微信用户关注公众账号,然后服务端处理处理事件请求,登记用户,并提示欢迎信息。

    class EventHandler : IHandler
    {        /// <summary>
        /// 请求的xml        /// </summary>
        private string RequestXml { get; set; }        /// <summary>
        /// 构造函数        /// </summary>
        /// <param name="requestXml"></param>
        public EventHandler(string requestXml)
        {            this.RequestXml = requestXml;
        }        /// <summary>
        /// 处理请求        /// </summary>
        /// <returns></returns>
        public string HandleRequest()
        {            string response = string.Empty;
            EventMessage em = EventMessage.LoadFromXml(RequestXml);            if (em.Event == EventType.Subscribe)
            {                //注册用户
                User user = new User();
                user.OpenID = em.FromUserName;
                UserManager.Regester(user);                //回复欢迎消息
                TextMessage tm = new TextMessage();
                tm.ToUserName = em.FromUserName;
                tm.FromUserName = em.ToUserName;
                tm.CreateTime = Common.GetNowTime();
                tm.Content = "欢迎您关注xxx,我是小微。有什么我能帮助您的吗?";
                response = tm.GenerateContent();
            }            return response;
        }
    }
ログイン後にコピー

 

四、HTTP响应

 最后将处理结果返回至最初HttpHandler,响应给微信服务器,直接Response处理。这也是在最开始设计的HttpHandler中实现的。

下面是代码片段,具体可见一、Http请求 

            context.Response.Clear();
            context.Response.Charset = "UTF-8";
            context.Response.Write(responseMsg);
            context.Response.End();
ログイン後にコピー


 更多微信公众平台开发教程(三) 基础框架搭建 相关文章请关注PHP中文网!

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート