版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何使用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<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;
}
}同理创建图灵机器人提供的各类数据实体类我们想要支持的数据实体都定义完毕后,我们便可以开始请求图灵接口,获取真实的消息了,在此我们使用HttpClient实现。private
const
string
TULING_API_URL
=
"/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<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
TextRes
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023版安全文明工地全方位策划方案
- 企业市场营销策略与实施方案
- 个人健康管理与预防疾病知识普及
- 如何设计一份高效的汇报
- 《文旅融合背景下博物馆旅游品质提升研究》
- 《五星级幼儿园科学探究活动设计与实施现状的调查研究》
- 《完善公益林生态补偿机制研究》
- 《基于机器视觉的位移跟踪系统的研发及应用》
- 2024-2030年中国水转印纸行业发展状况及前景趋势分析报告
- 小学同步课程设计
- 2025年重庆货运从业资格证考试题及答案详解
- 【新教材】苏教版小学科学三年级上册:全册单元试卷、期中期末总复习试卷
- 屋面板的拆除与更换施工方案
- 生命不是游戏拒绝死亡挑战主题班会
- 本地化部署合同
- 2024年云南省中考历史试卷
- 油气管线安全保护方案
- 国家职业技术技能标准 4-07-05-04 消防设施操作员 人社厅发201963号
- 新教科版小学1-6年级科学需做实验目录
- 2024-2030年中国辣椒碱市场占有率调查及经营战略可行性分析研究报告
- 全过程工程咨询项目部管理制度
评论
0/150
提交评论