Ejemplo n.º 1
0
        /// <summary>
        /// 发送视频消息
        /// </summary>
        /// <param name="host"></param>
        /// <param name="account"></param>
        /// <param name="toUserNameId"></param>
        /// <param name="mediaId"></param>
        /// <returns></returns>
        /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendvideomsg?fun=async&f=json&pass_ticket=%252FX8NCpFJfNmU%252Be%252FgE2dwRCN2D8Y8EBSKunfckAJmPfCeVD4YaubkaS2e767qiyAO
        /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendvideomsg?fun=async&f=json&lang=zh_CN&pass_ticket=KwMEOlgC57Dc1AwBwr7oaHekXX0P8fJE%252Bl0cLVocIrxdWNr%252F9URPGCAEmf%252FzfjEK
        public static HttpTaskParams GetSendVideoMsg(string host, WxAccount account, string toUserNameId, string mediaId)
        {
            string url = string.Format("{0}?fun=async&f=json&lang=zh_CN&pass_ticket={1}",
                                       WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_SEND_VIDEO_MSG),
                                       encoding(account.PassTicket));

            HttpTaskParams htp = HttpTaskParams.NewPost(url);

            htp.ContentType = "application/json;charset=UTF-8";

            WxSendMsgReq req = new WxSendMsgReq();

            req.BaseRequest = WxReqUtil.GetIdentifyReq(account);
            req.Scene       = 0;

            WxSendMediaMsg msg = new WxSendMediaMsg();

            msg.Type         = 43;//视频
            msg.MediaId      = mediaId;
            msg.FromUserName = account.UserName;
            msg.ToUserName   = toUserNameId;
            string msgId = TimeUtil.CurrentTimeMillis() + TextUtil.RandomNumber(4);

            msg.LocalID     = msgId;
            msg.ClientMsgId = msgId;
            msg.Content     = string.Empty;

            req.Msg = msg;

            htp.CustomStringContentBody = JsonConvert.SerializeObject(req);
            return(htp);
        }
Ejemplo n.º 2
0
        public void UpdateAccountStatus()
        {
            if (wxUin != null)
            {
                WxAccount account = new WxAccount();
                account.WxUin = wxUin;

                //account.Status = status; //logout:1 login:0
                account.Sid    = sessionId;
                account.Userid = this.chatForm.user.Id;
                String   userSid   = this.chatForm.user.userSid;
                DateTime timeStamp = new DateTime(1970, 1, 1);                             //得到1970年的时间戳
                long     a         = (DateTime.UtcNow.Ticks - timeStamp.Ticks) / 10000000; //注意这里有时区问题,用now就要减掉8个小时
                account.Timestamp = a.ToString();
                String token = account.Timestamp + this.chatForm.conStr + account.Userid + userSid;
                account.Token = LoginForm.GetMd5(32, token);

                IWxAccount wxAccount = new WxAccountMapper();
                Result     result    = wxAccount.updateStatus(account);
                if (result.Code != 200 && this.chatForm.sessionStatus != SessionStatus.expire)
                {
                    this.chatForm.callback_showExpireBox(result.Message);
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 获取微信所有联系人
        /// </summary>
        /// <param name="wxAccount"></param>
        /// <returns></returns>
        /// https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact
        /// ?lang=zh_CN
        /// &pass_ticket=9%252FuIrFpoM6CCrYsAV7mzDF0aFkHiXGlotDlmHbQokhM%253D
        /// &r=1501480039623
        /// &seq=0
        /// &skey=@crypt_77e833b9_e705acd2a3250d78bdbb1137d87afad5
        public static HttpTaskParams GetContactAllParams(string host, WxAccount wxAccount)
        {
            string url = string.Format("{0}?lang=zh_CN&pass_ticket={1}&r={2}&seq=0&skey={3}",
                                       WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_CONTACT_ALL),
                                       encoding(wxAccount.PassTicket),
                                       TimeUtil.CurrentTimeMillis(),
                                       encoding(wxAccount.Skey));

            return(HttpTaskParams.NewGet(url));
        }
Ejemplo n.º 4
0
        private WxContactAllResult executeGetContactAllHttpTask(string host, WxAccount wxAccount)
        {
            try
            {
                HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetContactAllParams(host, wxAccount));
                return(ht.ExecuteJson <WxContactAllResult>());
            }
            catch { }

            return(null);
        }
Ejemplo n.º 5
0
 private string executeLogout(string host, WxAccount wxAccount)
 {
     if (wxAccount == null)
     {
         return(null);
     }
     else
     {
         return(executeLogout(host, wxAccount.Skey, wxAccount.Uin, wxAccount.Sid));
     }
 }
Ejemplo n.º 6
0
        /// <summary>
        /// 获取微信状态通知
        /// </summary>
        /// <param name="result"></param>
        /// <returns></returns>
        /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify
        /// ?lang=zh_CN
        /// &pass_ticket=zXbwZhRifdRRNcPjsjxyemYskxzSRQOxZF6T3HJuTpsdgPENMSMXylIlmsnrEZ5s
        public static HttpTaskParams GetStatusNotify(string host, WxAccount wxAccount)
        {
            string url = string.Format("{0}?lang={1}&pass_ticket={2}",
                                       WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_STATUS_NOTIFY),
                                       "zh_CN",
                                       encoding(wxAccount.PassTicket));

            HttpTaskParams htp = HttpTaskParams.NewPost(url);

            htp.ContentType             = "application/json;charset=utf-8";
            htp.CustomStringContentBody = JsonConvert.SerializeObject(WxReqUtil.GetStatusNotifyReq(wxAccount));
            return(htp);
        }
        public static BoolAny <WxAccount> WxDBUpdateAccount(UserInfoJson userinfo, BaseDBContext wdb, bool isAttend)
        {
            try
            {
                WxAccount newWa = wdb.WxAccount.Find(userinfo.openid);

                if (newWa == null)
                {
                    newWa = new WxAccount()
                    {
                        subscribe = isAttend,
                        regDate   = DateTime.Now,
                        //subscribe_time = LIB.DateTimeEx.TimeStampToDateTime(userinfo.subscribe_time),
                        subscribe_time = DateTime.Now,
                        openid         = userinfo.openid,
                        lastDate       = DateTime.Now,
                        headimgurl     = userinfo.headimgurl,
                        nickname       = userinfo.nickname,
                        sex            = userinfo.sex.ToString(),
                        groupid        = userinfo.groupid.ToString(),
                        remark         = userinfo.remark,
                        unionid        = userinfo.unionid,
                        studentId      = 0
                    };
                    wdb.WxAccount.Add(newWa);
                }
                else
                {
                    newWa.subscribe = isAttend;

                    newWa.headimgurl = userinfo.headimgurl;
                    newWa.nickname   = userinfo.nickname;
                    newWa.sex        = userinfo.sex.ToString();
                    newWa.groupid    = userinfo.groupid.ToString();
                    newWa.remark     = userinfo.remark;
                }


                wdb.SaveChanges();
                //debug.log("WxDBUpdateAccount_DBSave", newWa);
                return(BoolAny <WxAccount> .succeed(newWa));
            }
            catch (DbEntityValidationException dbEx)
            {
                debug.log("WxDBUpdateAccount_DBSave_异常", dbEx.Message);
                //debug.print("addAccount_error", e.Message);
                return(BoolAny <WxAccount> .fail(dbEx.Message));
            }
        }
