




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何使用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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030中国特殊标志信标浮标行业市场占有率及投资前景评估规划报告
- 医疗领域中心理干预对患者康复的影响
- 教育行业大数据未来的增长机会与挑战
- 教育信息化进程中的智能教学平台探讨
- 教育技术领域的新成果探讨
- 智能课堂技术与教育的深度融合
- 商业培训中的学习动力持续激发法
- 增强现实在职业培训中的应用前景
- 宁夏银川市宁夏大附属中学2024-2025学年数学七上期末联考试题含解析
- 2024年广东省深圳市龙文教育九年级化学第一学期期末综合测试模拟试题含解析
- 安全教育培训:实现安全文明施工
- 2025至2030分布式能源行业市场深度调研及发展规划及有效策略与实施路径评估报告
- 反邪教宣讲课件
- 2025年全国统一高考英语Ⅰ卷(含答案)
- 1 感受生活中的法律 课件-道德与法治六年级上册统编版
- 中医集市活动方案
- 2025年江苏省南京市中考历史试卷(含解析)
- 肿瘤随访登记培训
- 劳动仲裁内部培训
- 工厂注塑考试题及答案
- 肿瘤登记培训课件
评论
0/150
提交评论