Web API實現微信公衆平臺開發-接收數據Post

介紹

當普通微信用戶向公衆賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上。在微信用戶和公衆號產生交互的過程中,用戶的某些操作會使得微信服務器通過事件推送的形式通知到開發者在開發者中心處設置的服務器地址,從而開發者可以獲取到該信息。其中,某些事件推送在發生後,是允許開發者回覆用戶的,某些則不允許。

代碼實現

1、接收參數。

var postModel = GetPostModel(request);

2、驗證簽名。

 if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
                {
                    return new HttpResponseMessage
                    {
                        Content = new StringContent("參數錯誤!")
                    };
                }

3、數據處理。

 [HttpPost]
        [ActionName("CallBack")]
        public HttpResponseMessage HandleMsgFromWeChat(HttpRequestMessage request)
        {
            try
            {
                var postModel = GetPostModel(request);
                if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
                {
                    return new HttpResponseMessage
                    {
                        Content = new StringContent("參數錯誤!")
                    };
                }
                string xmlContent = request.Content.ReadAsStringAsync().Result;

                string domain = BqoolWebSite.WebSiteMapping[BqoolWebSiteType.BigCRMWebService][CommonSetting.GetEnvironmentMode()];
                string url = domain + "/api/WeChat/ProcessXml";
                var data = new ProcessXmlParam()
                {
                    Account = "WeChat",
                    UpdateUser = "WeChat",
                    Date = DateTime.UtcNow.ToUnixTimestamp(),
                    Action = BaseRequestParam.ActionType.Add,
                    xml = xmlContent
                };
                _nLogger.Info($"WeChat ProcessXml Call BigCRM Web - Url : {url}, data : {data.ToJsonString()}");
                var result = HttpTools.EncryptPost<ProcessXmlParam, ApiResult>(url, data);
                _nLogger.Info($"WeChat ProcessXml Call BigCRM Web Result - Url : {url}, result : {result.ToJsonString()}");
                if (result.Success && result.Data != null)
                {
                    return new HttpResponseMessage
                    {
                        Content = new StringContent(result.Data.ToString())
                    };
                }
                return new HttpResponseMessage
                {
                    Content = new StringContent("錯誤!")
                };
            }
            catch (Exception ex)
            {
                _nLogger.Error(ex);
                return new HttpResponseMessage
                {
                    Content = new StringContent("")
                };
            }
        }

        /// <summary>
        /// 驗籤參數
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        private PostModel GetPostModel(HttpRequestMessage content)
        {
            string signature = (from kvp in content.GetQueryNameValuePairs()
                                where kvp.Key == "signature"
                                select kvp.Value).FirstOrDefault();

            string timestamp = (from kvp in content.GetQueryNameValuePairs()
                                where kvp.Key == "timestamp"
                                select kvp.Value).FirstOrDefault();

            string nonce = (from kvp in content.GetQueryNameValuePairs()
                            where kvp.Key == "nonce"
                            select kvp.Value).FirstOrDefault();

            return new PostModel()
            {
                Signature = signature,
                Timestamp = timestamp,
                Nonce = nonce
            };
        }

總結

其實整個api過程是很簡單的,主要的是自己業務邏輯的處理。

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