Example #1
0
        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);
        }
Example #2
0
        //将企业号回复用户的消息加密打包
        // @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);
        }
Example #3
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));
        }
Example #4
0
        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);
        }
Example #6
0
        /// <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>());
        }
Example #7
0
        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;
            }
        }
Example #10
0
        /// <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);
        }
Example #11
0
        // 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!");
            }
        }