Пример #1
0
        /// <summary>
        /// 本地rpc远程代理
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="method"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public byte[] RemoteCall(string serviceName, string method, byte[] args)
        {
            if (!_isConnected)
            {
                throw new RPCSocketException("连接到服务器失败");
            }

            byte[] result = null;

            var msg = new RSocketMsg(RSocketMsgType.Request, serviceName, method)
            {
                SequenceNumber = UniqueKeyHelper.Next()
            };

            msg.Data = args;

            BaseSend(msg);

            if (_syncHelper.WaitOne(msg.SequenceNumber, (r) =>
            {
                result = r;
            }, 10 * 1000))
            {
                return(result);
            }
            return(null);
        }
Пример #2
0
        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="method"></param>
        /// <param name="args"></param>
        /// <param name="timeOut"></param>
        /// <returns></returns>
        public byte[] Request(string serviceName, string method, byte[] args, int timeOut)
        {
            try
            {
                byte[] result = null;

                var msg = new RSocketMsg(RSocketMsgType.Request, serviceName, method)
                {
                    SequenceNumber = UniqueKeyHelper.Next()
                };

                msg.Data = args;

                if (_syncHelper.Wait(msg.SequenceNumber, () => { this.BeginSend(msg); }, (r) => { result = r; }, timeOut))
                {
                    return(result);
                }
                else
                {
                    ExceptionCollector.Add("Consumer", new RPCSocketException($"serviceName:{serviceName}/method:{method} 调用超时!"));
                }
            }
            catch (Exception ex)
            {
                ExceptionCollector.Add("Consumer", new RPCSocketException($"serviceName:{serviceName}/method:{method} 调用出现异常!", ex));
            }
            return(null);
        }
Пример #3
0
        /// <summary>
        /// 向注册了接收通知的rpc client 发送通知
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        public void Notice <T>(T t)
        {
            if (t != null)
            {
                var list = _noticeCollection.GetList().GetAwaiter().GetResult();

                if (list != null && list.Any())
                {
                    var data = SAEASerialize.Serialize(t);

                    var msg = new RSocketMsg(RSocketMsgType.Notice, null, null, data)
                    {
                        SequenceNumber = UniqueKeyHelper.Next()
                    };

                    foreach (var item in list)
                    {
                        try
                        {
                            _RServer.Reply(item, msg);
                        }
                        catch (Exception ex)
                        {
                            LogHelper.Warn("ServiceProvider.Notice 出现异常", ex);
                        }
                    }
                }
            }
        }
Пример #4
0
        /// <summary>
        /// 向rpc service provider 注册接收通知
        /// </summary>
        public void RegistReceiveNotice()
        {
            var msg = new RSocketMsg(RSocketMsgType.RegistNotice, null, null)
            {
                SequenceNumber = UniqueKeyHelper.Next()
            };

            Send(msg);
        }
Пример #5
0
        public virtual void GenerateProductNumber()
        {
            string number = UniqueKeyHelper.GenerateKey(AlgorithmTypes.Random, 15, 25);

            while (!DictionaryManager.IsValidProductNumber(ProductID, number))
            {
                number = UniqueKeyHelper.GenerateKey(AlgorithmTypes.Random, 15, 25);
            }
            ProductNumber = number;
        }
Пример #6
0
        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="method"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public byte[] Request(string serviceName, string method, byte[] args)
        {
            byte[] result = null;

            try
            {
                var msg = new RSocketMsg(RSocketMsgType.Request, serviceName, method)
                {
                    SequenceNumber = UniqueKeyHelper.Next()
                };

                msg.Data = args;

                result = _disorderSyncHelper.Wait(msg.SequenceNumber, () => { SendBase(msg); });
            }
            catch (Exception ex)
            {
                ExceptionCollector.Add("Consumer.Request.Error", new RPCSocketException($"serviceName:{serviceName}/method:{method} 调用超时!", ex));
            }
            return(result);
        }