Ejemplo n.º 8
0
        private WxSyncMsgResult executeSyncMsgHttpTask(string host, WxAccount wxAccount, WxSyncKey wxSyncKey)
        {
            try
            {
                HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetSyncMsgParams(host, wxAccount, wxSyncKey));
                if (ht != null)
                {
                    WxSyncMsgResult result = ht.ExecuteJson <WxSyncMsgResult>();
                    return(result);
                }
            }
            catch { }

            return(null);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 获取同步检查参数
        /// </summary>
        /// <param name="account"></param>
        /// <param name="deviceId"></param>
        /// <param name="wxSyncKey"></param>
        /// <returns></returns>
        /// https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck
        /// ?r=1501480039641
        /// &skey=%40crypt_77e833b9_e705acd2a3250d78bdbb1137d87afad5&sid=TlG7spFxhWig3TpY
        /// &uin=243082945
        /// &deviceid=e835949820036438
        /// &synckey=1_653730215%7C2_653730255%7C3_653730169%7C1000_1501462441
        /// &_=1501479916949
        public static HttpTaskParams GetSyncCheckParams(string host, WxAccount wxAccount, WxSyncKey wxSyncKey)
        {
            HttpTaskParams htp = HttpTaskParams.NewGet(WxHttpApi.GetWebPushUrl(host, WxHttpApi.URL_WX_MSG_CHECK));

            htp.AddStringParam("skey", wxAccount.Skey);
            htp.AddStringParam("uin", wxAccount.Uin);
            htp.AddStringParam("sid", wxAccount.Sid);
            htp.AddStringParam("deviceid", wxAccount.DeviceId);
            htp.AddStringParam("synckey", WxReqUtil.GetSyncKey2String(wxSyncKey));
            long millis = TimeUtil.CurrentTimeMillis();

            htp.AddStringParam("r", millis.ToString());
            htp.AddStringParam("_", (millis / 1000).ToString());//时间戳取反
            return(htp);
        }
Ejemplo n.º 10
0
        private WxSyncCheckResult executeSyncCheckHttpTask(string host, WxAccount wxAccount, WxSyncKey wxSyncKey)
        {
            try
            {
                HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetSyncCheckParams(host, wxAccount, wxSyncKey));
                if (ht != null)
                {
                    WxSyncCheckResult result = WxRespUtil.ParseWxSyncKeyResult(ht.ExecuteString());
                    return(result);
                }
            }
            catch { }

            return(null);
        }
