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

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

Feb 16, 2017 pm 04:15 PM
マイクロチャネルパブリックプラットフォーム

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>
        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></add></httphandlers>

2. 配布リクエスト

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

1) 署名を検証します

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

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

ビジネス ロジック:

暗号化/検証プロセス:

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

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

開発者が取得した暗号化された文字列を署名と比較して、リクエストが 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>
        /// <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;
            }
        }</string></string>

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

        /// <summary>
        /// SHA1加密        /// </summary>
        /// <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>
        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中文网!

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン