这篇文章主要介绍“android微信公众号开发实例分析”,在日常操作中,相信很多人在android微信公众号开发实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”android微信公众号开发实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
开发前说明:
我们需要用到 StreamReader
所以需要引用:using System.IO;
上面讲了一些微信给我们的规则
我们现在要用这些规则获取我们想要的东西。
第一步:获取那串 XML 这个是最重要的,因为没这个XML,我们就相当于啥都没有。(我们的信息来源就是这个XML)
这里我使用 StreamReader 来获取 Request.Body
因为XML主要是 Request.Body 里面的
//声明一个XML方便调用
string xml="";
//获取我们的流
var reader = new StreamReader(Request.Body);
//把流里面的读取出来,就是我们这串XML了。
var contentFromBody = reader.ReadToEnd();
//再保存进我们的这个字符串里,方便后期使用
xml = contentFromBody;
我们读取XML中的信息,并将其转成我们的微信信息对象。
这里呢。我借用了一位大佬的代码:
专门处理微信消息的几个类
第一个类:
MessageFromWeiXin:
using System.Collections.Generic;
namespace 命名空间(各位懂的)
{
/// <summary>
/// 来自微信的消息请求:基类
/// </summary>
public class MessageFromWeiXin
{
/// <summary>
/// 开发者微信号:接收到消息的公众号帐号
/// </summary>
public string ToUserName { get; set; }
/// <summary>
/// 发送方帐号(一个OpenID,引起这条消息的微信用户)
/// </summary>
public string FromUserName { get; set; }
/// <summary>
/// 消息创建时间 (整型)
/// </summary>
public long CreateTime { get; set; }
/// <summary>
/// 消息id,64位整型
/// </summary>
public long MsgId { get; set; }
/// <summary>
/// 消息类型
/// </summary>
public MessageFromWeiXinType MsgType { get; set; }
}
#region 普通消息
/// <summary>
/// 来自微信的【文本】消息请求
/// </summary>
public class TextMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 文本消息内容
/// </summary>
public string Content { get; set; }
}
/// <summary>
/// 来自微信的【图片】消息请求
/// </summary>
public class ImageMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 图片链接(由系统生成)
/// </summary>
public string PicUrl { get; set; }
/// <summary>
/// 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
/// </summary>
public string MediaId { get; set; }
}
/// <summary>
/// 来自微信的【语音】消息请求
/// </summary>
public class VoiceMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 语音消息媒体id,可以调用多媒体文件下载接口拉取该媒体
/// </summary>
public string MediaId { get; set; }
/// <summary>
/// 语音格式:amr
/// </summary>
public string Format { get; set; }
/// <summary>
/// 语音识别结果,UTF8编码(需要开通此服务)
/// </summary>
public string Recognition { get; set; }
}
/// <summary>
/// 来自微信的【文本】消息请求
/// </summary>
public class VideoMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
/// </summary>
public string MediaId { get; set; }
/// <summary>
/// 视频消息缩略图的媒体id,可以调用
/// </summary>
public string ThumbMediaId { get; set; }
}
/// <summary>
/// 来自微信的【小视频】消息请求
/// </summary>
public class ShortVideoMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
/// </summary>
public string MediaId { get; set; }
/// <summary>
/// 视频消息缩略图的媒体id,可以调用
/// </summary>
public string ThumbMediaId { get; set; }
}
/// <summary>
/// 来自微信的【位置】消息请求
/// </summary>
public class LocationMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 地理位置维度【纬度】
/// </summary>
public float Location_X { get; set; }
/// <summary>
/// 地理位置经度
/// </summary>
public float Location_Y { get; set; }
/// <summary>
/// 地图缩放大小
/// </summary>
public int Scale { get; set; }
/// <summary>
/// 地理位置信息
/// </summary>
public string Label { get; set; }
}
/// <summary>
/// 来自微信的【位置】消息请求
/// </summary>
public class LinkMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 消息标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 消息描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 消息链接
/// </summary>
public string Url { get; set; }
}
#endregion
#region 事件消息
/// <summary>
/// 基本的事件消息:关注,取消关注事件
/// </summary>
public class EventMessageFromWeiXin : MessageFromWeiXin
{
/// <summary>
/// 事件类型
/// </summary>
public EventMessageFromWeiXinType Event { get; set; }
}
/// <summary>
/// 用户扫码事件:已关注用户事件类型为 SCAN,未关注的用户类型为 subscribe
/// </summary>
public class SanEventMessageFromWeiXin : EventMessageFromWeiXin
{
/// <summary>
/// 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id,但这里作为字符串
/// </summary>
public string EventKey { get; set; }
/// <summary>
/// 二维码的ticket,可用来换取二维码图片
/// </summary>
public string Ticket { get; set; }
}
/// <summary>
/// 上报地理位置事件
/// </summary>
public class LocationEventMessageFromWeiXin : EventMessageFromWeiXin
{
/// <summary>
/// 地理位置纬度
/// </summary>
public float Latitude { get; set; }
/// <summary>
/// 地理位置经度
/// </summary>
public float Longitude { get; set; }
/// <summary>
/// 地理位置精度
/// </summary>
public float Precision { get; set; }
}
/// <summary>
/// 点击菜单拉取消息事件
/// </summary>
public class ClickEventMessageFromWeiXin : EventMessageFromWeiXin
{
/// <summary>
/// 事件KEY值,与自定义菜单接口中KEY值对应
/// </summary>
public string EventKey { get; set; }
}
/// <summary>
/// 点击菜单跳转链接事件
/// </summary>
public class ViewEventMessageFromWeiXin : EventMessageFromWeiXin
{
/// <summary>
/// 事件KEY值,设置的跳转URL
/// </summary>
public string EventKey { get; set; }
}
/// <summary>
/// 群发消息完成事件
/// </summary>
public class MassSendJobFinishMessageFromWeiXin : EventMessageFromWeiXin
{
/// <summary>
/// 状态
/// </summary>
public string Status { get; set; }
/// <summary>
/// 标签粉丝数,或OpenId列表中粉丝数
/// </summary>
public int TotalCount { get; set; }
/// <summary>
/// 过滤(过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,FilterCount = SentCount + ErrorCount
/// </summary>
public int FilterCount { get; set; }
/// <summary>
/// 发送成功的粉丝数
/// </summary>
public int SentCount { get; set; }
/// <summary>
/// 发送失败的粉丝数
/// </summary>
public int ErrorCount { get; set; }
/// <summary>
/// 原创校验结果
/// </summary>
public CopyrightCheckResult CopyrightCheckResult { get; set; }
}
/// <summary>
/// 原创校验结果
/// </summary>
public class CopyrightCheckResult
{
/// <summary>
/// 图文个数
/// </summary>
public int Count { get; set; }
/// <summary>
/// 各个单图文校验结果
/// </summary>
public List<CopyrightCheckItem> ResultList { get; set; }
/// <summary>
/// 1-未被判为转载,可以群发,2-被判为转载,可以群发,3-被判为转载,不能群发
/// </summary>
public int CheckState { get; set; }
}
/// <summary>
/// 单图文原创校验结果
/// </summary>
public class CopyrightCheckItem
{
/// <summary>
/// 群发文章的序号,从1开始
/// </summary>
public int ArticleIdx { get; set; }
/// <summary>
/// 用户声明文章的状态
/// </summary>
public int UserDeclareState { get; set; }
/// <summary>
/// 系统校验的状态
/// </summary>
public int AuditState { get; set; }
/// <summary>
/// 相似原创文的url
/// </summary>
public string OriginalArticleUrl { get; set; }
/// <summary>
/// 相似原创文的类型
/// </summary>
public int OriginalArticleType { get; set; }
/// <summary>
/// 是否能转载
/// </summary>
public int CanReprint { get; set; }
/// <summary>
/// 是否需要替换成原创文内容
/// </summary>
public int NeedReplaceContent { get; set; }
/// <summary>
/// 否需要注明转载来源
/// </summary>
public int NeedShowReprintSource { get; set; }
}
/// <summary>
/// 模版消息发送完成事件
/// </summary>
public class TEMPLATESENDJOBFINISHMessageFromWeiXin : EventMessageFromWeiXin
{
/// <summary>
/// 状态:success 成功;failed:user block 用户拒绝;failed: system failed 非用户拒绝
/// </summary>
public string Status { get; set; }
}
#endregion
/// <summary>
/// 微信服务器推送过来的消息类型
/// </summary>
public enum MessageFromWeiXinType
{
/// <summary>
/// 未知
/// </summary>
unknown = 1,
/// <summary>
/// 文本消息
/// </summary>
text = 2,
/// <summary>
/// 图片消息
/// </summary>
image = 3,
/// <summary>
/// 语音消息
/// </summary>
voice = 4,
/// <summary>
/// 视频消息
/// </summary>
video = 5,
/// <summary>
/// 小视频消息
/// </summary>
shortvideo = 6,
/// <summary>
/// 地里位置消息
/// </summary>
location = 7,
/// <summary>
/// 连接消息
/// </summary>
link = 8,
/// <summary>
/// 事件推送消息
/// </summary>
@event = 9
}
/// <summary>
/// 微信服务器推送过来的【事件】消息的子类型
/// </summary>
public enum EventMessageFromWeiXinType
{
/// <summary>
/// 未知
/// </summary>
unknown = 1,
/// <summary>
/// 订阅事件;未关注用户扫码关注也是这个类型,但数据结构与SCAN类型相同,此时相当于两个类型的合并
/// </summary>
subscribe = 2,
/// <summary>
/// 取消订阅事件
/// </summary>
unsubscribe = 3,
/// <summary>
/// 扫描带参数二维码事件
/// </summary>
SCAN = 4,
/// <summary>
/// 上报地理位置事件
/// </summary>
LOCATION = 5,
/// <summary>
/// 点击自定义菜单拉取消息事件
/// </summary>
CLICK = 6,
/// <summary>
/// 点击自定义菜单跳转链接事件
/// </summary>
VIEW = 7,
/// <summary>
/// 群发消息发送结束事件
/// </summary>
MASSSENDJOBFINISH = 8,
/// <summary>
/// 模板消息发送结束事件
/// </summary>
TEMPLATESENDJOBFINISH = 9
}
}
第二个类:
ResponseClient:
using System.Xml;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
namespace 命名空间(各位懂的)
{
/// <summary>
/// XML消息识别
/// </summary>
public static class ResponseClient
{
/// <summary>
/// 判断消息类型
/// </summary>
public static MessageFromWeiXinType GetMsgType(string msg)
{
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(msg);
if (TryGetFirstTagText(ref xmlDocument, "MsgType", out var txt) &&
Enum.TryParse(txt, out MessageFromWeiXinType Type)) return Type;
return MessageFromWeiXinType.unknown;
}
/// <summary>
/// XML转消息对象
/// </summary>
public static MessageFromWeiXin XmlToMessageFromWeiXin(string xml)
{
xml = xml.Replace("< !", "<!").Replace("] ]","]]");
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
var txt = string.Empty;
var @int = 0;
if (TryGetFirstTagText(ref xmlDocument, "MsgType", out txt) &&
Enum.TryParse(txt, out MessageFromWeiXinType messageType))
{
MessageFromWeiXin msg = null;
switch (messageType)
{
case MessageFromWeiXinType.text: //文本消息
msg = new TextMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.text,
Content = TryGetFirstTagText(ref xmlDocument, "Content", out txt) ? txt : ""
};
break;
case MessageFromWeiXinType.image: //图片消息
msg = new ImageMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.image,
MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",
PicUrl = TryGetFirstTagText(ref xmlDocument, "PicUrl", out txt) ? txt : ""
};
break;
case MessageFromWeiXinType.voice: //语音消息
msg = new VoiceMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.voice,
MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",
Recognition = TryGetFirstTagText(ref xmlDocument, "Recognition", out txt) ? txt : "",
Format = TryGetFirstTagText(ref xmlDocument, "Format", out txt) ? txt : ""
};
break;
case MessageFromWeiXinType.video: //视频消息
msg = new VideoMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.video,
MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",
ThumbMediaId = TryGetFirstTagText(ref xmlDocument, "ThumbMediaId", out txt) ? txt : ""
};
break;
case MessageFromWeiXinType.shortvideo: //小视频消息
msg = new ShortVideoMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.shortvideo,
MediaId = TryGetFirstTagText(ref xmlDocument, "MediaId", out txt) ? txt : "",
ThumbMediaId = TryGetFirstTagText(ref xmlDocument, "ThumbMediaId", out txt) ? txt : ""
};
break;
case MessageFromWeiXinType.link: //链接消息
msg = new LinkMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.link,
Description = TryGetFirstTagText(ref xmlDocument, "Description", out txt) ? txt : "",
Title = TryGetFirstTagText(ref xmlDocument, "Title", out txt) ? txt : "",
Url = TryGetFirstTagText(ref xmlDocument, "Url", out txt) ? txt : ""
};
break;
case MessageFromWeiXinType.location: //位置消息
msg = new LocationMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.location,
Label = TryGetFirstTagText(ref xmlDocument, "Label", out txt) ? txt : "",
Location_X =
TryGetFirstTagText(ref xmlDocument, "Location_X", out txt) ? Convert.ToSingle(txt) : 0,
Location_Y =
TryGetFirstTagText(ref xmlDocument, "Location_Y", out txt) ? Convert.ToSingle(txt) : 0,
Scale = TryGetFirstTagText(ref xmlDocument, "Scale", out txt) ? Convert.ToInt32(txt) : 0
};
break;
case MessageFromWeiXinType.@event: //事件消息
if (TryGetFirstTagText(ref xmlDocument, "Event", out txt))
{
var Event = Enum.TryParse(txt, out EventMessageFromWeiXinType eventMessageFromWeiXinType)
? eventMessageFromWeiXinType
: EventMessageFromWeiXinType.unknown;
switch (Event)
{
case EventMessageFromWeiXinType.subscribe: //关注事件
msg = new EventMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.subscribe
};
break;
case EventMessageFromWeiXinType.unsubscribe: //取消关注事件
msg = new EventMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.unsubscribe
};
break;
case EventMessageFromWeiXinType.SCAN: //扫码
msg = new SanEventMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.SCAN,
EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : "",
Ticket = TryGetFirstTagText(ref xmlDocument, "Ticket", out txt) ? txt : ""
};
break;
case EventMessageFromWeiXinType.CLICK: //点击自定义菜单等待消息响应
msg = new ClickEventMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.CLICK,
EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : ""
};
break;
case EventMessageFromWeiXinType.VIEW: //点击自定义菜单跳转到页面
msg = new ViewEventMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.VIEW,
EventKey = TryGetFirstTagText(ref xmlDocument, "EventKey", out txt) ? txt : ""
};
break;
case EventMessageFromWeiXinType.LOCATION: //授权取得位置事件
msg = new LocationEventMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.LOCATION,
Latitude = TryGetFirstTagText(ref xmlDocument, "Latitude", out txt)
? Convert.ToSingle(txt)
: 0,
Longitude = TryGetFirstTagText(ref xmlDocument, "Longitude", out txt)
? Convert.ToSingle(txt)
: 0,
Precision = TryGetFirstTagText(ref xmlDocument, "Precision", out txt)
? Convert.ToSingle(txt)
: 0
};
break;
case EventMessageFromWeiXinType.MASSSENDJOBFINISH: //群发消息发送完成事件
var items = xmlDocument.GetElementsByTagName("item");
var itemsList = new List<CopyrightCheckItem>();
foreach (XmlNode i in items)
{
var item = new CopyrightCheckItem();
foreach (XmlNode j in i.ChildNodes)
switch (j.Name)
{
case "ArticleIdx":
item.ArticleIdx = int.TryParse(j.InnerText, out @int) ? @int : 0;
break;
case "UserDeclareState":
item.UserDeclareState =
int.TryParse(j.InnerText, out @int) ? @int : 0;
break;
case "AuditState":
item.AuditState = int.TryParse(j.InnerText, out @int) ? @int : 0;
break;
case "OriginalArticleUrl":
item.OriginalArticleUrl = j.InnerText;
break;
case "OriginalArticleType":
item.OriginalArticleType =
int.TryParse(j.InnerText, out @int) ? @int : 0;
break;
case "CanReprint":
item.CanReprint = int.TryParse(j.InnerText, out @int) ? @int : 0;
break;
case "NeedReplaceContent":
item.NeedReplaceContent =
int.TryParse(j.InnerText, out @int) ? @int : 0;
break;
case "NeedShowReprintSource":
item.NeedShowReprintSource =
int.TryParse(j.InnerText, out @int) ? @int : 0;
break;
}
}
msg = new MassSendJobFinishMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.MASSSENDJOBFINISH,
Status = TryGetFirstTagText(ref xmlDocument, "Status", out txt) ? txt : "",
TotalCount =
TryGetFirstTagText(ref xmlDocument, "TotalCount", out txt)
? Convert.ToInt32(txt)
: 0,
FilterCount =
TryGetFirstTagText(ref xmlDocument, "FilterCount", out txt)
? Convert.ToInt32(txt)
: 0,
SentCount = TryGetFirstTagText(ref xmlDocument, "SentCount", out txt)
? Convert.ToInt32(txt)
: 0,
ErrorCount =
TryGetFirstTagText(ref xmlDocument, "ErrorCount", out txt)
? Convert.ToInt32(txt)
: 0,
CopyrightCheckResult = new CopyrightCheckResult
{
Count = TryGetFirstTagText(ref xmlDocument, "Count", out txt)
? Convert.ToInt32(txt)
: 0,
CheckState =
TryGetFirstTagText(ref xmlDocument, "CheckState", out txt)
? Convert.ToInt32(txt)
: 0,
ResultList = itemsList
}
};
break;
case EventMessageFromWeiXinType.TEMPLATESENDJOBFINISH: //模版消息发送完成事件
msg = new TEMPLATESENDJOBFINISHMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.TEMPLATESENDJOBFINISH,
Status = TryGetFirstTagText(ref xmlDocument, "", out txt) ? txt : ""
};
break;
default: //其他事件
msg = new EventMessageFromWeiXin
{
MsgType = MessageFromWeiXinType.@event,
Event = EventMessageFromWeiXinType.unknown
};
break;
}
}
break;
default: //未知消息
msg = new MessageFromWeiXin {MsgType = MessageFromWeiXinType.unknown};
break;
}
if (msg.MsgType != MessageFromWeiXinType.unknown)
{
if (TryGetFirstTagText(ref xmlDocument, "CreateTime", out txt))
msg.CreateTime = Convert.ToInt32(txt);
if (TryGetFirstTagText(ref xmlDocument, "FromUserName", out txt)) msg.FromUserName = txt;
if (TryGetFirstTagText(ref xmlDocument, "MsgId", out txt)) msg.MsgId = Convert.ToInt64(txt);
if (TryGetFirstTagText(ref xmlDocument, "ToUserName", out txt)) msg.ToUserName = txt;
return msg;
}
}
return null;
}
/// <summary>
/// 尝试取得XML中第一个指定标签的文本
/// </summary>
/// <param name="xml">xml文档对象</param>
/// <param name="tag">指定的标签名</param>
/// <param name="txt">取得的文本</param>
/// <returns>是否成功取得</returns>
public static bool TryGetFirstTagText(ref XmlDocument xml, string tag, out string txt)
{
txt = string.Empty;
var Node = xml.GetElementsByTagName(tag);
if (Node.Count > 0)
{
txt = Node[0].InnerText;
if (!string.IsNullOrWhiteSpace(txt)) return true;
}
return false;
}
/// <summary>
/// 验证微信接口
/// </summary>
/// <param name="echostr"></param>
/// <param name="nonce"></param>
/// <param name="signature"></param>
/// <param name="timestamp"></param>
/// <param name="token"></param>
/// <returns></returns>
public static bool VerificationSignature(string echostr, string nonce, string signature, string timestamp,
string token)
{
string[] StrArray = {token, timestamp, nonce};
Array.Sort(StrArray);
var ArrayString = new StringBuilder();
for (var i = 0; i < StrArray.Length; i++) ArrayString.Append(StrArray[i]);
var strHash = GetSha1Hash(ArrayString.ToString());
return signature == strHash;
}
/// <summary>
/// 哈希1
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string GetSha1Hash(string input)
{
var inputBytes = Encoding.Default.GetBytes(input);
SHA1 sha = new SHA1CryptoServiceProvider();
var result = sha.ComputeHash(inputBytes);
var sBuilder = new StringBuilder();
for (var i = 0; i < result.Length; i++) sBuilder.Append(result[i].ToString("x2"));
return sBuilder.ToString();
}
/// <summary>
/// 时间转时间戳
/// </summary>
public static long ConvertDateTimeToInt(DateTime dateTime)
{
var startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
var t = (dateTime.Ticks - startTime.Ticks) / 10000; //除10000调整为13位
return t;
}
}
}
有了这两个类,我们的东西就好开展了,如果大家有发现报错的话,是因为string扩展类的问题。需要的留下邮箱,这个东西太长了。不好发,不过大家应该都看的懂,自己写一套也好。
使用上面第二个类中的,这个方法,进行转换 : XmlToMessageFromWeiXin
得到我们 msg 对象
我们这个对象里面有msgtype,这个type枚举呢,就对应了各个事件。
我们写个switch就能将他们分开了。不同事件进入不同分支处理。
/// <summary>
/// 接收来自微信的消息
/// </summary>
[HttpPost]
[Route("api/WeChat")]
public string Post(string xml)
{
System.Console.WriteLine("进入消息处理");
var reader = new StreamReader(Request.Body);
var contentFromBody = reader.ReadToEnd();
System.Console.WriteLine($"xml:{contentFromBody}");
xml = contentFromBody;
try
{
var msg = ResponseClient.XmlToMessageFromWeiXin(xml);
var Response = "";
switch (msg.MsgType)
{
case MessageFromWeiXinType.text:
var textMsg = (TextMessageFromWeiXin)msg;
Response = "<xml> <ToUserName><![CDATA[" + textMsg.FromUserName +
"]]></ToUserName> <FromUserName><![CDATA[" + textMsg.ToUserName +
"]]></FromUserName> <CreateTime>" +
ResponseClient.ConvertDateTimeToInt(DateTime.Now) +
"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您说“" +
textMsg.Content + "”,小女子暂时还不明白,等小女子日后博学之时再来答复您。]]></Content> </xml>";
break;
case MessageFromWeiXinType.image:
var imgMsg = (ImageMessageFromWeiXin)msg;
System.Console.WriteLine($"图片地址:{imgMsg.PicUrl}");
Response = "<xml> <ToUserName><![CDATA[" + imgMsg.FromUserName +
"]]></ToUserName> <FromUserName><![CDATA[" + imgMsg.ToUserName +
"]]></FromUserName> <CreateTime>" +
ResponseClient.ConvertDateTimeToInt(DateTime.Now) +
"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一张 图片,小女子已经帮您保存起来了]]></Content> </xml>";
break;
case MessageFromWeiXinType.voice:
var voiceMsg = (VoiceMessageFromWeiXin)msg;
//如果有开通语音识别的功能,我们可以使用这个字段:Recognition
System.Console.WriteLine($"音频转文字:{voiceMsg.Recognition}");
//我们下载这串语音的话就要使用这个字段:MediaId,根据这个字段加上微信提供的多媒体下载接口 ,下载 我们的音频文件。记得及时下载哟
System.Console.WriteLine($"音频下载地址:{voiceMsg.MediaId}");
Response = "<xml> <ToUserName><![CDATA[" + voiceMsg.FromUserName +
"]]></ToUserName> <FromUserName><![CDATA[" + voiceMsg.ToUserName +
"]]></FromUserName> <CreateTime>" +
ResponseClient.ConvertDateTimeToInt(DateTime.Now) +
"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一串 语音,小女子已经帮您保存起来了]]></Content> </xml>";
break;
case MessageFromWeiXinType.shortvideo:
var shortvideo = (ShortVideoMessageFromWeiXin)msg;
//我们下载这串语音的话就要使用这个字段:MediaId,根据这个字段加上微信提供的多媒体下载接口 ,下载 我们的视频文件。记得及时下载哟
System.Console.WriteLine($"小视频下载地址:{shortvideo.MediaId}");
Response = "<xml> <ToUserName><![CDATA[" + shortvideo.FromUserName +
"]]></ToUserName> <FromUserName><![CDATA[" + shortvideo.ToUserName +
"]]></FromUserName> <CreateTime>" +
ResponseClient.ConvertDateTimeToInt(DateTime.Now) +
"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个小视频,小女子已经帮您保存起来了]]></Content> </xml>";
break;
case MessageFromWeiXinType.video:
var video = (VideoMessageFromWeiXin)msg;
//我们下载这串语音的话就要使用这个字段:MediaId,根据这个字段加上微信提供的多媒体下载接口 ,下载 我们的视频文件。记得及时下载哟
System.Console.WriteLine($"视频下载地址:{video.MediaId}");
Response = "<xml> <ToUserName><![CDATA[" + video.FromUserName +
"]]></ToUserName> <FromUserName><![CDATA[" + video.ToUserName +
"]]></FromUserName> <CreateTime>" +
ResponseClient.ConvertDateTimeToInt(DateTime.Now) +
"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个视频,小女子已经帮您保存起来了]]></Content> </xml>";
break;
case MessageFromWeiXinType.location:
var location = (LocationMessageFromWeiXin)msg;
//我们的地址呢,主要有 地理位置纬度 Location_X ; 地理位置经度 Location_Y ; 地图缩放大小 Scale; 地理位置信息 Label
System.Console.WriteLine($"纬度:{location.Location_X}\n经度:{location.Location_Y}\n地图缩放大小:{location.Scale}\n地理位置信息:{location.Label}\n");
Response = "<xml> <ToUserName><![CDATA[" + location.FromUserName +
"]]></ToUserName> <FromUserName><![CDATA[" + location.ToUserName +
"]]></FromUserName> <CreateTime>" +
ResponseClient.ConvertDateTimeToInt(DateTime.Now) +
"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个 位置信息,小女子已经帮您记录下来了]]></Content> </xml>";
break;
case MessageFromWeiXinType.link:
var link = (LinkMessageFromWeiXin)msg;
//我们的链接呢,主要有 消息标题 Title ;消息描述 Description ;消息链接 Url
System.Console.WriteLine($"消息标题:{link.Title}\n消息描述:{link.Description}\n消息链接:{link.Url}\n");
Response = "<xml> <ToUserName><![CDATA[" + link.FromUserName +
"]]></ToUserName> <FromUserName><![CDATA[" + link.ToUserName +
"]]></FromUserName> <CreateTime>" +
ResponseClient.ConvertDateTimeToInt(DateTime.Now) +
"</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[您发了一个 链接:标题:" + link.Title + " , 地址: " + link.Url + " ,小女子已经帮您记录下来了]]></Content> </xml>";
break;
}
return Response;
// return "success";
}
catch (Exception ex)
{
return "error";
}
}
到此,关于“android微信公众号开发实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://blog.51cto.com/u_13628828/5719273