WeChatパブリックプラットフォームSDKプロセスの詳細な説明
サービス アカウントの説明: 企業や組織に、より強力なビジネス サービスとユーザー管理機能を提供し、企業が新しいパブリック アカウント サービス プラットフォームを迅速に実装できるように支援します。
.NETSDK: Loogn.WeiXinSDK (net2.0 ソース コード、次のコードはおおよそのものであり、あまり正確ではありません。ソース コードは自分でダウンロードしてください)
私はまだ NOKIA-C5 を使用しており、WeChat を使用したことがないので、 WeChat についてまったく理解していません。あなたにはもっとたくさんのことがありますが、会社にはニーズがあるので、私はしっかりとインターフェイスのドキュメントを読む必要があります。
読んでみて、非常に便利な機能は、ユーザーが公開アカウントにメッセージを送信すると、ユーザーが送信した内容に基づいてプログラムが自動的にユーザーに返信できることです。運送状番号を物流会社の公開アカウントに送信します。
相手はこの運送状番号の物流詳細を自動的に返信します。これは非常にクールです。説明の便宜上、最初に適用された公開アカウント情報を与えます:
以下の図は、上記のロジスティクスを表示する詳細なメッセージプロセスを示しています (点線内の数字はプロセスの順序を示します):
WeChat から送信される URL は、主に 2 種類のメッセージです。
1 つ目は、上記のユーザーが送信した運送状番号などのユーザーの一般的なメッセージです
2 つ目は、ユーザーの行動 (つまり、イベント)ユーザーがあなたの公開アカウントをフォローした、公開アカウントの QR コードをスキャンした、カスタマイズされたメニューをクリックしたなど)。
URL は、受信した メッセージ タイプとコンテンツ に基づいて応答し、上記で返された物流の詳細などの強力なビジネス サービスを実現できます。すべてのメッセージは XML 形式で配信され、SDK は XML を .NET オブジェクトに変換して、ビジネス ロジックの作成を容易にします。メッセージのフレームワーク クラス図は次のように表されます (クリックすると、サブクラスを含む全体図が表示されます):
最初にメッセージの基本クラスがあり、次に受信メッセージ (RecEventBaseMsg) と応答メッセージ (ReplyBaseMsg) があります。上で説明したように、受信メッセージは、一般メッセージ (RecBaseMsg) とイベント メッセージ (EventBaseMsg) の 2 つのカテゴリに分類されます。受信メッセージのタイプは列挙によって表すことができます。他のタイプは言及されていません。MsgType が指定されている場合は、 Event、メッセージは EventBaseMsg のサブクラスです。すべての EventBaseMsg サブクラスの MsgType は Event です。したがって、EventBaseMsg タイプには、さまざまなイベントを区別するための EventType もあります。そのイベントのタイプは ではないことがわかります。 QR コードのスキャン イベントは、ユーザーがフォローしている場合とフォローしていない場合の 2 つの状況に分けられます。ユーザーがイベントをフォローしている場合、EventType はスキャンです。注目していないため、EventType は購読であり、ユーザーがフォローしたイベントの EventType も購読であるため、別の MyEventType が SDK に追加されました:
これで、返信するための SDK の呼び出しプロセスは基本的に明確になりました。メッセージは次のとおりです:
using System.Web;using Loogn.WeiXinSDK;using Loogn.WeiXinSDK.Message;namespace WebTest { /// <summary> /// 微信->服务器配置URL /// </summary> public class WeiXinAPI : IHttpHandler { static string Token = "Token";//这里是Token不是Access_Token public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; var signature = context.Request["signature"]; var timestamp = context.Request["timestamp"]; var nonce = context.Request["nonce"]; if (WeiXin.CheckSignature(signature, timestamp, nonce, Token))//验证是微信给你发的消息 { //根据注册的消息、事件处理程序回复, //如果得到没用注册的消息或事件,会返回ReplyEmptyMsg.Instance,即GetXML()为string.Empty,符合微信的要求 var replyMsg = WeiXin.ReplyMsg(); var xml = replyMsg.GetXML(); //WriteLog(xml); //这里可以查看回复的XML消息 context.Response.Write(xml); } else { context.Response.Write("fuck you!"); } } static WeiXinAPI() { WeiXin.ConfigGlobalCredential("appid", "appSecret"); //注册一个消息处理程序,当用户发"ABC",你回复“你说:ABC”; WeiXin.RegisterMsgHandler<RecTextMsg>((msg) => { return new ReplyTextMsg { Content = "你说:" + msg.Content //FromUserName = msg.ToUserName, 默认就是这样,不用设置! //ToUserName = msg.FromUserName, 默认就是这样,不用设置! //CreateTime = DateTime.Now.Ticks 默认就是这样,不用设置! }; }); //注册一个用户关注的事件处理程序,当用户关注你的公众账号时,你回复“Hello!” WeiXin.RegisterEventHandler<EventAttendMsg>((msg) => { return new ReplyTextMsg { Content = "Hello !" }; }); //还可以继续注册你感兴趣的消息、事件处理程序 } public bool IsReusable { get { return false; } } } }
SDK には (OAuth2.0 Web 認証) を除くすべてのインターフェイスのカプセル化が含まれています。クラス名とメソッド名は非常に明白なので、ここでは 1 つずつ説明しません。 DLL をダウンロードして自分でテストできます。これは有料の認定済みインターフェイス図です:
次に、いくつかの実装について説明します:
1. 資格情報 (access_token) の有効期限
このケースでは、キャッシュを使用することを考える必要があります。以下は
不完全なコードです:
access_token { ; expires_in { ; Dictionary<, Credential> creds = Dictionary<, Credential> TokenUrl = Credential GetCredential( appId, = (creds.TryGetValue(appId, (cred.add_time.AddSeconds(cred.expires_in - ) <= json = Util.HttpGet2(= Util.JsonTo<Credential>
2. エラー コード情報 前述したように、WeChat エラー コードは次のような json 形式で返されるため、認証情報を取得するコードは不完全です。エラーコードの形式は、通常返されるデータ形式とはまったく異なります。まず、呼び出すエラーコードのモデルクラスを定義します。リクエストが成功したときの {"errcode":0,"errmsg":"ok"} 状況も含まれているため、ここに ReturnCode を記述します:
{"errcode":40013,"errmsg":"invalid appid"}
エラー コードを含むリターン メッセージ クラスを定義する場合、二次元の Code インターフェイスを作成するなど、ReturnCode タイプの属性を含めることができます: errcode { ; errmsg { ; + errcode + + errmsg +
public class QRCodeTicket
{ public string ticket { get; set; } public int expire_seconds { get; set; } public ReturnCode error { get; set; }
}
var qrcode = WeiXin.CreateQRCode(true, 23); if (qrcode.error == null) { //返回错误,可以用qrcode.error查看错误消息 } else { //返回正确,可以操作qrcode.ticket }
三、反序列化
微信接口返回的json有时候对我们映射到对象并不太直接(json格式太灵活了!),比如创建分组成功后返回的json:
{ "group": { "id": 107, "name": "test" } }
如果想直接用json通过反序列化得到对象,那么这个对象的类的定义有可能会是这样:
public class GroupInfo { public Group group { get; set; } public class Group { public int id { get; set; } public string name { get; set; } } }
访问的时候也会是gp.group.name,所以我说不太直接,我们想要的类的定义肯定是只有上面那个子类的样子:
public class GroupInfo { public int id { get; set; } public string name { get; set; } }
如果微信接口返回的是这样:
{ "id": 107, "name": "test" }
就再好不过了,但人家的代码,我们修改不了,我们只有自己想办法.
1,要简单类,2不手动分析json(如正则),3,不想多定义一个类,你有想到很好的方法吗?如果有可以回复给我,而我选择用字典来做中间转换。
因为基本所有的json格式都可以反序列化为字典(嵌套字典,嵌套字典集合等),比如上面微信返回的json就可以用以下的类型来表示:
Dictionary<string, Dictionary<string, object>>
json--->dict--->GroupInfo
var dict = Util.JsonTo(json);var gi = new GroupInfo();var gpdict = dict["group"]; gi.id = Convert.ToInt32(gpdict["id"]); gi.name = gpdict["name"].ToString();
四、消息处理的优化
"万物简单为美",我就是一个非常非常喜欢简单的程序员。还记得最开始的那个消息(事件属于消息,这里统称为消息)处理吧,我感觉是很简单的,需要处理哪个消息就注册哪个消息的处理程序。但一开始的时候不是这样的,开始的时候要手动判断消息类型,就像:
using System.Web;using Loogn.WeiXinSDK;using Loogn.WeiXinSDK.Message;namespace WebTest { /// <summary> /// 微信->服务器配置URL /// </summary> public class WeiXinAPI : IHttpHandler { static string Token = "Token";//这里是Token不是Access_Token public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; var signature = context.Request["signature"]; var timestamp = context.Request["timestamp"]; var nonce = context.Request["nonce"]; if (WeiXin.CheckSignature(signature, timestamp, nonce, Token))//验证是微信给你发的消息 { var replyMsg = WeiXin.ReplyMsg((recEvtMsg) => { switch (recEvtMsg.MsgType) { case MsgType.text: { var msg = recEvtMsg as RecTextMsg; //这里要转型,麻烦 return new ReplyTextMsg { Content = "你说:" + msg.Content }; } case MsgType.Event: { var evtMsg = recEvtMsg as EventBaseMsg;//这里要转型到事件消息的基本,麻烦 switch (evtMsg.MyEventType) { case MyEventType.Attend: var msg = evtMsg as EventAttendMsg;//这个例子不需要这行代码,但其他要用消息内容还是要转型,麻烦 return new ReplyTextMsg { Content = "Hello !" }; default: break; } break; } default: break; } return ReplyEmptyMsg.Instance; //嵌套switch,而且每个case都有好几个,这也不优雅 }); var xml = replyMsg.GetXML(); //WriteLog(xml); //这里可以查看回复的XML消息 context.Response.Write(xml); } else { context.Response.Write("fuck you!"); } } public bool IsReusable { get { return false; } } } }
做优化的时候,先是试着看能不能在MsgType和MyEventType上做文章,比如注册时传入MsgType和处理程序(lamba)两个参数:
public static void RegisterMsgHandler(MsgType type, Func<RecEventBaseMsg, ReplyBaseMsg> handler) { //add handler}
这样的确是可以行的通的,但是在调用SDK注册的时候还是要手动转换类型:
WeiXin.RegisterMsgHandler(MsgType.text, (recEvtMsg) => msg = recEvtMsg ReplyTextMsg { Content = +
那么能不能每个子类型写一个呢?
public static void RegisterMsgHandler(MsgType type, Func<RecTextMsg, ReplyBaseMsg> handler) { //add handler } public static void RegisterMsgHandler(MsgType type, Func<RecImageMsg, ReplyBaseMsg> handler) { //add handler } //.............
定义是可以的,来看看调用:
//可以RegisterMsgHandler(MsgType.text, new Func<RecTextMsg, ReplyBaseMsg>((msg) =>{ return new ReplyTextMsg { Content = "你说:" + msg.Content }; }));//可以RegisterMsgHandler(MsgType.text, new Func<RecImageMsg, ReplyBaseMsg>((msg) =>{ return new ReplyTextMsg { Content = "你发的图片:" + msg.PicUrl }; }));//可以,注意这里msg的智能提示是RecTextMsg类型RegisterMsgHandler(MsgType.text, (msg) =>{ return new ReplyTextMsg { Content = "你说:" +msg.Content}; });//可以,注意这里msg的智能提示还是RecTextMsg类型,但用了类型推断,运行时可以确定是RecImageMsg,所以可以RegisterMsgHandler(MsgType.text, (msg) =>{ return new ReplyTextMsg { Content = "你发的图片:" + msg.PicUrl }; });//不可以,注意这里msg的智能提示还是RecTextMsg类型,但lamba body里没有用msg的特定子类的属性,类型推断不了,所以调用不明RegisterMsgHandler(MsgType.text, (msg) =>{ return new ReplyTextMsg { Content = "你发了个消息" }; });
从上面调用可知,想用这种方法调用,就不能随意的用lamba表达式,我所不欲也!最后,终于用泛型搞定了
public static void RegisterMsgHandler<TMsg>(Func<TMsg, ReplyBaseMsg> handler) where TMsg : RecBaseMsg { var type = typeof(TMsg); var key = string.Empty; if (type == typeof(RecTextMsg)) { key = MsgType.text.ToString(); } else if (type == typeof(RecImageMsg)) { key = MsgType.image.ToString(); } else if (type == typeof(RecLinkMsg)) { key = MsgType.link.ToString(); } else if (type == typeof(RecLocationMsg)) { key = MsgType.location.ToString(); } else if (type == typeof(RecVideoMsg)) { key = MsgType.video.ToString(); } else if (type == typeof(RecVoiceMsg)) { key = MsgType.voice.ToString(); } else { return; } m_msgHandlers[key] = (Func<RecEventBaseMsg, ReplyBaseMsg>)handler; }
经过这样的变换,我们才可以像开始那样用简洁的lamba表达式注册。
以上がWeChatパブリックプラットフォームSDKプロセスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ビルド 22523 用の新しい Windows 11 SDK は、Microsoft が Windows 11 用の新しいぼかし効果を開発していることを明らかにしました。この効果はタブ付きと呼ばれ、アクリルとマイカに追加されます。 22523 SDK の新しい DWMWA_SYSTEMBACKDROP_TYPE、Mica、Acrylic のパブリック Win32 API、およびその奇妙な新しい「タブ」ミックス: pic.twitter.com/dbsu7ZFiIi — It's All Back (@StartIsBack) December 15, 2021 次の SDK のサンプル アプリケーションで利用可能

WindowsAppSDK は、開発者が Windows 10 (バージョン 1809 以降) および Windows 11 を使用するさまざまなデバイス間で「一貫した」機能を提供するために Windows アプリケーションで使用できるツールと API のセットです。 .NET や Windows SDK などの既存のアプリケーション タイプを置き換えるのではなく、既存のアプリケーションを補完するために使用できる統合 API ツールセットを提供するだけであることを理解することが非常に重要です。本日、Microsoft は多くの新機能を備えた Windows App SDK バージョン 1.2 をリリースしました。このリリースのハイライトはサードパーティの開発者かもしれません

Java Hikvision SDK の二次開発に必須のスキルをマスターする はじめに: 情報技術の急速な発展に伴い、ビデオ監視システムはさまざまな分野で広く使用されています。国内の大手ビデオ監視ソリューションプロバイダーとして、Hikvision の製品と技術は常に市場で重要な位置を占めてきました。さまざまなプロジェクトのニーズを満たすために、Hikvision は開発者が二次開発を実行するための SDK を提供します。この記事では、Java Hikvision SDK の二次開発を習得するための重要なスキルをいくつか紹介し、対応するコード例を添付します。 1. Hikvision を理解する

sdkの正式名称は「Software Development Kit」、中国語で「ソフトウェア開発キット」を意味し、ハードウェアプラットフォームやオペレーティングシステム(OS)、プログラミング言語のメーカーが提供するツールのセットです。 SDK は、ソフトウェア開発者が特定のプラットフォーム、システム、またはプログラミング言語用のアプリケーションを作成するのを支援します。通常、基本的な SDK はコンパイラー、デバッガー、アプリケーション プログラミング インターフェイス (API) で構成されますが、ドキュメント、ライブラリ、ランタイム/開発環境、テスト/分析ツール、ネットワーク プロトコルなどの他のコンテンツが含まれる場合もあります。

PHP は、Web 開発およびサーバーサイド プログラミング、特に WeChat 開発で広く使用されているオープン ソースのスクリプト言語です。現在、ますます多くの企業や開発者が WeChat 開発に PHP を使用し始めています。これは、PHP が本当に学びやすく、使いやすい開発言語となっているためです。 WeChat の開発では、メッセージの暗号化と復号化はデータのセキュリティに関わるため、非常に重要な問題となります。暗号化と復号化の方法を持たないメッセージの場合、ハッカーは簡単にデータを入手でき、ユーザーに脅威を与える可能性があります。

WeChat ミニ プログラムのインストールと使用 PHPSDK モバイル インターネットの急速な発展に伴い、WeChat ミニ プログラムは、ますます多くの企業がビジネスを展開し、製品を宣伝するための新しい方法となっています。 WeChat ミニ プログラム PHPSDK は、開発効率を大幅に向上させる便利で高速な開発ツールを開発者に提供します。この記事では、WeChat アプレット PHPSDK のインストールと使用方法を紹介します。 1. SDK のインストール 1. GitHub でプロジェクト ファイルをダウンロード WeChat アプレット PHPSDK はオープン ソース プロジェクトであり、開発者は GitHub でダウンロードできます。

Linux の SDK は、コンパイラ、デバッガ、ライブラリ ファイル、ヘッダー ファイルなどのツールとリソースが含まれるフォルダーです。 SDKとは、ソフトウェア開発キットを意味する「Software Development Kit」の略称で、開発者がアプリケーション、特にLinuxオペレーティングシステム上で動作するアプリケーションを開発・構築するために提供される統合環境です。

インターネットの急速な発展に伴い、大量のデータを送信および処理する必要があるため、メッセージング システムは、データ送信および処理の古典的なアプリケーションの 1 つとして、インターネット アーキテクチャの不可欠な部分となっています。 Kafka は、リアルタイム データ処理をサポートする高性能、分散型、スケーラブルなメッセージング システムとして、エンタープライズ データ アーキテクチャで広く使用されています。 Kafka を使用する場合、Kafka の API をどのように呼び出すかが重要な問題になります。開発チームはこの目的のために複数の言語でオープンソース クライアントを提供し、PHP で実装されたオープンソース KafkaS