Ejemplo n.º 11
0
        public async Task SetAsync(WxAccount account)
        {
            if (account.SiteId <= 0)
            {
                return;
            }

            if (account.Id > 0)
            {
                await _repository.UpdateAsync(account);
            }
            else
            {
                await _repository.InsertAsync(account);
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 群踢人
        /// </summary>
        /// <param name="account"></param>
        /// <param name="userNameId"></param>
        /// <param name="groupUserNameId"></param>
        /// <returns></returns>
        public static HttpTaskParams GetGroupContactDelMember(string host, WxAccount account, string userNameId, string groupUserNameId)
        {
            string url = string.Format("{0}?fun=delmember&lang=zh_CN&pass_ticket={1}",
                                       WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_GROUP_DEL_MEMBER),
                                       encoding(account.PassTicket));

            HttpTaskParams htp = HttpTaskParams.NewPost(url);

            htp.ContentType = "application/json;charset=UTF-8";

            WxGroupMemberReq req = new WxGroupMemberReq();

            req.BaseRequest             = WxReqUtil.GetIdentifyReq(account);
            req.DelMemberList           = userNameId;
            req.ChatRoomName            = groupUserNameId;
            htp.CustomStringContentBody = JsonConvert.SerializeObject(req);
            return(htp);
        }
        /// <summary>
        /// 已经关注
        /// </summary>
        /// <returns></returns>
        public static Boolean WxIsAttendByDB(string openid)
        {
            bool attend = false;

            using (BaseDBContext wdb = new BaseDBContext())
            {
                WxAccount newWa = wdb.WxAccount.Find(openid);
                if (newWa == null)
                {
                    attend = false;
                }
                else
                {
                    attend = newWa.subscribe;
                }
            }
            return(attend);
        }
Ejemplo n.º 14
0
        public Result updateStatus(WxAccount account)
        {
            Result     result = new Result();
            HttpClient http   = new HttpClient(new HttpClientHandler());

            http.DefaultRequestHeaders.ExpectContinue = false;
            try
            {
                String url = Uri.server_address + "index.php?m=Home&c=Rawdata&a=updateWxAccountStatus";

                String jsondata = JsonHelper.SerializeObject(account);

                var content = new StringContent(jsondata, Encoding.UTF8, "application/json");

                //await异步等待回应
                var response = http.PostAsync(url, content).Result;

                //确保HTTP成功状态值

                response.EnsureSuccessStatusCode();
                //await异步读取最后的JSON
                String resdata = response.Content.ReadAsStringAsync().Result;

                JObject o    = JObject.Parse(resdata);
                int     code = (int)o.SelectToken("code");
                String  msg  = (String)o.SelectToken("message");

                result.Code    = code;
                result.Message = msg;
            }
            catch (Exception e)
            {
                log.Error(e.Message, e);

                result.Code    = 500;
                result.Message = "网络异常或请求超时";
            }
            finally
            {
                http.Dispose();
            }

            return(result);
        }
        /// <summary>
        /// 新增或更新关注用户信息
        /// </summary>
        /// <returns></returns>
        public static BoolAny <WxAccount> WxDBUpdateAccount(string openid, BaseDBContext wdb, bool isAttend)
        {
            try
            {
                WxAccount newWa = wdb.WxAccount.Find(openid);
                if (isAttend)
                {
                    if (newWa == null)
                    {
                        newWa = new WxAccount()
                        {
                            subscribe      = true,
                            regDate        = DateTime.Now,
                            subscribe_time = DateTime.Now,
                            openid         = openid,
                            lastDate       = DateTime.Now
                        };
                        wdb.WxAccount.Add(newWa);
                    }
                    else
                    {
                        newWa.subscribe = true;
                    }
                    //debug.log("WxDBUpdateAccount_string_Attend", newWa);
                }
                else
                {
                    //debug.log("WxDBUpdateAccount_string_UnAttend", newWa);
                    if (newWa != null)
                    {
                        newWa.subscribe = false;
                    }
                }

                wdb.SaveChanges();
                return(BoolAny <WxAccount> .succeed(newWa));
            }
            catch (Exception e)
            {
                //debug.print("addAccount_error", e.Message);
                return(BoolAny <WxAccount> .fail(e.Message));
            }
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 批量获取联系人,包含个人和组
        /// </summary>
        /// <param name="wxAccount"></param>
        /// <param name="groupUserNames"></param>
        /// <returns></returns>
        /// //https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact
        /// ?type=ex
        /// &r=1498291861743
        /// &lang=zh_CN
        /// &pass_ticket=ga8bxGb9YQJLWhU6RA6FMamJy0wqnD7QuWP9k%252F9tlTb8O1uUkgcZ7YbjNg3bEkYH
        public static HttpTaskParams GetBatchContactParams(string host, WxAccount wxAccount, List <string> groupUserNameIds)
        {
            string url = string.Format("{0}?type=ex&r={1}&lang=zh_CN&pass_ticket={2}",
                                       WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_CONTACT_BATCH),
                                       TimeUtil.CurrentTimeMillis(),
                                       encoding(wxAccount.PassTicket));

            HttpTaskParams htp = HttpTaskParams.NewPost(url);

            htp.ContentType = "application/json;charset=utf-8";

            WxBatchContactReq req = new WxBatchContactReq();

            req.BaseRequest             = WxReqUtil.GetIdentifyReq(wxAccount);
            req.Count                   = CollectionUtil.Size(groupUserNameIds);
            req.List                    = WxReqUtil.GetBatchContactItemList(groupUserNameIds);
            htp.CustomStringContentBody = JsonConvert.SerializeObject(req);
            return(htp);
        }
Ejemplo n.º 17
0
        public static HttpTaskParams GetUploadImage(string host, WxAccount account, string toUserNameId, string imagePath)
        {
            string url = string.Format("{0}?f=json", WxHttpApi.GetFileUploadUrl(host, WxHttpApi.URL_WX_FILE_UPLOAD));

            HttpTaskParams htp  = HttpTaskParams.NewPost(url);
            FileInfo       info = new FileInfo(imagePath);

            htp.AddStringParam("id", "WU_FILE_" + fileCount);
            htp.AddStringParam("name", info.Name);
            htp.AddStringParam("type", "image/jpeg");
            htp.AddStringParam("lastModifiedDate", info.LastWriteTime.ToString("r", DateTimeFormatInfo.InvariantInfo));
            htp.AddStringParam("size", info.Length.ToString());
            htp.AddStringParam("mediatype", "pic");
            htp.AddStringParam("webwx_data_ticket", account.DataTicket);
            htp.AddStringParam("pass_ticket", account.PassTicket);
            htp.AddFileParam("filename", imagePath, WxReqUtil.GetImageMimeType(info));
            htp.AddStringParam("uploadmediarequest", WxReqUtil.GetUploadMediaRequestBody(account, toUserNameId, info, imagePath));
            return(htp);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// 同步获取更新消息
        /// </summary>
        /// <param name="account"></param>
        /// <param name="syncKey"></param>
        /// <returns></returns>
        /// https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync
        /// ?sid=XbUcBWzGt6NPu5jO
        /// &skey=@crypt_55085584_cf738edf865a9c101021022d1c732ae6
        /// &lang=zh_CN
        /// &pass_ticket=lBIvUtbeb5e%252BMIDHLr5QVehuJDPbW3NEgMSh87ILAOv3ue1HdLtSV%252B8AK0ULznEL
        public static HttpTaskParams GetSyncMsgParams(string host, WxAccount account, WxSyncKey syncKey)
        {
            string url = string.Format("{0}?sid={1}&skey={2}&pass_ticket={3}&lang={4}",
                                       WxHttpApi.GetCommonUrl(host, WxHttpApi.URL_WX_MSG_PULL),
                                       encoding(account.Sid),
                                       encoding(account.Skey),
                                       encoding(account.PassTicket),
                                       "zh_CN");

            HttpTaskParams htp = HttpTaskParams.NewPost(url);

            htp.ContentType = "application/json;charset=UTF-8";

            WxWebSyncReq req = new WxWebSyncReq();

            req.BaseRequest             = WxReqUtil.GetIdentifyReq(account);
            req.SyncKey                 = syncKey;
            req.rr                      = (~(TimeUtil.CurrentTimeMillis() / 1000)).ToString();//时间戳取反
            htp.CustomStringContentBody = JsonConvert.SerializeObject(req);
            return(htp);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// 同步AccessToken
        /// </summary>
        /// <returns></returns>
        public async Task <string> GetAccessTokenAsync()
        {
            try
            {
                WxAccount account = await databaseFixture.Db.WxAccount.FindAsync();

                if (account.AccessTokenCreateTime == null || account.AccessTokenCreateTime.Value.AddSeconds(6000) < DateTime.Now)
                {
                    try
                    {
                        string accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
                        var    request        = new RestRequest(Method.GET);
                        request.AddParameter("grant_type", "client_credential");
                        request.AddParameter("appid", account.AppId);
                        request.AddParameter("secret", account.AppSecret);
                        var           client   = new RestClient(accessTokenUrl);
                        IRestResponse response = await client.ExecuteTaskAsync(request);

                        AccessToken accessToken = JsonConvert.DeserializeObject <AccessToken>(response.Content);
                        account.AccessToken           = accessToken.access_token;
                        account.AccessTokenCreateTime = DateTime.Now;
                        await databaseFixture.Db.WxAccount.UpdateAsync(account);

                        return(accessToken.access_token);
                    }
                    catch (Exception ex)
                    {
                        return(null);
                    }
                }
                else
                {
                    return(account.AccessToken);
                }
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
        public static AccountSession CreateAccountSession(WxAccount wa, Student s)
        {
            debug.log("CreateAccountSession", wa);
            if (wa == null /*|| !wa.subscribe*/)
            {
                return(null);
            }

            var g = s == null?null: s.StudentGroup == null?null: s.StudentGroup.FirstOrDefault();

            return(new AccountSession()
            {
                ExpDate = DateTime.Now.AddDays(accountExpDay),

                //groupName =s==null?"": g==null?"":g.Name,
                openid = wa.openid,
                studentId = s == null ? 0 : s.Id,
                workId = s == null ? "" : s.WorkID,
                name = s == null ? "" : s.Name,
                LoginDate = DateTime.Now,
            });
        }
Ejemplo n.º 21
0
        private void executeStatusNotifyHttpTask(string host, WxAccount wxAccount)
        {
            try
            {
                HttpTask ht = syncCreateHttpTask(WxHtpUtil.GetStatusNotify(host, wxAccount));
                if (ht != null)
                {
                    WxSendMsgResult msgResult = ht.ExecuteJson <WxSendMsgResult>();
#if Debug
                    if (msgResult == null)
                    {
                        Console.WriteLine("status notify result = null");
                    }
                    else
                    {
                        Console.WriteLine("status notify result ret code = " + msgResult.BaseResponse.Ret + ", msg id=" + msgResult.MsgID);
                    }
#endif
                }
            }
            catch { }
        }
Ejemplo n.º 22
0
        /// <summary>
        /// 上传视频文件
        /// </summary>
        /// <param name="host"></param>
        /// <param name="account"></param>
        /// <param name="toUserNameId"></param>
        /// <param name="videoPath"></param>
        /// <returns></returns>
        /// https://file.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json
        public static HttpTaskParams GetUploadVideo(string host, WxAccount account, string toUserNameId, string videoPath)
        {
            string url = string.Format("{0}?f=json", WxHttpApi.GetFileUploadUrl(host, WxHttpApi.URL_WX_FILE_UPLOAD));

            HttpTaskParams htp  = HttpTaskParams.NewPost(url);
            FileInfo       info = new FileInfo(videoPath);

            htp.AddStringParam("id", "WU_FILE_" + fileCount);
            htp.AddStringParam("name", info.Name);
            htp.AddStringParam("type", WxReqUtil.GetVideoMimeType(info));//"video/mp4"
            htp.AddStringParam("lastModifiedDate", info.LastWriteTime.ToString("r", DateTimeFormatInfo.InvariantInfo));
            htp.AddStringParam("size", info.Length.ToString());
            htp.AddStringParam("chunks", "1"); //分段数,这里一次上传,不分段
            htp.AddStringParam("chunk", "0");  //第几段
            htp.AddStringParam("mediatype", "video");
            htp.AddStringParam("uploadmediarequest", WxReqUtil.GetUploadMediaRequestBody(account, toUserNameId, info, videoPath));
            htp.AddStringParam("webwx_data_ticket", account.DataTicket);
            htp.AddStringParam("pass_ticket", account.PassTicket);
            htp.AddFileParam("filename", videoPath);

            return(htp);
        }
 /// <summary>
 /// 取消关注
 /// </summary>
 /// <returns></returns>
 public static Boolean WxCancelAttend(string openid)
 {
     try
     {
         using (BaseDBContext wdb = new BaseDBContext())
         {
             WxAccount newWa = wdb.WxAccount.Find(openid);
             if (newWa != null)
             {
                 newWa.subscribe = false;
                 newWa.lastDate  = DateTime.Now;
                 wdb.SaveChanges();
             }
             wdb.SaveChanges();
         }
     }
     catch (Exception e)
     {
         //debug.print("cancelAttend", e.Message);
         return(false);
     }
     return(true);
 }
Ejemplo n.º 24
0
        private void DownloadWxAccount(DateTime beginDate, DateTime endDate, string type)
        {
            do
            {
                string date = beginDate.ToString("yyyyMMdd");

                //date格式:20180808
                //type格式:
                //【ALL 所有订单信息
                //SUCCESS 成功支付的订单
                //REFUND 退款订单
                //REVOKED 撤销的订单】
                string result       = DownloadBill.Run(date, type);
                int    currentIndex = 0;  //当前索引
                string line         = ""; //每行内容
                int    count        = 0;  //总行数
                int    maxCount     = 0;  //所需读取数据数
                //读取流
                StringReader reader = null;

                #region 计算读取数
                reader = new StringReader(result);

                while (line != null)
                {
                    line = reader.ReadLine();
                    count++;
                }

                //所需读取数据数
                maxCount = count - 4;
                //重置
                line = "";
                //关闭流
                reader.Close();
                #endregion

                #region 校验是否需要保存数据

                #region 过滤条件
                List <DataFilter> filters = new List <DataFilter>();
                //大于等于起始日期
                filters.Add(new DataFilter {
                    comparison = "gteq", field = "PayTime", type = "date", value = beginDate.ToString("yyyy-MM-dd 00:00:00")
                });
                //小于等于起始日期
                filters.Add(new DataFilter {
                    comparison = "lteq", field = "PayTime", type = "date", value = beginDate.ToString("yyyy-MM-dd 23:59:59")
                });
                #endregion

                //校验是否需要保存微信账单
                bool isSave = wxAccountDao.CheckIsSave(filters, maxCount);

                if (isSave)
                {
                    //需要保存
                    //删除历史数据
                    wxAccountDao.Delete(filters);
                }
                else
                {
                    //不需要保存
                    //增加天数
                    beginDate = beginDate.AddDays(1);
                    continue;
                }

                #endregion

                #region 保存数据
                reader = new StringReader(result);

                //不读取超出的数据
                while (line != null && currentIndex <= maxCount)
                {
                    line = reader.ReadLine();

                    #region 读取数据行
                    if (currentIndex > 0)
                    {
                        string[] accounts = line.Split(',');
                        //店铺名称
                        string storeName = accounts[20].Trim().Split(' ')[0];
                        //支付方式
                        string payModel = "";
                        //门店名称分割出支付方式时,因提供的格式不对有可能分割出现报错
                        try
                        {
                            payModel = accounts[20].Trim().Split(' ')[1];
                        }
                        catch (Exception) { }
                        //费率
                        decimal rate = Convert.ToDecimal(accounts[23].Trim().Split('%')[0]);

                        WxAccount entity = new WxAccount
                        {
                            PayTime           = Convert.ToDateTime(accounts[0].Trim()), //交易时间
                            AppId             = accounts[1].Trim(),                     //AppID
                            MchId             = accounts[2].Trim(),                     //商户号
                            SpecialMchId      = accounts[3].Trim(),                     //特约商户号
                            DeviceId          = accounts[4].Trim(),                     //设备号
                            OrderNo           = accounts[5].Trim(),                     //微信订单号
                            MchOrderNo        = accounts[6].Trim(),                     //商户订单号
                            UserOpenId        = accounts[7].Trim(),                     //用户OpenId
                            PayType           = accounts[8].Trim(),                     //交易类型
                            PayState          = accounts[9].Trim(),                     //交易状态
                            PayBank           = accounts[10].Trim(),                    //付款银行
                            MoneyType         = accounts[11].Trim(),                    //货币种类
                            DiscountsTotal    = Convert.ToDecimal(accounts[12].Trim()), //应结订单金额
                            CouponPrice       = Convert.ToDecimal(accounts[13].Trim()), //代金券金额
                            RefundOrderNo     = accounts[14].Trim(),                    //微信退款单号
                            MchRefundOrderNo  = accounts[15].Trim(),                    //商户退款单号
                            RefundPrice       = Convert.ToDecimal(accounts[16].Trim()), //退款金额
                            CouponRefundPrice = Convert.ToDecimal(accounts[17].Trim()), //充值券退款金额
                            RefundType        = accounts[18].Trim(),                    //退款类型
                            RefundState       = accounts[19].Trim(),                    //退款状态
                            StoreName         = storeName,                              //店铺名称
                            PayModel          = payModel,                               //支付方式
                            DataPackage       = accounts[21].Trim(),                    //商户数据包
                            ServicePrice      = Convert.ToDecimal(accounts[22].Trim()), //手续费
                            Rate            = rate,                                     //费率
                            Total           = Convert.ToDecimal(accounts[24].Trim()),   //订单金额
                            SendRefundPrice = Convert.ToDecimal(accounts[25].Trim()),   //申请退款金额
                            RateRemark      = accounts[26].Trim()                       //费率备注
                        };
                        wxAccountDao.Stateless_Insert(entity);
                    }
                    #endregion

                    currentIndex++;
                }

                //关闭流
                reader.Close();
                #endregion

                //增加天数
                beginDate = beginDate.AddDays(1);
            } while (beginDate <= endDate);
        }
 public CustomMessageHandler(IWxManager wxManager, IWxChatRepository wxChatRepository, WxAccount account, Stream inputStream, PostModel postModel, int maxRecordCount = 0, bool onlyAllowEncryptMessage = false) : base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage)
 {
     _wxManager        = wxManager;
     _wxChatRepository = wxChatRepository;
     _wxAccount        = account;
 }
Ejemplo n.º 26
0
        private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string wxid = e.Node.Tag as string;
            string id   = e.Node.Name;

            switch (wxid)
            {
            case "通讯录":
            {
                panel1.Hide();
                panel3.Hide();
                panel2.Show();
                panel2.Dock = DockStyle.Fill;

                this.dataGridView1.DataSource = null;
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    this.dataGridView1.DataSource = context.WxFriends
                                                    .Where(friend => friend.Type == 3)
                                                    .ToList();
                }

                break;
            }

            case "公众号":
            {
                panel1.Hide();
                panel3.Hide();
                panel2.Show();
                panel2.Dock = DockStyle.Fill;

                this.dataGridView1.DataSource = null;
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    this.dataGridView1.DataSource = context.WxFriends
                                                    .Where(friend => friend.Type == 0)
                                                    .ToList();
                }

                break;
            }

            case "应用程序":
            {
                panel1.Hide();
                panel3.Hide();
                panel2.Show();
                panel2.Dock = DockStyle.Fill;

                this.dataGridView1.DataSource = null;
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    this.dataGridView1.DataSource = context.WxFriends
                                                    .Where(friend => friend.Type == 33)
                                                    .ToList();
                }

                break;
            }

            case "聊天记录":
            {
                Name = "聊天记录";
                panel1.Hide();
                panel2.Hide();
                panel3.Show();
                dataGridView2.Show();
                panel3.Dock = DockStyle.Fill;

                this.dataGridView2.Rows.Clear();
                this.richTextBoxEx1.Clear();
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    this.dataGridView2.Rows.AddRange(
                        context.WxFriends
                        .Where(friend => friend.Type == 3)
                        .Select(new Func <WxFriend, DataGridViewRow>((f) =>
                        {
                            var row = new DataGridViewRow();
                            row.CreateCells(this.dataGridView2, new[] { f.NickName, context.WxMessages.Count(m => m.WxId == f.WxId).ToString() });
                            return(row);
                        }))
                        .ToArray());
                }

                break;
            }

            case "群聊天记录":
            {
                panel1.Hide();
                panel2.Hide();
                panel3.Show();
                dataGridView2.Show();
                panel3.Dock = DockStyle.Fill;

                this.dataGridView2.Rows.Clear();
                this.richTextBoxEx1.Clear();
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    this.dataGridView2.Rows.AddRange(
                        context.WxFriends
                        .Where(friend => friend.Type == 4)
                        .Select(new Func <WxFriend, DataGridViewRow>((f) =>
                        {
                            var row = new DataGridViewRow();
                            row.CreateCells(this.dataGridView2, new[] { f.NickName, context.WxMessages.Count(m => m.WxId == f.WxId).ToString() });
                            return(row);
                        }))
                        .ToArray());
                }

                break;
            }

            case "朋友圈":
            {
                Name = "朋友圈";
                panel1.Hide();
                panel2.Hide();
                panel3.Show();
                dataGridView2.Show();
                panel3.Dock = DockStyle.Fill;

                this.dataGridView2.Rows.Clear();
                this.richTextBoxEx1.Clear();
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    this.dataGridView2.Rows.AddRange(
                        context.WxFriends
                        .Where(friend => friend.Type == 3)
                        .Select(new Func <WxFriend, DataGridViewRow>((f) =>
                        {
                            var row = new DataGridViewRow();
                            row.CreateCells(this.dataGridView2, new[] { f.NickName, context.WxSns.Count(s => s.WxId == f.WxId).ToString() });
                            return(row);
                        }))
                        .ToArray());
                }

                break;
            }

            case "新朋友":
            {
                panel1.Hide();
                panel3.Hide();
                panel2.Show();
                panel2.Dock = DockStyle.Fill;

                this.dataGridView1.DataSource = null;
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    this.dataGridView1.DataSource = context.WxNewFriend.ToList();
                }

                break;
            }

            default:
            {
                panel2.Hide();
                panel3.Hide();
                panel1.Show();
                panel1.Dock = DockStyle.Fill;
                WxAccount acc = null;
                using (SqliteDbContext context = new SqliteDbContext())
                {
                    acc = context.WxAccounts.FirstOrDefault(a => a.WxId == wxid);
                }

                if (acc == null)
                {
                    if (Types != null && Types.Count > 0)
                    {
                        foreach (TreeNodeTypes tnt in Types)
                        {
                            if (Convert.ToString(tnt.Id) == id)
                            {
                                lblCode.Text = tnt.Value;
                                lblName.Text = tnt.Name;
                                label8.Text  = string.Empty;
                                label9.Text  = string.Empty;
                                label10.Text = string.Empty;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    lblCode.Text = acc.WxId;
                    lblName.Text = acc.Sign;
                    label8.Text  = acc.Phone;
                    label9.Text  = acc.NickName;
                    label10.Text = acc.District;
                }

                break;
            }
            }
        }
Ejemplo n.º 27
0
        /// <summary> 执行消息同步循环 </summary>
        /// <param name="wxAccount"></param>
        /// <param name="wxSyncKey"></param>
        private int executeSyncMsgLoop(string host, WxAccount wxAccount, WxSyncKey wxSyncKey)
        {
            //默认账号离线状态
            int code = WxResultCode.ACCOUNT_OFFLINE;

            while (true)
            {
                WxSyncCheckResult syncCheckResult = executeSyncCheckHttpTask(host, wxAccount, wxSyncKey);
#if Debug
                Console.WriteLine("host = " + host + ", synckey reuslt = " + (syncCheckResult == null ? "null" : syncCheckResult.Retcode.ToString()));
#endif
                if (!syncCheckLoginInState())
                {
                    //检测登录状态
                    break;
                }
                else if (syncCheckResult == null)
                {
                    //心跳请求异常
                }
                else if (syncCheckResult.IsStateSuccess)//0
                {
                    //心跳请求成功

                    if (syncCheckResult.Selector != 0)
                    {
                        //有消息需要同步

                        WxSyncMsgResult syncMsgResult = executeSyncMsgHttpTask(host, wxAccount, wxSyncKey);
#if Debug
                        Console.WriteLine("websync reuslt = " + (syncMsgResult == null ? "null" : syncMsgResult.BaseResponse.Ret.ToString()));
#endif

                        if (!syncCheckLoginInState())
                        {
                            //检测登录状态
                            break;
                        }
                        else if (syncMsgResult == null)
                        {
                            //同步消息请求异常
                        }
                        else if (syncMsgResult.IsStateSuccess)
                        {
                            //同步消息请求成功
                            wxSyncKey = syncMsgResult.SyncCheckKey;
                            OnWxTaskReceiveMsgHandler?.Invoke(wxAccount, syncMsgResult);
                        }
                        else
                        {
                            //同步消息请求失败
                            code = syncCheckResult.Retcode;
                            break;
                        }
                    }
                }
                else
                {
                    //心跳请求失败
                    code = syncCheckResult.Retcode;
                    break;
                }


                ThreadUtil.Sleep(1000);
                if (!syncCheckLoginInState())
                {
                    break;
                }
            }

            return(code);
        }
Ejemplo n.º 28
0
        /// <summary> 线程任务 </summary>
        private void run()
        {
            //初始化cookie容器
            mCookieContainer = new CookieContainer();


            //获取微信登录随机设备Id
            string deviceId = WxUtil.GetRandomDeviceId();

#if Debug
            Console.WriteLine("WxTask login device id = " + deviceId);
#endif


            //获取登录uid------------------------------------------
            WxLoginUidResult loginUidResult = executeLoginUidHttpTask();
#if Debug
            Console.WriteLine("WxTask login uid = " + (loginUidResult == null ? "null" : loginUidResult.Uid));
#endif
            if (!syncCheckLoginingState())
            {
                return;
            }

            //检测uid
            if (!WxResultUtil.CheckLoginUidResult(loginUidResult))
            {
                callbackLoginFailed(WxLoginCode.UID_ERROR);
                return;
            }


            //获取微信登录二维码-----------------------------------------------
            byte[] qrCodeBytes = executeLoginQrCodeHttpTask(loginUidResult.Uid);
#if Debug
            Console.WriteLine("WxTask login qrcode = " + (qrCodeBytes == null ? "null" : "has qr code"));
#endif
            if (!syncCheckLoginingState())
            {
                return;
            }

            if (qrCodeBytes == null)
            {
                callbackLoginFailed(WxLoginCode.QRCODE_ERROR);
                return;
            }
            //二维码回调
            OnWxTaskLoginQrCodeHandler?.Invoke(qrCodeBytes);



            //检测扫描登录-----------------------------------------------------------------
            WxLoginScanResult loginScanResult = executeLoginScanHttpTask(loginUidResult.Uid);
#if Debug
            Console.WriteLine("WxTask login scan = " + (loginScanResult == null ? "null" : loginScanResult.ToString()));
#endif
            if (!syncCheckLoginingState())
            {
                return;
            }

            if (!WxResultUtil.CheckLoginScanResult(loginScanResult))
            {
                if (WxResultUtil.CheckLoginScanExpired(loginScanResult))
                {
                    callbackLoginFailed(WxLoginCode.SCAN_EXPIRED);
                }
                else
                {
                    callbackLoginFailed(WxLoginCode.SCAN_ERROR);
                }

                return;
            }


            //开始登录操作回调-----------------------------------
            OnWxTaskLoginPreHandler?.Invoke();


            //登录步骤完成,已获取各种唯一标识符,如果该步完成,手机端显示已登录--------------------------
            WxLoginIdsResult loginIdsResult = executeLoginRedirectUriHttpTask(loginScanResult.RedirectUri);
#if Debug
            Console.WriteLine("WxTask login ids = " + (loginIdsResult == null ? "null" : loginIdsResult.ToString()));
#endif
            //设置全局host
            if (WxResultUtil.CheckLoginIdsResult(loginIdsResult))
            {
                setHost(loginIdsResult.RouteHost);
            }

            if (!syncCheckLoginingState())
            {
                if (WxResultUtil.CheckLoginIdsResult(loginIdsResult))
                {
                    executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid);
                }

                return;
            }

            if (!WxResultUtil.CheckLoginIdsResult(loginIdsResult))
            {
                if (WxResultUtil.CheckLoginIdsAccountClosure(loginIdsResult))/*loginIdsResult != null && loginIdsResult.IsAccountException()*/
                {
                    callbackLoginFailed(WxLoginCode.IDS_ACCOUNT_CLOSURE);
                }
                else
                {
                    callbackLoginFailed(WxLoginCode.IDS_ERROR);
                }

                return;
            }


            //访问初始化接口,这里面才有昵称--------------------------------------------------------
            WxLoginInitResult loginInitResult = executeLoginInitHttpTask(GetHost(), loginIdsResult, deviceId);
#if Debug
            Console.WriteLine("WxTask login init = " + (loginInitResult == null ? "null" : loginInitResult.ToString()));
#endif
            if (!syncCheckLoginingState())
            {
                executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid);
                return;
            }

            if (!WxResultUtil.CheckResultSuccess(loginInitResult))
            {
                callbackLoginFailed(WxLoginCode.INIT_ERROR);
                executeLogout(GetHost(), loginIdsResult.Skey, loginIdsResult.Uin, loginIdsResult.Sid);
                return;
            }


            //创建登录账号对象--------------------------------------------------------
            WxAccount wxAccount = WxUtil.CreateWxAccount(loginIdsResult, loginInitResult, deviceId);


            //标记登录状态
            syncSetLoginState(STATE_LOGINED);


            //发送状态通知消息,一定要发
            if (syncCheckLoginInState())
            {
                executeStatusNotifyHttpTask(GetHost(), wxAccount);
            }


            //微信登录成功回调
            OnWxTaskLoginSuccessHandler?.Invoke(wxAccount);


            //微信初始化回调
            OnWxTaskLoginInitHandler?.Invoke(wxAccount, loginInitResult);


            //获取所有联系人,一定要先获取
            if (syncCheckLoginInState())
            {
                WxContactAllResult contactAllResult = executeGetContactAllHttpTask(GetHost(), wxAccount);
                if (WxResultUtil.CheckResultSuccess(contactAllResult) && syncCheckLoginInState())
                {
                    OnWxTaskLoginGetContactAllHandler?.Invoke(wxAccount, contactAllResult.MemberList);
                }
            }


            //开始循环同步消息
            int syncCode = WxResultCode.ACCOUNT_OFFLINE;
            if (syncCheckLoginInState())
            {
                syncCode = executeSyncMsgLoop(GetHost(), wxAccount, loginInitResult.SyncKey);
            }


            //先给登出回调,再做登出请求操作
            WxLogoutCode code = syncGetLogoutCode(syncCode);
            OnWxTaskLogoutHandler?.Invoke(wxAccount, code);
            string result = executeLogout(GetHost(), wxAccount);

