WeChat development for receiving text messages
The message types in WeChat are: text, picture, voice, video, geographical location, link and event message. Except for event messages, the others are collectively called ordinary messages. The push and response of messages in WeChat are transmitted in xml data packets. When a user sends a message to an official account, if the WeChat server does not receive a response within five seconds, it will disconnect and re-initiate the request, retrying a total of three times. Ordinary messages can be deduplicated using msgid to avoid the impact of duplicate messages on business logic.
If the server cannot guarantee to process and reply within five seconds, you can directly reply with an empty string. The WeChat server will not process this request and will not initiate a retry. It should be noted that the reply to the empty string mentioned here is not to reply to an empty text message, but to respond directly to Response.Write("").
The following is a brief explanation of each common message.
Text message:
<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>
Picture message:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[this is a url]]></PicUrl> <MediaId><![CDATA[media_id]]></MediaId> <MsgId>1234567890123456</MsgId> </xml>
Voice message:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[voice]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><Format><![CDATA[Format]]></Format><MsgId>1234567890123456</MsgId></xml>
Video message:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[video]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><MsgId>1234567890123456</MsgId></xml>
Geolocation message:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId></xml>
Link message:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[link]]></MsgType><Title><![CDATA[公众平台官网链接]]></Title><Description><![CDATA[公众平台官网链接]]></Description><Url><![CDATA[url]]></Url><MsgId>1234567890123456</MsgId></xml>
Careful programmers should have discovered that all messages (including event messages) contain the following fields
Parameter | Description |
---|---|
ToUserName | Receiver’s WeChat ID |
FromUserName | Sender’s WeChat ID, if it is normal The user is an OpenID |
CreateTime | Message creation time |
MsgType | Message type |
The types of messages have been mentioned at the beginning of the article, they are: text, image, voice, video, geographical location (location), link (link), event (event)
In order to facilitate management and code writing, we can write an enumeration for these message types. As follows:
/// <summary> /// 消息类型枚举 /// </summary> public enum MsgType { /// <summary> ///文本类型 /// </summary> TEXT, /// <summary> /// 图片类型 /// </summary> IMAGE, /// <summary> /// 语音类型 /// </summary> VOICE, /// <summary> /// 视频类型 /// </summary> VIDEO, /// <summary> /// 地理位置类型 /// </summary> LOCATION, /// <summary> /// 链接类型 /// </summary> LINK, /// <summary> /// 事件类型 /// </summary> EVENT }
Let me explain here, event is a keyword in C#, so event cannot be used in enumerations, so for the sake of uniformity, I use all uppercase for enumerations here.
Since all message bodies have the above fields, you can write a base class, and then different message entities inherit this base class. (I have been struggling with a problem. I used to write all the fields in the message body in a class, which is very convenient to call. However, there are more and more fields in the class, which makes me uncomfortable. In addition, I I have little knowledge and object-oriented and am not proficient in using it, so I always list all the fields in a class
When calling, directly var ss = WeiXinRequest.RequestHelper(token, EncodingAESKey, appid ; The readability has been improved, but calling it is not as convenient as before. Friends, please give me some suggestions
)
The following are the base classes of each message entity:
public abstract class BaseMessage { /// <summary> /// 开发者微信号 /// </summary> public string ToUserName { get; set; } /// <summary> /// 发送方帐号(一个OpenID) /// </summary> public string FromUserName { get; set; } /// <summary> /// 消息创建时间 (整型) /// </summary> public string CreateTime { get; set; } /// <summary> /// 消息类型 /// </summary> public MsgType MsgType { get; set; } public virtual void ResponseNull() { Utils.ResponseWrite(""); } public virtual void ResText(EnterParam param, string content) { } /// <summary> /// 回复消息(音乐) /// </summary> public void ResMusic(EnterParam param, Music mu) { } public void ResVideo(EnterParam param, Video v) { } /// <summary> /// 回复消息(图片) /// </summary> public void ResPicture(EnterParam param, Picture pic, string domain) { } /// <summary> /// 回复消息(图文列表) /// </summary> /// <param name="param"></param> /// <param name="art"></param> public void ResArticles(EnterParam param, List<Articles> art) { } /// <summary> /// 多客服转发 /// </summary> /// <param name="param"></param> public void ResDKF(EnterParam param) { } /// <summary> /// 多客服转发如果指定的客服没有接入能力(不在线、没有开启自动接入或者自动接入已满),该用户会一直等待指定客服有接入能力后才会被接入,而不会被其他客服接待。建议在指定客服时,先查询客服的接入能力指定到有能力接入的客服,保证客户能够及时得到服务。 /// </summary> /// <param name="param">用户发送的消息体</param> /// <param name="KfAccount">多客服账号</param> public void ResDKF(EnterParam param, string KfAccount) { } private void Response(EnterParam param, string data) { } }
/// <summary> /// 微信接入参数 /// </summary> public class EnterParam { /// <summary> /// 是否加密 /// </summary> public bool IsAes { get; set; } /// <summary> /// 接入token /// </summary> public string token { get; set; } /// <summary> ///微信appid /// </summary> public string appid { get; set; } /// <summary> /// 加密密钥 /// </summary> public string EncodingAESKey { get; set; } }
public class TextMessage:BaseMessage { /// <summary> /// 消息内容 /// </summary> public string Content { get; set; } /// <summary> /// 消息id,64位整型 /// </summary> public string MsgId { get; set; } }
public class ImgMessage : BaseMessage { /// <summary> /// 图片路径 /// </summary> public string PicUrl { get; set; } /// <summary> /// 消息id,64位整型 /// </summary> public string MsgId { get; set; } /// <summary> /// 媒体ID /// </summary> public string MediaId { get; set; } }
public class VoiceMessage : BaseMessage { /// <summary> /// 缩略图ID /// </summary> public string MsgId { get; set; } /// <summary> /// 格式 /// </summary> public string Format { get; set; } /// <summary> /// 媒体ID /// </summary> public string MediaId { get; set; } /// <summary> /// 语音识别结果 /// </summary> public string Recognition { get; set; } }
public class VideoMessage : BaseMessage { /// <summary> /// 缩略图ID /// </summary> public string ThumbMediaId { get; set; } /// <summary> /// 消息id,64位整型 /// </summary> public string MsgId { get; set; } /// <summary> /// 媒体ID /// </summary> public string MediaId { get; set; } }
public class LinkMessage : BaseMessage { /// <summary> /// 缩略图ID /// </summary> public string MsgId { get; set; } /// <summary> /// 标题 /// </summary> public string Title { get; set; } /// <summary> /// 描述 /// </summary> public string Description { get; set; } /// <summary> /// 链接地址 /// </summary> public string Url { get; set; } }
public static T ConvertObj<T>(string xmlstr) { XElement xdoc = XElement.Parse(xmlstr); var type = typeof(T); var t = Activator.CreateInstance<T>(); foreach (XElement element in xdoc.Elements()) { var pr = type.GetProperty(element.Name.ToString()); if (element.HasElements) {//这里主要是兼容微信新添加的菜单类型。nnd,竟然有子属性,所以这里就做了个子属性的处理 foreach (var ele in element.Elements()) { pr = type.GetProperty(ele.Name.ToString()); pr.SetValue(t, Convert.ChangeType(ele.Value, pr.PropertyType), null); } continue; } if (pr.PropertyType.Name == "MsgType")//获取消息模型 { pr.SetValue(t, (MsgType)Enum.Parse(typeof(MsgType), element.Value.ToUpper()), null); continue; } if (pr.PropertyType.Name == "Event")//获取事件类型。 { pr.SetValue(t, (Event)Enum.Parse(typeof(Event), element.Value.ToUpper()), null); continue; } pr.SetValue(t, Convert.ChangeType(element.Value, pr.PropertyType), null); } return t; }
public class MessageFactory { public static BaseMessage CreateMessage(string xml) { XElement xdoc = XElement.Parse(xml); var msgtype = xdoc.Element("MsgType").Value.ToUpper(); MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype); switch (type) { case MsgType.TEXT: return Utils.ConvertObj<TextMessage>(xml); case MsgType.IMAGE: return Utils.ConvertObj<ImgMessage>(xml); case MsgType.VIDEO: return Utils.ConvertObj<VideoMessage>(xml); case MsgType.VOICE: return Utils.ConvertObj<VoiceMessage>(xml); case MsgType.LINK: return Utils.ConvertObj<LinkMessage>(xml); case MsgType.LOCATION: return Utils.ConvertObj<LocationMessage>(xml); case MsgType.EVENT://事件类型 { } break; default: return Utils.ConvertObj<BaseMessage>(xml); } } }
public class WxRequest { public static BaseMessage Load(EnterParam param, bool bug = true) { string postStr = ""; Stream s = VqiRequest.GetInputStream();//此方法是对System.Web.HttpContext.Current.Request.InputStream的封装,可直接代码 byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); postStr = Encoding.UTF8.GetString(b);//获取微信服务器推送过来的字符串 var timestamp = VqiRequest.GetQueryString("timestamp"); var nonce = VqiRequest.GetQueryString("nonce"); var msg_signature = VqiRequest.GetQueryString("msg_signature"); var encrypt_type = VqiRequest.GetQueryString("encrypt_type"); string data = ""; if (encrypt_type=="aes")//加密模式处理 { param.IsAes = true; var ret = new MsgCrypt(param.token, param.EncodingAESKey, param.appid); int r = ret.DecryptMsg(msg_signature, timestamp, nonce, postStr, ref data); if (r != 0) { WxApi.Base.WriteBug("消息解密失败"); return null; } } else { param.IsAes = false; data = postStr; } if (bug) { Utils.WriteTxt(data); } return MessageFactory.CreateMessage(data); } }
1.
WeChat public account platform source code download
2.WeChat LaLa Takeout 2.2.4 decrypted open source version of WeChat Rubik’s Cube source code
The above is the detailed content of WeChat development for receiving text messages. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

PHP is an open source scripting language that is widely used in web development and server-side programming, especially in WeChat development. Today, more and more companies and developers are starting to use PHP for WeChat development because it has become a truly easy-to-learn and easy-to-use development language. In WeChat development, message encryption and decryption are a very important issue because they involve data security. For messages without encryption and decryption methods, hackers can easily obtain the data, posing a threat to users.

WeChat is currently one of the social platforms with the largest user base in the world. With the popularity of mobile Internet, more and more companies are beginning to realize the importance of WeChat marketing. When conducting WeChat marketing, customer service is a crucial part. In order to better manage the customer service chat window, we can use PHP language for WeChat development. 1. Introduction to PHP WeChat development PHP is an open source server-side scripting language that is widely used in the field of Web development. Combined with the development interface provided by WeChat public platform, we can use PHP language to conduct WeChat

In the development of WeChat public accounts, user tag management is a very important function, which allows developers to better understand and manage their users. This article will introduce how to use PHP to implement the WeChat user tag management function. 1. Obtain the openid of the WeChat user. Before using the WeChat user tag management function, we first need to obtain the user's openid. In the development of WeChat public accounts, it is a common practice to obtain openid through user authorization. After the user authorization is completed, we can obtain the user through the following code

With the popularity of WeChat, more and more companies are beginning to use it as a marketing tool. The WeChat group messaging function is one of the important means for enterprises to conduct WeChat marketing. However, if you only rely on manual sending, it is an extremely time-consuming and laborious task for marketers. Therefore, it is particularly important to develop a WeChat mass messaging tool. This article will introduce how to use PHP to develop WeChat mass messaging tools. 1. Preparation work To develop WeChat mass messaging tools, we need to master the following technical points: Basic knowledge of PHP WeChat public platform development Development tools: Sub

With the development of the Internet and mobile smart devices, WeChat has become an indispensable part of the social and marketing fields. In this increasingly digital era, how to use PHP for WeChat development has become the focus of many developers. This article mainly introduces the relevant knowledge points on how to use PHP for WeChat development, as well as some of the tips and precautions. 1. Development environment preparation Before developing WeChat, you first need to prepare the corresponding development environment. Specifically, you need to install the PHP operating environment and the WeChat public platform

As WeChat becomes an increasingly important communication tool in people's lives, its agile messaging function is quickly favored by a large number of enterprises and individuals. For enterprises, developing WeChat into a marketing platform has become a trend, and the importance of WeChat development has gradually become more prominent. Among them, the group sending function is even more widely used. So, as a PHP programmer, how to implement group message sending records? The following will give you a brief introduction. 1. Understand the development knowledge related to WeChat public accounts. Before understanding how to implement group message sending records, I

ThinkPHP6 WeChat Development Guide: Quickly Build WeChat Public Account Application Introduction: As an important social media platform, WeChat public account provides great opportunities for individuals and enterprises in marketing, information dissemination and other aspects. In this article, we will introduce how to use ThinkPHP6 to quickly build a WeChat public account application, and provide some commonly used code examples. Environment preparation Before starting development, we first need to prepare the following environment: PHP7 or above version ThinkPHP6 framework WeChat public account

With the popularity of mobile Internet, more and more people are using WeChat as a social software, and the WeChat open platform has also brought many opportunities to developers. In recent years, with the development of artificial intelligence technology, speech recognition technology has gradually become one of the popular technologies in mobile terminal development. In WeChat development, how to implement speech recognition has become a concern for many developers. This article will introduce how to use PHP to develop WeChat applications to implement speech recognition functions. 1. Principles of Speech Recognition Before introducing how to implement speech recognition, let us first understand the language
