不想听我扯皮的,直接看官方:
微信官方的文档 :
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

开发前说明:
我们需要用到 StreamReader

所以需要引用:using System.IO;

如果我们发现,我们的用户,发送文本消息到公众号。我们就针对文本消息进行处理。

首先我们看看官方文档。

<xml>  <ToUserName>< ![CDATA[toUser] ]></ToUserName>  <FromUserName>< ![CDATA[fromUser] ]></FromUserName>  <CreateTime>1348831860</CreateTime>  <MsgType>< ![CDATA[text] ]></MsgType>  <Content>< ![CDATA[this is a test] ]></Content>  <MsgId>1234567890123456</MsgId>  </xml>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType text
Content 文本消息内容
MsgId 消息id,64位整型

现在正式讲开发

上面讲了一些微信给我们的规则

我们现在要用这些规则获取我们想要的东西。

第一步:获取那串 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;}return Response;// return "success";}catch (Exception ex){return "error";}
}

欢迎进qq群交流:704028989

微信公众号简单开发(5)文本消息相关推荐

  1. python公众号留言功能_Python实现的微信公众号群发图片与文本消息功能实例详解...

    本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...

  2. python公众号留言功能详情_Python实现的微信公众号群发图片与文本消息功能实例详解...

    本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...

  3. 利用python 实现微信公众号群发图片与文本消息功能

    在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_token.如下: #获取微信access_token def get_token():payloa ...

  4. 微信公众号java开发:验证消息的确来自微信服务器

    微信公众号开发,微信服务需要认证服务,官方文档如下: 引入jar包如下: <dependency><groupId>com.github.binarywang</grou ...

  5. 微信公众号简单开发(1)介绍流程

    上一篇文章我们介绍了微信公众号开发需要用到一些id和密码之类的 如果还不清楚我们可以看看这篇文章 点我 : https://mp.weixin.qq.com/wiki?t=resource/res_m ...

  6. 微信公众号简单开发(6)图片消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  7. 微信公众号简单开发(10)链接消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  8. 微信公众号简单开发(7)语音消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

  9. 微信公众号简单开发(9)地理位置消息

    不想听我扯皮的,直接看官方: 微信官方的文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453 开发前说明 ...

最新文章

  1. linux驱动:i2c驱动(一)
  2. Phpcms与ucenter整合系统设置
  3. python3 socket shutdown 简介
  4. 美团医美发起“至美行动”,单月拦截六万余条虚假医美评价
  5. zwpython_零起点Python大数据与量化交易
  6. Linux 命令之 which -- 查找并显示给定命令的绝对路径(查找命令的位置/查询命令的位置/搜索命令的位置/查看命令的位置)
  7. 《活出生命的意义》:人生有何意义?
  8. iOS上架被拒理由及相关解决方案记录
  9. 拓端tecdat|R语言泰坦尼克号随机森林模型案例数据分析
  10. scrt 上传和下载文件
  11. 浪潮服务器支持pcie ssd硬盘吗,PCI-E与SATA SSD如何选?一分钟看懂
  12. 贪吃蛇项目难还是2048难c语言,贪吃蛇大战2048好玩吗 贪吃蛇大战2048玩法简介
  13. oracle dba培训教程 第九章 创建数据库
  14. Java课程设计-日历记事本
  15. python数学计算函数_python之数学函数篇
  16. 计算机专业和新能源专业哪个好就业,新能源科学与工程专业就业前景与方向(五篇)...
  17. LibGDX_1.1: LibGDX 跨平台游戏开发框架简介
  18. 戴尔t420服务器显示器无信号,显示器无信号的原因及解决方法
  19. Python识别中文
  20. Elasticsearch地理空间之geo_shape

热门文章

  1. 中国商品交易市场统计年鉴(2001-2020年)
  2. 北京交通大学925数据结构考研历年真题
  3. 记一次大型活动-圣诞苹果活动的心得
  4. CentOS 7 gcc、g++、gdb、zhs和oh-my-zsh安装配置 一条龙
  5. 路由器升级license
  6. Ravensword 2 掠夺之剑2 暗影大陆 图文攻略
  7. 使用eclipse安装python插件_如何为eclipse安装合适版本的python插件pydev
  8. 每天坚持刷 LeetCode 的人,究竟会变得有多强... 学习技巧都藏在这几个公众号里面了......
  9. 利用神经网络对常见水果进行分类
  10. 【华为云-开发者专属集市】DevCloud+ECS、MySQL搭建WordPress