This article introduces how to handle messages and events in the development of WeChat public accounts, including: (1) Overview of messages (events); (2) Verifying the authenticity of messages; (3) Parsing messages; (4) Passively replying to messages; (5) Send other messages.
1 Message (Event) Overview
When an ordinary WeChat user sends a message to the official account or the WeChat server pushes an event to the official account, the WeChat server will POST the XML data packet of the message (event) to The official account server URL filled in by the developer; the official account server then responds to the message.
1.1 Message flow process
In order to facilitate the distinction, we call the message sent by the WeChat server to the official account server a request message; the message sent by the official account server to the WeChat server is called a response (Response) Message; treat push events as special request messages.
The flow process of request and response messages is shown in the figure below:
1.2 Request message
There are many kinds of request messages, and we have established corresponding ones one by one. The class, the class hierarchy is as shown in the figure below:
We can respond to some request messages, and some cannot. See the table below for details:
Message type |
Whether the event |
can passively reply |
Remarks |
Text |
× |
√ |
|
Picture |
× |
√ |
|
##Voice | × | √ | |
Video | × | Unknown | Cannot receive the video message, I don’t know if I can reply passively |
Geographical location | × | √ | |
Link | × | √ | |
Subscribe | √ | √ | |
Unsubscribe | √ | × | |
Scan the QR code | √ | × | |
Report geographical location | √ | × | |
Click the menu pull Get the message | √ | √ | |
Click the menu jump link | √ | × | |
Click the menu to scan the QR code to push | √ | × | |
Click the menu to scan the QR code and wait for the reply | √ | √ | |
Click the menu and the system will send Picture | √ | Unknown | Cannot receive the system picture event; WeChat server will send picture message, you can reply |
Click the menu to take a photo or send a picture to the album | √ | × | The WeChat server will send a picture message, you can reply |
Click the menu Send pictures on WeChat | √ | × | The WeChat server will send picture messages, you can reply |
Click the menu to select the geographical location | √ | × | The WeChat server will send geographical location messages and can reply |
Push group message results | √ | × | |
Push template message result | √ | × | |
1.3 Response message
The class hierarchy of the response message is as shown below:
2 Verify the authenticity of the message
After the official account server receives the request from the WeChat server, the first thing to do is to verify the authenticity of the message.
The Utility.CheckSignature method is used to verify whether the message signature is correct.
Examples are as follows:
/// <summary>
/// 验证消息的有效性
/// </summary>
/// <param name="context"></param>
/// <returns>如果消息有效,返回true;否则返回false。</returns>
private bool Validate(HttpContext context)
{
string username = RequestEx.TryGetQueryString("username"); //在接口配置的URL中加入了username参数,表示哪个微信公众号
AccountInfo account = AccountInfoCollection.GetAccountInfo(username);
if (account == null)
return false;
string token = account.Token;
string signature = RequestEx.TryGetQueryString("signature");
string timestamp = RequestEx.TryGetQueryString("timestamp");
string nonce = RequestEx.TryGetQueryString("nonce");
if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce))
return false;
return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce);
}
验证消息真实性
Verify message authenticity
3 Parse message
If the message signature passes verification, We need to parse the message text in XML format into a request message object, and the RequestMessageHelper class is used to complete this work.
RequestMessageHelper helper = new RequestMessageHelper(context.Request);
if(helper.Message != null)
{
//消息解析成功,对它进行处理
}
After the message is successfully parsed, helper.Message is the message base class RequestBaseMessage. We can determine which message it is based on the attributes MsgType and Event. message (event) and converted to the appropriate subtype. For example:
RequestBaseMessage bm=helper.Message;
switch(bm.MsgType)
{
case RequestMessageTypeEnum.text: //文本消息
HandleTextMessage((RequestTextMessage)bm);
break;
case RequestMessageTypeEnum.image: //图片消息
HandleImageMessage((RequestImageMessage)bm);
break;
//处理其他消息
case RequestMessageTypeEnum.event: //事件
RequestEventMessage ev=(RequestEventMessage)bm;
switch(ev.Event)
{
case RequestEventTypeEnum.subscribe: //订阅
HandleSubscribeMessage((RequestSubscribeMessage)ev);
break;
case RequestEventTypeEnum.unsubscribe: //取消订阅
HandleUnsubscribeMessage((RequestUnsubscribeMessage)ev);
break;
//处理其他事件
}
break;
default:
break;
}
For details on parsing messages, please refer to the source code: http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/PublicAccount /RequestMessage/RequestMessageHelper.cs
4 Passive reply message
After receiving the message (event) from the WeChat server, we can directly (passive) within 5 seconds Reply to the message; you can also directly reply with an empty string first, and then reply to the customer service message within 48 hours.
First initialize ResponseXxxMessage, and then use the ToXml method to get the response message content.
An example of a passive reply message is as follows:
/// <summary>
/// 处理微信的POST请求
/// </summary>
/// <param name="context"></param>
/// <returns>返回xml响应</returns>
private string HandlePost(HttpContext context)
{
RequestMessageHelper helper = new RequestMessageHelper(context.Request);
if (helper.Message != null)
{
ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message);
return responseMessage.ToXml(helper.EncryptType);
}
else
return string.Empty;
}
/// <summary>
/// 处理请求消息,返回响应消息
/// </summary>
/// <returns>返回响应消息</returns>
private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage)
{
ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName,
DateTime.Now, string.Format("自动回复,请求内容如下:\r\n{0}", requestMessage));
return response;
}
## 5 Send other messages In addition to passive In addition to replying to messages, we can also send customer service messages, group messages, and template messages. These contents will be discussed one by one in subsequent articles.
The above is the detailed content of .net WeChat public account development news and events. For more information, please follow other related articles on the PHP Chinese website!