1. 程式人生 > >C#公眾平臺(二)—— 接收事件推送之關注回撥

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的時候就是公眾號發生事件了,這裡只處理了關注回撥,這裡掃描的是帶引數的二維碼 所以會多一串內容,這內容存的就是具體引數,根據這個二維碼存的引數,去進行下一步的處理,比如將掃碼的使用者和這個二維碼去繫結之類的,這個根據具體邏輯而定了。