热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用webapi开发微信公众号调用图灵机器人接口的方法

这篇文章详解使用webapi开发微信公众号调用图灵机器人接口的方法

被动响应消息(返回XML)

微信要求我们返回XML数据,且格式是规定好的,具体请看

微信公众平台开发者文档。

响应的实体类,我们之前已经写好了,因为要求是XML格式。
我们在此使用微软提供的System.Xml.Serialization.XmlSerializer来将我们的数据序列化为XML。
所以我们在类上边标记了XmlRoot特性,在枚举的字段上边标记了XmlEnum特性,NewsMsg中在文章列表上标记了XmlArray和XmlArrayItem特性。而后反序列化出来的便是微信要求的格式了。

序列化方法如下:

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的命名空间,不然微信不识别

完整方法奉上:

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"),
    };
}

至此,我们已经完成了微信被动回复消息的响应。

映射图灵消息及微信消息

上边我们已经实现了被动回复消息的功能,接下来我们需要将图灵机器人接口与我们的公众平台关联起来。

分析图灵机器人返回的参数,我们发现所有类型的内容都有code和text参数。又因为我们需要将图灵的消息与微信的响应消息直接对应起来,因此我们定义接口,提供转换方法

public class TuLingResult{    //消息类型(我们在序列化为XML的时候需要提供类型)
    public Type DataType { get; set; }    public object Data { get; set; }
}public interface IResponse{    TuLingResult ToTuLingResult(string fromUserName, string toUserName);
}

创建文本类数据的实体作为图灵消息的基类(对应微信的文本消息)

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
             }
        };
    }
}

而后依次创建各种数据的实体类。
如:新闻(对应微信的图文消息)

public class NewsResult : TextResult{    public List 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{    /// 
    /// 标题
    /// 
    public string Article { get; set; }    /// 
    /// 来源
    /// 
    public string Source { get; set; }    /// 
    /// 详情地址
    /// 
    public string DetailUrl { get; set; }    /// 
    /// 图标地址
    /// 
    public string Icon { get; set; }
}

同理创建图灵机器人提供的各类数据实体类

我们想要支持的数据实体都定义完毕后,我们便可以开始请求图灵接口,获取真实的消息了,在此我们使用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);
}

图灵返回了code标识消息的类型和错误信息,因此我们先将响应消息解析为TextResult,拿到图灵的类型。

先定义图灵类型枚举

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(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(response);            break;        case ResultType.TL_LINK_DATA:
            result = JsonConvert.DeserializeObject(response);            break;        case ResultType.TL_NEWS_DATA:
            result = JsonConvert.DeserializeObject(response);            break;        case ResultType.TL_TUWEN_DATA:
            result = JsonConvert.DeserializeObject(response);            break;        case ResultType.TL_TRAIN_DATA:
            result = JsonConvert.DeserializeObject(response);            break;        case ResultType.TL_AIRPORT_DATA:
            result = JsonConvert.DeserializeObject(response);            break;        case ResultType.TL_APP_DATA:
            result = JsonConvert.DeserializeObject(response);            break;        case ResultType.TL_HOTEL_DATA:
            result = JsonConvert.DeserializeObject(response);            break;        case ResultType.TL_PRICE_DATA:
            result = JsonConvert.DeserializeObject(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中的Data序列化为微信需要的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开发微信公众号调用图灵机器人接口的方法的详细内容,更多请关注php中文网其它相关文章!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
创办m觉e内能h行宫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有