#if Debug
            Console.WriteLine("WxTask logout WxLogoutCode = " + code + ", nickName=" + wxAccount.NickName);
#endif
        }
Ejemplo n.º 29
0
        private void DataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                DataGridViewCheckBoxCell dgcc = (DataGridViewCheckBoxCell)this.dataGridView2.Rows[e.RowIndex].Cells[0];
                Boolean flag = Convert.ToBoolean(dgcc.Value);
                dgcc.Value = flag == true ? false : true;
            }
            catch (Exception)
            {
            }

            if (e.RowIndex < 0)
            {
                return;
            }

            using (SqliteDbContext context = new SqliteDbContext())
            {
                richTextBoxEx1.Clear();
                string    nickName = this.dataGridView2.Rows[e.RowIndex].Cells[0].Value as string;
                WxFriend  friend   = context.WxFriends.FirstOrDefault(f => f.NickName == nickName);//仅查找一条数据
                WxAccount account  = context.WxAccounts.FirstOrDefault(a => a.Id == 1);

                if (friend == null)//如果没有找到
                {
                    return;
                }
                if (Name == "聊天记录")
                {
                    //(treeView1.selectedNode.Name == “name1”)
                    var messages = context.WxMessages //
                                   .Where(m => m.WxId == friend.WxId)
                                   .OrderBy(m => m.CreateTime)
                                   .ToList();

                    messages.ForEach(m =>
                    {
                        if (m.IsSend == 1)
                        {
                            richTextBoxEx1.SelectionAlignment = HorizontalAlignment.Right;
                            richTextBoxEx1.SelectionColor     = Color.DimGray;
                            richTextBoxEx1.SelectionBackColor = Color.WhiteSmoke;
                            richTextBoxEx1.AppendText("(");
                            richTextBoxEx1.AppendText($"{account.NickName}");
                            richTextBoxEx1.AppendText(")");
                            richTextBoxEx1.AppendText($"{account.WxId}");
                            System.Drawing.Image img = System.Drawing.Image.FromFile(@"D:\UDisk\avator" + account.AvatarPath);
                            Bitmap bmp = new Bitmap(img, 25, 22);
                            Clipboard.SetDataObject(bmp);
                            DataFormats.Format dataFormat =
                                DataFormats.GetFormat(DataFormats.Bitmap);
                            if (richTextBoxEx1.CanPaste(dataFormat))
                            {
                                richTextBoxEx1.Paste(dataFormat);
                            }
                            richTextBoxEx1.AppendText("\n");
                            richTextBoxEx1.SelectionColor = Color.Red;
                        }
                        else
                        {
                            richTextBoxEx1.SelectionAlignment = HorizontalAlignment.Left;
                            richTextBoxEx1.SelectionColor     = Color.DimGray;
                            richTextBoxEx1.SelectionBackColor = Color.Blue;
                            System.Drawing.Image img          = System.Drawing.Image.FromFile(@"D:\UDisk\avator" + friend.AvatarPath);
                            Bitmap bmp = new Bitmap(img, 25, 22);
                            Clipboard.SetDataObject(bmp);
                            DataFormats.Format dataFormat =
                                DataFormats.GetFormat(DataFormats.Bitmap);
                            if (richTextBoxEx1.CanPaste(dataFormat))
                            {
                                richTextBoxEx1.Paste(dataFormat);
                            }
                            richTextBoxEx1.AppendText("(");
                            richTextBoxEx1.AppendText($"{friend.NickName}");
                            richTextBoxEx1.AppendText(")");
                            richTextBoxEx1.AppendText($"{m.WxId}\n");
                        }
                        //在sqlite的message表里面,有的对话的path字段含有空格,需要使用Replace进行去除
                        if (string.IsNullOrEmpty(m.Path.Replace(" ", "")))         //message是单纯的对话消息 或者 是含有url链接的消息
                        {
                            SelectUrl.print_msg_or_url(m.Content, richTextBoxEx1); //该方法在打印message内容的同时能够识别url
                            //Console.WriteLine("是对话或者链接:"+m.Content);
                        }
                        else//说明message是文件类型的消息,这时候应当能够点击链接并打开文件
                        {
                            //Console.WriteLine("文件类型:" + m.Content);
                            SelectUrl.print_file(m.Path, richTextBoxEx1);
                        }
                        richTextBoxEx1.AppendText($"{m.CreateTime}\n\n\n");
                    });
                }
                else if (Name == "朋友圈")
                {
                    var sns = context.WxSns
                              .Where(s => s.WxId == friend.WxId)
                              .OrderBy(s => s.CreateTime)
                              .ToList();

                    sns.ForEach(s =>
                    {
                        richTextBoxEx1.SelectionAlignment = HorizontalAlignment.Left;
                        richTextBoxEx1.SelectionColor     = Color.DimGray;
                        System.Drawing.Image img          = System.Drawing.Image.FromFile(@"D:\UDisk\avator" + friend.AvatarPath);
                        Bitmap bmp = new Bitmap(img, 25, 22);
                        Clipboard.SetDataObject(bmp);
                        DataFormats.Format dataFormat =
                            DataFormats.GetFormat(DataFormats.Bitmap);
                        if (richTextBoxEx1.CanPaste(dataFormat))
                        {
                            richTextBoxEx1.Paste(dataFormat);
                        }
                        richTextBoxEx1.AppendText("(");
                        richTextBoxEx1.AppendText($"{friend.NickName}");
                        richTextBoxEx1.AppendText(")");
                        richTextBoxEx1.AppendText($"{s.WxId}\n");

                        richTextBoxEx1.SelectionColor = Color.Blue;
                        richTextBoxEx1.AppendText($"{s.Content}\n");
                        richTextBoxEx1.AppendText($"{s.CreateTime}\n\n\n\n");


                        richTextBoxEx1.SelectionBackColor = Color.WhiteSmoke;
                    });
                }
            }
        }