>위챗 애플릿 >위챗 개발 >.net WeChat 공개 계정 개발 뉴스 및 이벤트

.net WeChat 공개 계정 개발 뉴스 및 이벤트

高洛峰
高洛峰원래의
2017-03-08 16:12:271994검색

이 글에서는 다음을 포함하여 WeChat 공개 계정 개발 시 메시지 및 이벤트를 처리하는 방법을 소개합니다. (1) 메시지(이벤트) 개요 (2) 메시지의 진위 여부 확인(4) 메시지에 수동적으로 응답합니다. (5) 다른 메시지를 보냅니다.
1 메시지(이벤트) 개요

일반 WeChat 사용자가 공식 계정으로 메시지를 보내거나 WeChat 서버가 공식 계정으로 이벤트를 푸시하면 WeChat 서버에서 XML 데이터를 POST합니다. 메시지(이벤트) 패킷을 개발자가 입력한 공식 계정 서버 URL로 전달한 후 해당 메시지에 응답합니다.
1.1 메시지 흐름 프로세스
구별을 용이하게 하기 위해 WeChat 서버에서 공식 계정 서버로 보낸 메시지를 요청 메시지라고 부릅니다. 공식 계정 서버에서 WeChat 서버로 보낸 메시지를 응답이라고 합니다. (응답) 메시지는 푸시 이벤트를 특별 요청 메시지로 처리합니다.
요청 및 응답 메시지의 흐름 과정은 아래 그림과 같습니다.

.net WeChat 공개 계정 개발 뉴스 및 이벤트

1.2 요청 메시지
요청 메시지에는 여러 종류가 있으며, 클래스, 클래스 계층 구조는 아래 그림과 같습니다.

.net WeChat 공개 계정 개발 뉴스 및 이벤트

일부 요청 메시지는 응답할 수 있고 일부는 응답할 수 없습니다. 자세한 내용은 다음 표를 참조하세요.

消息类型 是否事件 能够被动回复 备注
文本 ×  
图片 ×  
声音 ×  
视频 × 未知 接收不到视频消息,不知道是否能被动回复
地理位置 ×  
链接 ×  
订阅  
取消订阅 ×  
扫描二维码 ×  
上报地理位置 ×  
点击菜单拉取消息  
点击菜单跳转链接 ×  
点击菜单扫码推 ×  
点击菜单扫码等待回复  
点击菜单系统发图 未知 接收不到系统发图事件;微信服务器会发送图片消息,可回复
点击菜单拍照或相册发图 × 微信服务器会发送图片消息,可回复
点击菜单微信发图 × 微信服务器会发送图片消息,可回复
点击菜单选择地理位置 × 微信服务器会发送地理位置消息,可回复
推送群发消息结果 ×  
推送发送模板消息结果 ×  

1.3 응답 메시지
응답 메시지의 클래스 계층은 아래와 같습니다.

.net WeChat 공개 계정 개발 뉴스 및 이벤트


2 진위 여부를 확인합니다. 메시지
공개 계정 서버가 위챗 서버로부터 요청을 받은 후 가장 먼저 해야 할 일은 메시지의 진위 여부를 확인하는 것입니다.
Utility.CheckSignature 메서드는 메시지 서명이 올바른지 확인하는 데 사용됩니다.
예시는 다음과 같습니다:

/// <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);
    }

验证消息真实性

메시지 진위 확인

3 메시지 구문 분석

메시지 서명이 통과하는 경우 검증, XML 형식의 메시지 텍스트를 요청 메시지 개체로 구문 분석해야 하며 RequestMessageHelper 클래스를 사용하여 이 작업을 완료합니다.

RequestMessageHelper helper = new RequestMessageHelper(context.Request);
if(helper.Message != null)
{
    //消息解析成功,对它进行处理
}

메시지가 성공적으로 구문 분석된 후 helper.Message는 메시지 기본 클래스 RequestBaseMessage를 결정할 수 있습니다. MsgType 및 Event 메시지(이벤트) 속성에 대해 적절한 하위 유형으로 변환됩니다. 예:

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;
}

메시지 구문 분석에 대한 자세한 내용은 소스 코드를 참조하세요: http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount /blob/master/PublicAccount /RequestMessage/RequestMessageHelper.cs

4 수동 응답 메시지
WeChat 서버에서 메시지(이벤트)를 수신한 후 직접( 패시브) 5초 이내 메시지에 답장하세요. 먼저 빈 문자열로 직접 답장한 후 48시간 이내에 고객 서비스 메시지에 답장할 수도 있습니다.
먼저 ResponseXxxMessage를 초기화한 다음 ToXml 메서드를 사용하여 응답 메시지 내용을 가져옵니다.
수동 응답 메시지의 예는 다음과 같습니다.

/// <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 다른 메시지 보내기

패시브 메시지에 대한 답변 외에도 고객 서비스 메시지 보내기, 그룹 메시지 보내기, 템플릿 메시지 보내기 등의 기능도 사용할 수 있습니다. 이러한 내용은 다음 기사에서 하나씩 설명하겠습니다.


위 내용은 .net WeChat 공개 계정 개발 뉴스 및 이벤트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.