public WechatRequest ParseRequest(HttpRequestMessage request) { string requestXml = request.Content.ReadAsStringAsync().Result; //LogUtils.Log("[POST input]:\r\n" + requestXml); WechatRequest req = new WechatRequest(); XmlDocument doc = new XmlDocument(); XmlNode root; try { doc.LoadXml(requestXml); root = doc.FirstChild; req.ToUserName = root["ToUserName"].InnerText; req.FromUserName = root["FromUserName"].InnerText; req.CreateTime = root["CreateTime"].InnerText; req.MsgType = root["MsgType"].InnerText; req.Content = root["Content"].InnerText; req.MsgId = root["MsgId"].InnerText; if (req.ToUserName == null || req.MsgId == null || req.Content == null) { throw new Exception(); } } catch (Exception) { throw new WebResponseException(HttpStatusCode.BadRequest, $"Missing field: ToUserName - {req.ToUserName}, MsgId - {req.MsgId}, Content - {req.Content}"); } return(req); }
//将企业号回复用户的消息加密打包 // @param sReplyMsg: 企业号待回复用户的消息,xml格式的字符串 // @param sTimeStamp: 时间戳,可以自己生成,也可以用URL参数的timestamp // @param sNonce: 随机串,可以自己生成,也可以用URL参数的nonce // @param sEncryptMsg: 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串, // 当return返回0时有效 // return:成功0,失败返回对应的错误码 public int EncryptMsg(string sReplyMsg, string sTimeStamp, string sNonce, WechatRequest req, ref string sEncryptMsg) { if (m_sEncodingAESKey.Length != 43) { return((int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_IllegalAesKey); } sEncryptMsg = ""; string ToUserNameLabelHead = "<ToUserName><![CDATA["; string ToUserNameLabelTail = "]]></ToUserName>"; string FromUserNameLabelHead = "<FromUserName><![CDATA["; string FromUserNameLabelTail = "]]></FromUserName>"; string CreateTimeLabelHead = "<CreateTime><![CDATA["; string CreateTimeLabelTail = "]]></CreateTime>"; string MsgTypeLabelHead = "<MsgType><![CDATA["; string MsgTypeLabelTail = "]]></MsgType>"; string ContentLabelHead = "<Content><![CDATA["; string ContentLabelTail = "]]></Content>"; sEncryptMsg += "<xml>" + ToUserNameLabelHead + req.FromUserName + ToUserNameLabelTail; sEncryptMsg += FromUserNameLabelHead + req.ToUserName + FromUserNameLabelTail; sEncryptMsg += CreateTimeLabelHead + sTimeStamp + CreateTimeLabelTail; sEncryptMsg += MsgTypeLabelHead + req.MsgType + MsgTypeLabelTail; sEncryptMsg += ContentLabelHead + sReplyMsg + ContentLabelTail; sEncryptMsg += "</xml>"; return(0); }
public IHttpActionResult WechatMiniEmailLogin(WechatRequest data) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var user = _db.Customers.First(customer => customer.Email == data.id); if (user == null) { return(Ok(new WechatResponse() { ok = false, error = "Customer not found" })); } if (user.Password != EncryptProvider.Md5(data.password)) { return(Ok(new WechatResponse() { ok = false, error = "Wrong password." })); } return(WechatDataCollect(user.CustomerId)); }
public async Task <IActionResult> Login([FromBody] WechatRequest request) { var result = await _userInfoService.LoginAsync(request); if (result != null && !string.IsNullOrEmpty(result.PhoneNumber)) { result.PhoneNumber = result.PhoneNumber.MaskPhone(); } return(new ApiResult <UserInfo>(result)); }
private string Answer(WechatRequest req) { string answer = string.Empty; if (req.MsgType == "text") { answer = this.bot.Answer(req.FromUserName, req.Content); } return(answer); }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <returns></returns> public async Task <UserInfo> LoginAsync(WechatRequest request) { var result = new UserInfoEntity(); if (string.IsNullOrEmpty(request.PhoneNumber)) { var wxConfig = _config.WechatAccount.FirstOrDefault(x => x.AcountId == request.AcountId); //微信登录 var loginInfo = await _oathService.LoginAsync(request.Code, wxConfig); result = await _userInfoData.GetUserByAccount(loginInfo.unionid ?? loginInfo.openid); if (result == null) { result = new UserInfoEntity { UnionId = loginInfo.unionid, OpenId = loginInfo.openid, CreateTime = DateTime.Now, HeadImg = request.HeadImg, NickName = request.NickName, UpdateTime = DateTime.Now }; } //如果手机号为空 if (string.IsNullOrEmpty(result.PhoneNumber) && !string.IsNullOrEmpty(request.EncryptedData) && !string.IsNullOrEmpty(request.Iv)) { //数据解密,序列化获取手机号码 var wx_user = _oathService.AESDecrypt <Domian.MiniUserPhone>(request.EncryptedData, loginInfo.session_key, request.Iv); if (wx_user != null && !string.IsNullOrEmpty(wx_user.PhoneNumber)) { result.PhoneNumber = wx_user.PhoneNumber; } } result = await _userInfoData.SaveUpdate(result); } else { //账号密码登录 result = await _userInfoData.GetUserByAccount(request.PhoneNumber); if (result == null) { throw new ApiException(-1, "账号不存在,请先注册"); } if (string.IsNullOrEmpty(request.PassWord) || request.PassWord != result.PassWord) { throw new ApiException(-1, "登录密码错误"); } } return(result.Convert <UserInfoEntity, UserInfo>()); }
public string GenerateEncryptResponse(WechatRequest req, string replyMsg) { WechatResponse resp = new WechatResponse(); resp.FromUserName = req.ToUserName; resp.ToUserName = req.FromUserName; resp.CreateTime = DateTime.Now.Ticks.ToString(); resp.MsgType = req.MsgType; resp.Content = req.MsgType == "text" ? replyMsg : ""; string encryptResp = this.EncryptXML(resp); return(encryptResp); }
/// <summary> /// /// </summary> /// <returns></returns> public async Task SendMessage() { Logger.WriteLog(LogLevel.Info, "开始执行服务", _appSettings); var w = DateTime.Now.DayOfWeek; var h = DateTime.Now.Hour; if (w == DayOfWeek.Saturday || w == DayOfWeek.Sunday || h < _appSettings.StartHour || h > _appSettings.EndHour) { return; } if (_appSettings.StockPoolList == null || _appSettings.StockPoolList.Count <= 0) { return; } foreach (var item in _appSettings.StockPoolList) { var message = await GetStockTradeInfo(item.Name); Logger.WriteLog(LogLevel.Info, "读取消息", new { item, message }); if (!string.IsNullOrEmpty(message)) { var request = new WechatRequest() { ToTag = item.ToTag, ToUser = item.ToUser, ToParty = item.ToParty, MsgType = NoticeType.text.ToString(), Text = new NoticeText { Content = $"{item.Name}\n{message}" } }; try { await _weChatService.Notice(request); } catch (Exception ex) { Logger.WriteLog(LogLevel.Error, "发送微信消息通知异常", request, ex); } } } }
public HttpResponseMessage Post(HttpRequestMessage request) { try { WechatRequest req = parser.ParseRequest(request); string answer = this.Answer(req); string str_encrypt = parser.GenerateEncryptResponse(req, answer); return(new HttpResponseMessage(System.Net.HttpStatusCode.OK) { Content = new StringContent(str_encrypt, System.Text.Encoding.UTF8, "text/xml") }); } catch (Exception ex) { throw ex; } }
/// <summary> /// 消息通知 /// </summary> /// <param name="request">通知对象</param> /// <returns></returns> public async Task <bool> Notice(WechatRequest request) { if (string.IsNullOrEmpty(request.ToUser) && string.IsNullOrEmpty(request.ToTag) && string.IsNullOrEmpty(request.ToParty)) { throw new Exception("通知用户不能为空"); } if (request.News == null && request.Image == null && request.File == null && request.Text == null && request.TextCard == null && request.Video == null && request.Voice == null) { throw new Exception("通知内容不能为空"); } var token = await GetToken(); var apiUrl = $"{sendUrl}?access_token={token}"; request.AgentId = _agentId; var jsonData = request.ToJson(NullValueHandling.Ignore); var requestData = new HttpRequestMessage(HttpMethod.Post, apiUrl) { Content = new StringContent(jsonData, Encoding.UTF8, "application/json") }; var response = await _httpClientFactory.CreateClient().SendAsync(requestData); response.EnsureSuccessStatusCode(); var data = await response.Content.ReadAsStringAsync(); if (!string.IsNullOrEmpty(data)) { Logger.WriteLog(LogLevel.Info, "发送消息", new { request, data }); var responseData = data.FromJson <WechatResponse>(); if (responseData.ErrCode != 0) { throw new Exception(responseData.ErrMsg); } } return(true); }
// GET: WeChat public string Index() //回复全都是xml格式的string { if (IsFromTencent("961016") && Request.HttpMethod == "GET") { return(Request["echostr"]); } if (IsFromTencent("961016") && Request.HttpMethod == "POST") { WechatRequest = new WechatRequest(Request.InputStream); #region wechatpost if (WechatRequest.IsClick()) { #region ButtonEvent switch (WechatRequest.EventKey) { case "elearning_wordlearn": return(WechatRequest.Get_Reply(WechatRequest.elearning_wordlearn)); case "elearning_textlearn": return(WechatRequest.Get_Reply(WechatRequest.elearning_textlearn)); case "elearning_nextword": string nextword = DataBaseController.GetNextWord(WechatRequest.FromUserName); if (nextword != null) { return(WechatRequest.Get_Reply(nextword)); } else { return(WechatRequest.Get_Reply("当前未设立测试范围或已经学习完全部内容")); } case "elearning_oraltrain": return(WechatRequest.Get_Reply("It was two weeks before the Spring Festival.")); default: return(WechatRequest.Get_Reply("功能还在开发中,敬请期待")); } #endregion } else if (WechatRequest.IsSubscribe()) { #region FollowEvent DataBaseController.AddIntoWechatIds(WechatRequest.FromUserName); return(WechatRequest.Get_Reply(WechatRequest.elearn_welcome)); #endregion } else if (WechatRequest.IsVoice()) { #region VoiceEvent Thread t = new Thread(new ThreadStart(task_voicemanager)); t.Start(); return(WechatRequest.Get_Reply("提交成功,请等待一段时间后输入Get查看结果!")); #endregion } else { #region MessageEvent string message = WechatRequest.Content; if (Regex.IsMatch(message, "^xh.+")) { DataBaseController.UpdateStudents(WechatRequest.FromUserName, message.Substring(2), null); return(WechatRequest.Get_Reply("学号已修改,现在您绑定的学号为:" + message.Substring(2) + "请输入jwc + 您的教务处密码来绑定,如jwc123456")); } else if (Regex.IsMatch(message, "^jwc.+")) { string studentnum = DataBaseController.GetStudentNum(WechatRequest.FromUserName); string jwcpassword = message.Substring(3); if (JWCHttpHelper.isPasswordTrue(studentnum, jwcpassword)) { DataBaseController.UpdateStudents(WechatRequest.FromUserName, studentnum, jwcpassword); return(WechatRequest.Get_Reply("验证成功!")); } else { return(WechatRequest.Get_Reply($"输入的密码{ jwcpassword }不正确")); } } else { if (Regex.IsMatch(message, "\\d{4,4}")) { if (message.Substring(0, 1) == "0") { if (DataBaseController.tryUpdateProcesses(WechatRequest.FromUserName, message)) { return(WechatRequest.Get_Reply("选择成功!按next开始学习")); } else { return(WechatRequest.Get_Reply("选择失败,请确认是否绑定学号及输入代码是否正确")); } } else if (message.Substring(0, 1) == "2") { return(WechatRequest.Get_ImgText()); } } if (!DataBaseController.HaveBinding(WechatRequest.FromUserName)) { return(WechatRequest.Get_Reply(WechatRequest.elearn_welcome)); } switch (message) { case "001": return(WechatRequest.Get_Reply(WechatRequest.elearning_testmsg1)); case "201": return(WechatRequest.Get_Reply(WechatRequest.elearning_testmsg2)); case "speak": string word = DataBaseController.GetNowWord(WechatRequest.FromUserName); if (word == null) { return(WechatRequest.Get_Reply("请先选择学习内容")); } WeChatHttpHelper.GetToken(); string mediaid = WeChatHttpHelper.GetMediaID(SpeecherController.mytts("读音:" + word), "voice"); return(WechatRequest.Get_Voice(mediaid)); case "Get": string path = $@"C:\Users\Administrator\Desktop\ElearnOralResult\{WechatRequest.FromUserName}\result.txt"; using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { StreamReader sr = new StreamReader(fs); return(WechatRequest.Get_Reply(sr.ReadToEnd())); } default: return(WechatRequest.Get_Reply("识别错误,请重试")); } } #endregion } #endregion } else//不是腾讯发来的post { return("Do not touch this server,guy!"); } }