C# 淘寶商品微信返利助手開發-(八)微信號對接

系列教程一目錄:返利助手原理

系列教程二目錄:返利助手開放文檔以及帳號申請地址

系列教程三目錄:返利助手開發(1)API介紹

系列教程四目錄:返利助手開發(2)淘寶分享的內容如何只取淘口令

系列教程五目錄:返利助手開發(3)淘口令如何通過API轉換爲鏈接

系列教程六目錄:返利助手開發(4)如果通過淘口令解析的出來的地址獲得返利信息

系列教程七目錄:返利助手開發(5)如何將優惠券地址轉爲淘口令

系列教程八目錄:微信號對接

系列教程九目錄:編寫一個vue頁面用於複製淘口令

微信公衆號分爲訂閱號和公衆號
經過博主測試如果沒有資料申請公衆號的人可以自行申請訂閱號代替
訂閱號一樣可以使用接口自動回覆,只是訂閱號沒有紅包發送,獲取用戶信息,公衆號菜單等功能的權限

微信開發的我們首先得得獲取的到微信公衆號的APPID和APPSecrest
APPID和Secrest

還需要將服務器配置啓用服務器地址就是你你對接接受微信消息並處理的接口地址
Token就是你自定義的密碼,微信在訪問你接口的時候你要返回這裏配置的token微信驗證成功後纔會運行訪問
EncodingAESKey微信加密密鑰開啓後自動生成
在這裏插入圖片描述

然後在程序中開發,由於爲了便捷我這裏使用了盛派微信的dll流程如下:
安裝盛派的dll

微信公衆號自動回去不僅僅需要APPID和APPsecret
還需要以下參數
“Token”: “自己設置一個自定義的密碼”,
“EncodingAESKey”: “微信中獲取”,
“AppId”: “微信中獲取”,
“Appsecrest”: “微信中獲取”

