웹 API를 사용하여 WeChat 공개 계정을 개발하여 Turing 로봇 인터페이스를 호출하는 방법

高洛峰
풀어 주다: 2017-03-24 14:23:09
원래의
3119명이 탐색했습니다.

수동 응답 메시지(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!