受動的応答メッセージ (XML を返す)
WeChat では XML データを返す必要があり、その形式は指定されています。詳細については、
WeChat パブリック プラットフォームの開発者ドキュメントを参照してください。
要件は XML 形式であるため、応答エンティティ クラスはすでに作成済みです。
ここでは、Microsoft が提供する System.Xml.Serialization.XmlSerializer を使用して、データを XML にシリアル化します。
そこで、クラスの XmlRoot 属性、列挙型フィールドの XmlEnum 属性、NewsMsg の記事リストの XmlArray 属性と XmlArrayItem 属性をマークしました。その後逆シリアル化されるのは、WeChat で必要な形式になります。
シリアル化方法は次のとおりです:
public string ResponseXML(object value, Type type){ StringWriter sw = new StringWriter(); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); //去除命名空间 XmlSerializer serializer = new XmlSerializer(type); serializer.Serialize(sw, value, ns); return sw.ToString(); }
注: ここで XML 名前空間を削除する必要があります。削除しないと WeChat が認識しません
完全な方法が示されています:
public HttpResponseMessage Post(){ var requestContent = Request.Content.ReadAsStreamAsync().Result; //从正文参数中加载微信的请求参数 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(requestContent); logger.DebugFormat("WX请求XML内容:{0}", xmlDoc.InnerText); string msgTypeStr = xmlDoc.SelectSingleNode("xml/MsgType").InnerText; string userName = xmlDoc.SelectSingleNode("xml/FromUserName").InnerText; string efhName = xmlDoc.SelectSingleNode("xml/ToUserName").InnerText; string responseContent; MsgType msgType; //获取消息类型,若未定义,则返回。 if (!Enum.TryParse(msgTypeStr, true, out msgType)) { responseContent = MsgService.Instance.ResponseXML(new TextMsg { FromUserName = efhName, MsgType = MsgType.Text, Content = "俺还小,不知道你在说啥子(⊙_⊙)?", CreateTime = UnixTimestamp.Now.ToNumeric(), ToUserName = userName }, typeof(TextMsg)); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"), }; } if (msgType == MsgType.Event) { return ProcessEvent(xmlDoc, userName, efhName); } //图灵消息转换为微信响应消息,下一节奉上 string content = xmlDoc.SelectSingleNode("xml/Content").InnerText; var requestResult = TuLingService.Instance.GetMsgFromResponse(content, userName, efhName); responseContent = MsgService.Instance.ResponseXML(requestResult.Data, requestResult.DataType); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"), }; }private HttpResponseMessage ProcessEvent(XmlDocument xmlDoc, string userName, string efhName){ string eventValue = xmlDoc.SelectSingleNode("xml/Event").InnerText; var responseContent = MsgService.Instance.ResponseXML(new TextMsg { FromUserName = efhName, MsgType = MsgType.Text, Content = eventValue.ToLower().Equals("subscribe") ? "lei好哇~" : "大爷,奴家会想你的",//其实取消订阅是不会发送消息的 CreateTime = UnixTimestamp.Now.ToNumeric(), ToUserName = userName }, typeof(TextMsg)); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"), }; }
この時点で、 WeChat の受動的応答メッセージ。
Turing メッセージと WeChat メッセージのマッピング
メッセージに受動的に返信する機能を実装しました。次に、Turing ロボット インターフェイスをパブリック プラットフォームに関連付ける必要があります。
チューリング ロボットから返されたパラメーターを分析したところ、すべての種類のコンテンツにコード パラメーターとテキスト パラメーターがあることがわかりました。そして、TuringのメッセージをWeChatの応答メッセージに直接対応させる必要があるため、インターフェースを定義し、変換メソッドを提供します
public class TuLingResult{ //消息类型(我们在序列化为XML的时候需要提供类型) public Type DataType { get; set; } public object Data { get; set; } }public interface IResponse{ TuLingResult ToTuLingResult(string fromUserName, string toUserName); }
Turingメッセージ(WeChatのテキストメッセージに相当)の基本クラスとしてテキストデータの実体を作成します
public class TextResult : IResponse{ public int Code { get; set; } public string Text { get; set; } public virtual TuLingResult ToTuLingResult(string fromUserName, string toUserName) { return new TuLingResult { DataType = typeof(TextMsg), Data = new TextMsg { FromUserName = fromUserName, ToUserName = toUserName, Content = Text, CreateTime = UnixTimestamp.Now.ToNumeric(), MsgType = MsgType.Text } }; } }
ではさまざまなデータのエンティティクラスを順番に作成します。
例: ニュース (WeChat グラフィック メッセージに対応)
public class NewsResult : TextResult{ public List<NewsInfo> List { get; set; } public override TuLingResult ToTuLingResult(string fromUserName, string toUserName) { if (List.Count > 10) { List = List.Take(10).ToList(); } return new TuLingResult { DataType = typeof(NewsMsg), Data = new NewsMsg { FromUserName = fromUserName, ToUserName = toUserName, ArticleCount = List.Count, Articles = List.Select(m => new MsgNewsInfo { Title = m.Article, Description = m.Source, Url = m.DetailUrl, PicUrl = m.Icon }).ToList(), CreateTime = UnixTimestamp.Now.ToNumeric(), MsgType=MsgType.News } }; } }public class NewsInfo{ /// <summary> /// 标题 /// </summary> public string Article { get; set; } /// <summary> /// 来源 /// </summary> public string Source { get; set; } /// <summary> /// 详情地址 /// </summary> public string DetailUrl { get; set; } /// <summary> /// 图标地址 /// </summary> public string Icon { get; set; } }
同様に、Turing Robot によって提供されるさまざまなデータ エンティティ クラスを作成します
サポートするデータ エンティティが定義されたら、Turing インターフェイスのリクエストを開始して、実は、ここでは HttpClient を使用して実装しています。
private const string TULING_API_URL = "http://www.tuling123.com/openapi/api";private const string TULING_API_KEY = "XXXXX";//图灵的APIKEYpublic TuLingResult GetMsgFromResponse(string keyword, string userFlag, string efhName){ string linkString = string.Format("{0}?key={1}&info={2}&userid={3}" , TULING_API_URL, TULING_API_KEY, keyword, userFlag); string content = string.Empty; using (HttpClient client = new HttpClient()) { HttpResponseMessage response = client.GetAsync(linkString).Result; content = response.Content.ReadAsStringAsync().Result; logger.DebugFormat("图灵机器人响应:{0}", content); } return ConvertToMsg(content, userFlag, efhName); }
Turing はコード識別メッセージ タイプとエラー情報を返すため、最初に応答メッセージを TextResult に解析し、Turing タイプを取得します。
まず、チューリング戻りコード
public enum ResultType { TL_FORMAT_DATA = 50000, TL_TEXT_DATA = 100000, TL_LINK_DATA = 200000, TL_NOVEL_DATA = 301000, TL_NEWS_DATA = 302000, TL_APP_DATA = 304000, TL_TRAIN_DATA = 305000, TL_AIRPORT_DATA = 306000, TL_TUAN_DATA = 307000, TL_TUWEN_DATA = 308000, TL_HOTEL_DATA = 309000, TL_LOTTERY_DATA = 310000, TL_PRICE_DATA = 311000, TL_RESTAURANT_DATA = 312000, TL_ERROR_LENGTH = 40001, TL_ERROR_EMPTY = 40002, TL_ERROR_INVALID = 40003, TL_ERROR_OUTLIMIT = 40004, TL_ERROR_NOTSUPPORT = 40005, TL_ERROR_SERVERUPDATE = 40006, TL_ERROR_SERVERERROR = 40007 }
に対応するチューリング型列挙型
100000 文本类数据 200000 网址类数据 301000 小说 302000 新闻 304000 应用、软件、下载 305000 列车 306000 航班 307000 团购 308000 优惠 309000 酒店 310000 彩票 311000 价格 312000 餐厅 40001 key的长度错误(32位) 40002 请求内容为空 40003 key错误或帐号未激活 40004 当天请求次数已用完 40005 暂不支持该功能 40006 服务器升级中 40007 服务器数据格式异常 50000 机器人设定的“学用户说话”或者“默认回答”
を定義し、次にメッセージ型
private ResultType GetResultType(string response) { var result = JsonConvert.DeserializeObject<TextResult>(response); return (ResultType)result.Code; }
を取得すると、さまざまな型に従って対応する TuLingResult を返すことができます。
public TuLingResult ConvertToMsg(string response, string userFlag, string efhName) { IResponse result = null; var resultType = GetResultType(response); switch (resultType) { case ResultType.TL_TEXT_DATA: result = JsonConvert.DeserializeObject<TextResult>(response); break; case ResultType.TL_LINK_DATA: result = JsonConvert.DeserializeObject<LinkResult>(response); break; case ResultType.TL_NEWS_DATA: result = JsonConvert.DeserializeObject<NewsResult>(response); break; case ResultType.TL_TUWEN_DATA: result = JsonConvert.DeserializeObject<TuWenResult>(response); break; case ResultType.TL_TRAIN_DATA: result = JsonConvert.DeserializeObject<TrainResult>(response); break; case ResultType.TL_AIRPORT_DATA: result = JsonConvert.DeserializeObject<AirportResult>(response); break; case ResultType.TL_APP_DATA: result = JsonConvert.DeserializeObject<AppResult>(response); break; case ResultType.TL_HOTEL_DATA: result = JsonConvert.DeserializeObject<HotelResult>(response); break; case ResultType.TL_PRICE_DATA: result = JsonConvert.DeserializeObject<PriceResult>(response); break; case ResultType.TL_ERROR_LENGTH: case ResultType.TL_ERROR_INVALID: case ResultType.TL_ERROR_EMPTY: case ResultType.TL_ERROR_OUTLIMIT: result = new TextResult { Text = "您的输入有误" }; break; case ResultType.TL_ERROR_SERVERERROR: case ResultType.TL_ERROR_SERVERUPDATE: result = new TextResult { Text = "服务器忙,暂时无法为您提供服务" }; break; case ResultType.TL_ERROR_NOTSUPPORT: result = new TextResult { Text = "俺还小,您说的这个还得慢慢学习,以后再来试吧" }; break; default: result = new TextResult { Text = "俺还小,不知道你在说啥子(⊙_⊙)?" }; break; } return result.ToTuLingResult(efhName, userFlag); }
その後、取得したTuLingResultのデータをWeChatで必要なXMLにシリアル化できます
var requestResult = TuLingService.Instance.GetMsgFromResponse(content, userName, efhName); responseContent = MsgService.Instance.ResponseXML(requestResult.Data, requestResult.DataType);return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"), };
以上がWeb API を使用して WeChat パブリック アカウントを開発し、Turing ロボット インターフェイスを呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。