수동 응답 메시지(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의 Text 메시지에 해당)로 텍스트 데이터의 엔터티를 생성합니다. )
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 유형을 가져옵니다. 먼저 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 }에 해당하는 Turing 유형 열거
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); }그런 다음 WeChat에서 요구하는 XML로 가져온 TuLingResult의 데이터를 직렬화할 수 있습니다
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"), };
위 내용은 웹 API를 사용하여 WeChat 공개 계정을 개발하여 Turing 로봇 인터페이스를 호출하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!