ホームページ > 記事 > WeChat アプレット > C# は WeChat ポータルを開発し、WeChat エンタープライズ アカウントを使用してメッセージとイベントを受信、処理、復号化します。
1. エンタープライズ アカウントのコールバック モードの設定
パブリック アカウントと同様に、WeChat エンタープライズ アカウントで二次開発が必要な場合は、次のインターフェイスに示すように、対応するコールバック パラメーターをバックグラウンドで設定する必要があります。
これらを設定してチェックに合格すると、独自の WeChat アプリケーション サーバーでメッセージを送受信できるようになります。
コールバックメッセージのエントリでは、POSTデータと通常のGETデータを別々に処理する必要があります。GETデータはWeChat独自の検証処理であり、POSTデータはWeChatメッセージの対話的な操作です。
/// <summary> /// 企业号回调信息接口。统一接收并处理信息的入口。 /// </summary> public class corpapi : IHttpHandler { /// <summary> /// 处理企业号的信息 /// </summary> /// <param name="context"></param> public void ProcessRequest(HttpContext context) {
上記では、メッセージを処理するための一般的なアプリケーション ハンドラーを定義しました。
次に、さまざまなメッセージ タイプ (POST、GET メソッド) を分離し、それに応じて処理します。
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST") { using (Stream stream = HttpContext.Current.Request.InputStream) { Byte[] postBytes = new Byte[stream.Length]; stream.Read(postBytes, 0, (Int32)stream.Length); postString = Encoding.UTF8.GetString(postBytes); } if (!string.IsNullOrEmpty(postString)) { Execute(postString, accountInfo); } } else { Auth(accountInfo); }
以下は、WeChatのコールバックモードと検証URLの手順です。
URL の有効性を確認します
上記の情報を送信すると、企業アカウントは入力された URL に GET リクエストを送信します。GET リクエストには 4 つのパラメーターが含まれます。 企業は取得時に URL デコード処理を行う必要があります。そうでない場合、検証は失敗します。
説明 | 必須ですか? | |
---|---|---|
WeChat暗号化署名、msg_signatureは、企業によって入力されたトークン、リクエスト内のタイムスタンプ、nonceパラメータ、および暗号化されたメッセージを組み合わせます。 body | はい | |
timestamp | は | |
乱数 | は | |
暗号化されたランダムですmsg_encrypt 形式で提供される文字列。 echostr 平文を復号して返す必要があります。random、msg_len、msg、および msg は最初の検証に含める必要があります。パラメータ msg_signature. で、この GET リクエストがエンタープライズ アカウントからのものであることが確認された場合、エンタープライズ アプリケーションは echostr パラメータを復号し、echostr プレーン テキストをそのまま (引用符なし) 返します。その後、アクセス検証が有効になり、コールバックが実行されます。モードをオンにすることができます。 | その後エンタープライズにコールバックが行われる場合、上記のパラメーター (echostr を除く) がリクエスト URL に含まれ、検証方法は最初の検証 URL と同じになります。 | 上記の手順に従って、これらのパラメータを取得し、WeChat が提供するメッセージ処理関数を呼び出して暗号化と復号化処理を実行する必要があります。 |
#region 具体处理逻辑 string echoString = HttpContext.Current.Request.QueryString["echoStr"]; string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature
string timestamp = HttpContext.Current.Request.QueryString["timestamp"]; string nonce = HttpContext.Current.Request.QueryString["nonce"]; string decryptEchoString = ""; if (new CorpBasicApi().CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString))
{ if (!string.IsNullOrEmpty(decryptEchoString))
{
HttpContext.Current.Response.Write(decryptEchoString);
HttpContext.Current.Response.End();
}
}
#endregion
認証コード部門は以下の通りです。
/// <summary> /// 验证企业号签名 /// </summary> /// <param name="token">企业号配置的Token</param> /// <param name="signature">签名内容</param> /// <param name="timestamp">时间戳</param> /// <param name="nonce">nonce参数</param> /// <param name="corpId">企业号ID标识</param> /// <param name="encodingAESKey">加密键</param> /// <param name="echostr">内容字符串</param> /// <param name="retEchostr">返回的字符串</param> /// <returns></returns> public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr) { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId); int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr); if (result != 0) { LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result); return false; } return true; }
3. エンタープライズアカウントのメッセージ処理
上で紹介したように、WeChat エンタープライズアカウントの URL の検証プロセスには、別のメッセージ処理プロセスがあります。つまり、WeChat サーバーがメッセージを独自のアプリケーションに送信します。処理用サーバー 処理プロセス中、アプリケーション サーバーはメッセージを受信した後、タイムリーに定期的な応答処理を実行する必要があります。
それが以下のコードロジックです。
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST") { using (Stream stream = HttpContext.Current.Request.InputStream) { Byte[] postBytes = new Byte[stream.Length]; stream.Read(postBytes, 0, (Int32)stream.Length); postString = Encoding.UTF8.GetString(postBytes); } if (!string.IsNullOrEmpty(postString)) { Execute(postString, accountInfo); } }
string echoString = HttpContext.Current.Request.QueryString["echoStr"]; string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature string timestamp = HttpContext.Current.Request.QueryString["timestamp"]; string nonce = HttpContext.Current.Request.QueryString["nonce"];
その他のパラメーター情報は、エンタープライズ アカウントの構成パラメーターから取得されます。
//获取配置参数并对加解密函数初始化 string CorpToken = accountInfo.Token; string AESKey = accountInfo.EncodingAESKey; string CorpId = accountInfo.CorpID;
次に、WeChat が提供するメッセージ暗号化および復号化クラスを使用して、メッセージを正常に暗号化および復号化します。具体的なオペレーションコードは以下の通りです。
//根据参数信息,初始化微信对应的消息加密解密类 WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(CorpToken, AESKey, CorpId); //对收到的密文进行解析处理 string sMsg = ""; // 解析之后的明文 int flag = wxcpt.DecryptMsg(signature, timestamp, nonce, postStr, ref sMsg); if (flag == 0) { //LogTextHelper.Info("记录解密后的数据:"); //LogTextHelper.Info(sMsg);//记录解密后的数据 CorpApiDispatch dispatch = new CorpApiDispatch(); string responseContent = dispatch.Execute(sMsg); //加密后并发送 //LogTextHelper.Info(responseContent); string encryptResponse = ""; timestamp = DateTime.Now.DateTimeToInt().ToString(); wxcpt.EncryptMsg(responseContent, timestamp, nonce, ref encryptResponse, ref signature); HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; HttpContext.Current.Response.Write(encryptResponse); } else { LogTextHelper.Info("解密消息失败!"); }
最後に、統合処理のために、復号化されたメッセージを対応するカプセル化クラスに渡すだけです。
CorpApiDispatch dispatch = new CorpApiDispatch(); string responseContent = dispatch.Execute(sMsg);
このようにして、Enterprise API をカプセル化するときは、メッセージに応答する方法のロジックのみに集中する必要があり、残りのことについて心配する必要はありません。
WeChat ポータルの C# 開発と、WeChat エンタープライズ アカウントの受信、メッセージとイベントの処理と復号化のアプリケーションの詳細については、PHP 中国語 Web サイトに注目してください。