C#公众平台(二)—— 接收事件推送之关注回调

C#公众平台(一)—— 接入配置 写了公众平台的基本配置,这篇文章讲的是关注回调事件。
基础帮助类
接收事件推送文档
接入指南

    /// <summary>
    /// WeChatEvent 的摘要说明
    /// </summary>
    public class WeChatEvent : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            if (context.Request.HttpMethod.ToUpper() == "POST")
            {
                Message message = new Message();
                WxPayData data = message.GetMessageData(context);
                string msgType = data.GetValue("MsgType").ToString();

                //这里进行判断MsgType
                switch (msgType)
                {
                    case "text":
                        //SendToWx = WxText.GetWxTextXml(postString);
                        break;
                    case "image":
                        //SendToWx = WxImage.GetWxImageXml(postString);
                        break;
                    case "voice":
                        break;
                    case "video":
                        break;
                    case "shortvideo":
                        break;
                    case "location":
                        break;
                    case "link":
                        break;
                    case "event":
                        string eventType = data.GetValue("Event").ToString();
                        switch (eventType)
                        {
                            case "subscribe":
                                //用户未关注的情况下KEY值: qrscene_为前缀,后面为二维码的参数值
                                string eventKey = data.GetValue("EventKey").ToString();

                                if (!string.IsNullOrEmpty(eventKey))
                                {
                                    //获取二维码的分销商ID
                                    int CusID = CInt(eventKey.Substring(eventKey.IndexOf("qrscene_") + 8));

                                    //记录OPENID
                                    string openID = data.GetValue("FromUserName").ToString();

                                    //根据OPENID获取UnionID
                                    WCQRCode WCQRCode = new WCQRCode();
                                    string access_token = string.Empty;
                                    if (string.IsNullOrWhiteSpace(Config.SubscriptionAppID))
                                    {
                                        access_token = WCQRCode.GetJSAPIAccessToken(Config.AppID, Config.AppSecret);
                                    }
                                    else
                                    {
                                        access_token = WCQRCode.GetJSAPIAccessToken(Config.SubscriptionAppID, Config.SubscriptionAppSecret);
                                    }
                                    
                                    WxPayData userInfo = WCQRCode.GetUserInfo(access_token, openID);
                                    string unionid = string.Empty;

                                    //是否使用了微信企业模式,使用了就会有unionid
                                    if (userInfo.IsSet("unionid"))
                                    {
                                        unionid = userInfo.GetValue("unionid").ToString();
                                    }
                                    //判断是否存在,记录到数据库
                                    WeChatSubscribeDAO dao = new WeChatSubscribeDAO();
                                    bool isExists = dao.Exists(openID);
                                    if (!isExists)
                                    {
                                        //存入数据库
                                    }
                                }
                                break;
                            case "unsubscribe":
                                break;
                            case "SCAN":
                                break;
                            case "LOCATION":
                                break;
                            case "CLICK":
                                break;
                            case "VIEW":
                                break;
                            default:
                                break;
                        }
                        break;
                    default:
                        //result = "没有识别的类型消息:" + xmlElement.SelectSingleNode("MsgType").InnerText;
                        //WriteLog(result);
                        break;
                }

            }
            else if (context.Request.HttpMethod.ToUpper() == "GET")
            {
                string token = Config.Token;//从配置文件获取Token
                if (string.IsNullOrEmpty(token))
                {
                    //写到日志文件
                    LogUtil.WriteLog("微信Token配置项没有配置!");
                }
                // 微信加密签名
                String signature = context.Request["signature"];
                // 时间戳
                String timestamp = context.Request["timestamp"];
                // 随机数
                String nonce = context.Request["nonce"];
                // 随机字符串
                String echostr = context.Request["echostr"];
                Message message = new Message();

                // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
                if (message.DockingCheckSignature(token, timestamp, nonce, signature))
                {
                    context.Response.Write(echostr);
                }
                else
                {
                    context.Response.Write("error");
                }
            }
        }

        public static Int32 CInt(Object obj)
        {
            return (int)CDec(obj);
        }

        public static Decimal CDec(Object obj)
        {
            if (null == obj || DBNull.Value == obj)
            {
                return 0;
            }

            String s = obj.ToString();
            //if (String.IsNullOrEmpty(s))
            //{
            //    return 0;

            //}

            Decimal r = 0;

            //if ( IsNumber(s))
            //{
            //    r = Decimal.Parse(s);
            //}
            //else
            //{
            //    r = 0;
            //}

            //try
            //{
            //r = Decimal.Parse(s);
            bool ok = decimal.TryParse(s, out r);
            //    if(ok == false){
            //        r = 0;
            //    }
            //}
            //catch
            //{
            //    r = 0;
            //}

            return r;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

当是Get的时候就是服务器和微信握手,这个看下接入指南就清楚了,就是验证下signature合不合法就行,合法了就把echostr返回去就是握手成功,反之失败。
当时Post的时候就是公众号发生事件了,这里只处理了关注回调,这里扫描的是带参数的二维码 所以会多一串内容,这内容存的就是具体参数,根据这个二维码存的参数,去进行下一步的处理,比如将扫码的用户和这个二维码去绑定之类的,这个根据具体逻辑而定了。

猜你喜欢

转载自blog.csdn.net/qwt7896541230/article/details/84951026
今日推荐