配置完成後我們進行開發
首先是微信驗證的,因爲只有微信驗證成功了纔會將消息推送給我們
代碼如下:

     public static readonly string Token = SiteConfig.GetSite("Token");//與微信公衆賬號後臺的Token設置保持一致,區分大小寫。
     public static readonly string EncodingAESKey = SiteConfig.GetSite("EncodingAESKey");//與微信公衆賬號後臺的EncodingAESKey設置保持一致,區分大小寫。
     public static readonly string AppId = SiteConfig.GetSite("AppId");//與微信公衆賬號後臺的AppId設置保持一致,區分大小寫。



        private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(WeixinController));
        /// <summary>
        /// 微信後臺驗證地址(使用Get),微信後臺的“接口配置信息”的Url填寫如:http://sdk.weixin.senparc.com/weixin
        /// </summary>
        [HttpGet]

        public object Get(string signature, string timestamp, string nonce, string echostr)
        {

            bool istrue = CheckSignature(signature, timestamp, nonce);
            if (istrue)
            {

                return echostr; //返回隨機字符串則表示驗證通過
            }
            else
            {
                log.Info("如果你在瀏覽器中看到這句話,說明此地址可以被作爲微信公衆賬號後臺的Url,請注意保持Token一致。");
                return Content("如果你在瀏覽器中看到這句話,說明此地址可以被作爲微信公衆賬號後臺的Url,請注意保持Token一致。"); //返回隨機字符串則表示驗證不通過
            }
        }





        #region

        /// <summary>
        /// 驗證微信簽名
        /// </summary>
        /// <returns></returns>
        /// * 將token、timestamp、nonce三個參數進行字典序排序
        /// * 將三個參數字符串拼接成一個字符串進行sha1加密
        /// * 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信。
        private bool CheckSignature(string signature, string timestamp, string nonce)
        {
            string access_token = Token;
            string[] ArrTmp = { access_token, timestamp, nonce };
            Array.Sort(ArrTmp);     //字典排序
            string tmpStr = string.Join("", ArrTmp);

            tmpStr = MD5Util.SHA1(tmpStr);
            if (tmpStr.ToLower() == signature)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

微信驗證寫完之後就是處理微信消息的接口了:
如下所示:

   /// <summary>
        /// 用戶發送消息後,微信平臺自動Post一個請求到這裏,並等待響應XML
        /// PS:此方法爲常規switch判斷方法,從v0.3.3版本起,此Demo不再更新
        /// </summary>
        [HttpPost]
        public object Post(string signature, string timestamp, string nonce, string echostr)
        {


            if (!CheckSignature(signature, timestamp, nonce))
            {
                return Content("參數錯誤!");
            }
            XDocument requestDoc = null;
            try
            {
                var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
                if (syncIOFeature != null)
                {
                    syncIOFeature.AllowSynchronousIO = true;
                }

                requestDoc = XDocument.Load(Request.Body);
                var requestMessage = RequestMessageFactory.GetRequestEntity(new DefaultMpMessageContext(), requestDoc);
                requestDoc.Save(ServerUtility.ContentRootMapPath("~/App_Data/" + SystemTime.Now.Ticks + "_Request_" + requestMessage.FromUserName + ".txt"));//測試時可開啓,幫助跟蹤數據
                ResponseMessageBase responseMessage = null;
                switch (requestMessage.MsgType)
                {
                    case RequestMsgType.Text://文字
                        {

                            var strongRequestMessage = requestMessage as RequestMessageText;
                            Dictionary<string, string> dic = new Dictionary<string, string>();
                            string resultmessage = "";
                            resultmessage = strongRequestMessage.Content;
                            if (resultmessage.Length <= 12)
                            {
                              
                                    var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
                                    strongresponseMessage.Content = string.Format("你發送的消息是{0}", strongRequestMessage.Content);
                                    responseMessage = strongresponseMessage;

                                


                            }
                            else (resultmessage.Length >= 12)
                            {

                                try
                                {
                                 //返利信息處理查詢代碼
                                }
                                catch (Exception e)
                                {
                                    log.Info("Message"+e.Message);
                                    log.Info("InnerException" + e.InnerException.Message);
                                    var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
                                    strongresponseMessage.Content = string.Format("此商品暫無優惠", strongRequestMessage.Content);
                                    responseMessage = strongresponseMessage;
                                }
                            }
                            //TODO:交給Service處理具體信息,參考/Service/EventSercice.cs 及 /Service/LocationSercice.cs
                            break;
                        }
                    case RequestMsgType.Location://位置
                        {
                            var strongRequestMessage = requestMessage as RequestMessageText;
                            var strongresponseMessage =
                                ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
                            strongresponseMessage.Content =
                                string.Format(
                                    "您剛纔發送了位置信息,暫不支持位置信息",
                                    strongRequestMessage.Content);
                            responseMessage = strongresponseMessage;
                            break;
                        }
                    case RequestMsgType.Image://圖片
                        {
                            //TODO:交給Service處理具體信息
                            var strongRequestMessage = requestMessage as RequestMessageImage;
                            var strongresponseMessage =
                                ResponseMessageBase.CreateFromRequestMessage<ResponseMessageNews>(requestMessage);
                            strongresponseMessage.Articles.Add(new Article()
                            {
                                Title = "您剛纔發送了圖片信息",
                                Description = "您剛纔發送了圖片信息",
                                PicUrl = strongRequestMessage.PicUrl,
                                Url = "http://www.baidu.com"
                            });
                            responseMessage = strongresponseMessage;
                            break;
                        }
                    case RequestMsgType.Voice://語音
                        {
                            //TODO:交給Service處理具體信息
                            var strongRequestMessage = requestMessage as RequestMessageVoice;
                            var strongresponseMessage =
                               ResponseMessageBase.CreateFromRequestMessage<ResponseMessageMusic>(requestMessage);
                            strongresponseMessage.Music.MusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3";
                            responseMessage = strongresponseMessage;
                            break;
                        }
                    case RequestMsgType.Event://事件
                        {
                            var strongRequestMessage = requestMessage as RequestMessageEvent;
                            var strongresponseMessage =
                                    ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
                            log.Info(JsonConvert.SerializeObject(strongRequestMessage));
                            switch (strongRequestMessage.EventName)
                            {
                                //關注
                                case "subscribe":
                                    strongresponseMessage.Content =
                                string.Format("感謝你關注我的微信號");
                                    responseMessage = strongresponseMessage;
                                    break;

                                //取消關注
                                case "unsubscribe":
                                    strongresponseMessage.Content =
                              string.Format("如果你有那些建議,請及時返回,我爭取做得更好");
                                    responseMessage = strongresponseMessage;
                                    break;


                                //默認事件
                                default:
                                    break;
                            }
                            
                            break;
                        }
                    default:
                        throw new ArgumentOutOfRangeException();
                }
                var responseDoc = Senparc.NeuChar.Helpers.EntityHelper.ConvertEntityToXml(responseMessage);
                responseDoc.Save(ServerUtility.ContentRootMapPath("~/App_Data/" + SystemTime.Now.Ticks + "_Response_" + responseMessage.ToUserName + ".txt"));//測試時可開啓,幫助跟蹤數據

                return Content(responseDoc.ToString());
                //如果不需要記錄responseDoc,只需要:
                //return Content(responseMessage.ConvertEntityToXmlString());
            }
            catch (Exception ex)
            {

                log.Info("Message:" + ex.Message);
                log.Info("InnerException:" + ex.InnerException.Message);
                return Content("");
            }
        }


我們可以看到微信回覆的事件裏面包含,文字信息,語音信息,圖片信息,位置信息和事件信息

其中事件信息又分爲,關注事件,取消關注事件,如果是有自定義菜單的用戶可能還有菜單點擊事件

我們通過判斷不同類型都消息類型對不同類型的信息進行分析處理

到這裏之後只需要發佈到服務器配置好之後微信公衆號就能按照你編寫的代碼自動回覆了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章