Пример #7
0
        /// <summary>
        /// 绑定客户-小程序
        /// </summary>
        /// <param name="payload"></param>
        /// <returns></returns>
        private Response BindCustomer(WxPayloadVO payload)
        {
            HttpClient client = new HttpClient();
            string     url    = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code";

            url = string.Format(url, AppId, Secret, payload.Code);

            HttpResponseMessage response = client.GetAsync(url).Result;

            response.EnsureSuccessStatusCode();

            string  msg  = response.Content.ReadAsStringAsync().Result;
            dynamic data = JsonConvert.DeserializeObject <dynamic>(msg);

            if (data.errmsg == null)
            {
                var             openid         = (string)data.openid;
                var             session_key    = (string)data.session_key;
                byte[]          encryData      = Convert.FromBase64String(payload.EncryptedData);
                RijndaelManaged rijndaelCipher = new RijndaelManaged
                {
                    Key     = Convert.FromBase64String(session_key),
                    IV      = Convert.FromBase64String(payload.Iv),
                    Mode    = CipherMode.CBC,
                    Padding = PaddingMode.PKCS7
                };
                ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
                byte[]           plainText = transform.TransformFinalBlock(encryData, 0, encryData.Length);
                string           result    = Encoding.Default.GetString(plainText);
                //动态解析result 成对象
                dynamic obj = Newtonsoft.Json.Linq.JToken.Parse(result) as dynamic;

                string phoneNumber = (string)obj.phoneNumber;

                //查询手机号是否已注册
                dynamic staff = StaffService.QueryWxappUserByPhoneNumber(phoneNumber);

                if (staff == null)
                {
                    ESSChannelStaff customer = StaffService.QueryCustomerByWxopenid(openid);
                    if (customer == null)
                    {
                        ChannelStaffVO vo = new ChannelStaffVO();
                        vo.ISNEW       = false;
                        vo.FCHANNELID  = 27;
                        vo.FMOBILE     = phoneNumber;
                        vo.XCXOPENID   = openid;
                        vo.FENABLE     = '1';
                        vo.FTELE       = string.Empty;
                        vo.FCREATEDATE = System.DateTime.Now;
                        vo.FMODIFYDATE = System.DateTime.Now;
                        vo.FCREATORID  = 0;
                        vo.FMODIFIERID = 0;
                        vo.FQQ         = string.Empty;
                        vo.ISNEW       = false;
                        vo.KHNAME      = "用户" + UniqueKeyHelper.GetUniqueKey(8);


                        ChannelStaffLVO staffLVO = new ChannelStaffLVO
                        {
                            FNAME   = "微信注册用户",
                            FJOB    = "客户",
                            FREMARK = string.Empty,
                            FROLEID = 1001
                        };

                        vo.ChannelStaffLVOs = staffLVO;

                        StaffService.Save(vo);

                        if (StaffService.ZXKH_Staff_Customers(openid)) //判断该用户是否有客服关联,微信小程序消息发送进行人员的第一次分配
                        {
                            StaffService.ZXKH_AddShip(openid);         //添加人员关系
                        }


                        NHSessionProvider.GetCurrentSession().Flush();

                        customer = StaffService.QueryCustomerByWxopenid(openid);
                        ESSChannelStaffAvatar avatar = new ESSChannelStaffAvatar
                        {
                            //Picture = "Image/head.png",
                            Picture     = "https://zxkf.shuziyu.net//Image/newcomer.png",
                            StaffId     = customer.FID,
                            UseWxAvatar = false
                        };

                        StaffService.SaveAvatar(avatar);
                    }
                    else
                    {
                        customer.FMOBILE = phoneNumber;
                    }
                    NHSessionProvider.GetCurrentSession().Flush();

                    staff = StaffService.QueryWxappUserByPhoneNumber(phoneNumber);
                }
                dynamic staffXCXOpenid = StaffService.QueryWxappUserByXCXOpenid(phoneNumber);
                if (staffXCXOpenid == null)
                {
                    StaffService.QueryWxappUserEditXCXOpenid(phoneNumber, openid);
                }

                var token = JwtHelper.GenerateToken((int)staff["FID"], (string)staff["FJOB"], 2);

                var user = new
                {
                    userId          = (int)staff["FID"],
                    userName        = (string)staff["FNAME"],
                    wxopenid        = (string)staff["FWXOPENID"],
                    FJOB            = (string)staff["FJOB"],
                    channelName     = (string)staff["CHANNELNAME"],
                    channelCode     = (string)staff["FCHANNELCODE"],
                    channelId       = (int)staff["FCHANNELID"],
                    customerId      = (int)staff["FCUSTOMERID"],
                    channelTypeId   = (int)staff["FCHANNELTYPEID"],
                    channelTypeName = (string)staff["FCHANNELTYPENAME"],
                    avatarUrl       = (string)staff["PICTURE"],
                    nickName        = (string)staff["KHNAME"],
                    xcxopenid       = (string)staff["XCXOPENID"],
                    phoneNumber     = phoneNumber
                };

                return(new Response
                {
                    Result = new
                    {
                        token,
                        user
                    }
                });
            }
            else
            {
                throw new Exception((string)data.errmsg);
            }
        }