介紹
當普通微信用戶向公眾賬號發消息時,微信服務器將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過程是很簡單的,主要的是自己業務邏輯的處理。