Пример #1
0
        public EncryptedMessage PrepareRpcCall(SessionContainer request)
        {
            SHA1.Create();

            var encData = new EncryptedData
            {
                Salt = Salt,
                SessionId = SessionId,
                MessageId = GetNextMessageId(),
                SeqNo = GetNextSeqNo(),
                MessageData = request.Combinator.Serialize()
            };
            
            encData.MessageDataLength = encData.MessageData.Length;
            return new EncryptedMessage(_authKey, encData, 0);
        }
Пример #2
0
        /// <summary>
        /// 解密运动步数
        /// </summary>
        /// <param name="sessionId"></param>
        /// <param name="encryptedData"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        public ActionResult DecryptRunData(string sessionId, string encryptedData, string iv)
        {
            var sessionBag = SessionContainer.GetSession(sessionId);

            try
            {
                var runData = Senparc.Weixin.WxOpen.Helpers.EncryptHelper.DecryptRunData(sessionId, encryptedData, iv);

                //throw new WeixinException("解密PhoneNumber异常测试");//启用这一句,查看客户端返回的异常信息

                return(Json(new { success = true, runData = runData }));
            }
            catch (Exception ex)
            {
                return(Json(new { success = false, msg = ex.Message }));
            }
        }
Пример #3
0
        public void TestClearTokenByResourceIdRemovesToken()
        {
            SessionContainer sessionContainer = new SessionContainer("127.0.0.1");

            var    collectionResourceId = ResourceId.NewDocumentCollectionId(42, 129).DocumentCollectionId.ToString();
            string collectionFullname   = "dbs/db1/colls/collName";

            sessionContainer.SetSessionToken(
                collectionResourceId,
                collectionFullname,
                new StoreRequestNameValueCollection()
            {
                { HttpConstants.HttpHeaders.SessionToken, "range_0:1#100#4=90#5=1" }
            }
                );

            // check that can read from cache based on resource-id
            using (DocumentServiceRequest request = DocumentServiceRequest.Create(OperationType.Read, collectionResourceId, ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null))
            {
                ISessionToken token = sessionContainer.ResolvePartitionLocalSessionToken(request, "range_0");
                Assert.AreEqual(100, token.LSN);
            }

            // check that can read from cache based on name
            using (DocumentServiceRequest request = DocumentServiceRequest.CreateFromName(OperationType.Read, "dbs/db1/colls/collName/docs/42", ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null))
            {
                ISessionToken token = sessionContainer.ResolvePartitionLocalSessionToken(request, "range_0");
                Assert.AreEqual(100, token.LSN);
            }

            sessionContainer.ClearTokenByResourceId(collectionResourceId);

            // check that can't read from cache based on resource-id
            using (DocumentServiceRequest request = DocumentServiceRequest.Create(OperationType.Read, collectionResourceId, ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null))
            {
                ISessionToken token = sessionContainer.ResolvePartitionLocalSessionToken(request, "range_0");
                Assert.AreEqual(null, token);
            }

            // check that can't read from cache based on name
            using (DocumentServiceRequest request = DocumentServiceRequest.CreateFromName(OperationType.Read, "dbs/db1/colls/collName/docs/42", ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null))
            {
                ISessionToken token = sessionContainer.ResolvePartitionLocalSessionToken(request, "range_0");
                Assert.AreEqual(null, token);
            }
        }
Пример #4
0
        public object Do_UserReg(BaseApi baseApi)
        {
            UserRegParam userRegParam = JsonConvert.DeserializeObject <UserRegParam>(baseApi.param.ToString());

            if (userRegParam == null)
            {
                throw new ApiException(CodeMessage.InvalidParam, "InvalidParam");
            }

            SessionBag sessionBag = SessionContainer.GetSession(baseApi.token);

            if (sessionBag == null)
            {
                throw new ApiException(CodeMessage.InvalidToken, "InvalidToken");
            }

            OpenDao openDao = new OpenDao();
            string  openID  = Utils.GetOpenID(baseApi.token);
            User    user    = openDao.GetUser(openID);

            if (user != null)
            {
                throw new ApiException(CodeMessage.UserExist, "UserExist");
            }

            if (!openDao.GetUserCode(userRegParam.userCode))
            {
                throw new ApiException(CodeMessage.InvalidUserCode, "InvalidUserCode");
            }

            if (!openDao.UserReg(userRegParam, openID))
            {
                throw new ApiException(CodeMessage.UserRegError, "UserRegError");
            }
            user = openDao.GetUser(openID);
            SessionUser sessionUser = JsonConvert.DeserializeObject <SessionUser>(sessionBag.Name);

            sessionUser.openid   = sessionBag.OpenId;
            sessionUser.userId   = user.userId;
            sessionUser.userType = "USER";
            sessionBag.Name      = JsonConvert.SerializeObject(sessionUser);
            SessionContainer.Update(sessionBag.Key, sessionBag);

            return("");
        }
Пример #5
0
        public async Task <IActionResult> DecodeEncryptedData(string type, string sessionId, string encryptedData, string iv)
        {
            DecodeEntityBase decodedEntity = null;

            switch (type.ToUpper())
            {
            case "USERINFO":    //wx.getUserInfo()
                decodedEntity = Senparc.Weixin.WxOpen.Helpers.EncryptHelper.DecodeUserInfoBySessionId(
                    sessionId,
                    encryptedData, iv);
                break;

            default:
                break;
            }

            //检验水印
            var checkWatermark = false;

            if (decodedEntity != null)
            {
                checkWatermark = decodedEntity.CheckWatermark(WxOpenAppId);

                //保存用户信息(可选)
                if (checkWatermark && decodedEntity is DecodedUserInfo decodedUserInfo)
                {
                    var sessionBag = await SessionContainer.GetSessionAsync(sessionId);

                    if (sessionBag != null)
                    {
                        await SessionContainer.AddDecodedUserInfoAsync(sessionBag, decodedUserInfo);
                    }
                }
            }


            //注意:此处仅为演示,敏感信息请勿传递到客户端!
            return(Json(new
            {
                success = checkWatermark,
                //decodedEntity = decodedEntity,
                msg = string.Format("水印验证:{0}",
                                    checkWatermark ? "通过" : "不通过")
            }));
        }
Пример #6
0
        public ActionResult GetPrepayid(string sessionId)
        {
            try
            {
                var sessionBag = SessionContainer.GetSession(sessionId);
                var openId     = sessionBag.OpenId;


                //生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一
                var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId /*10位*/, DateTime.Now.ToString("yyyyMMddHHmmss"),
                                              TenPayV3Util.BuildRandomStr(6));

                var timeStamp = TenPayV3Util.GetTimestamp();
                var nonceStr  = TenPayV3Util.GetNoncestr();

                var body        = "小程序微信支付Demo";
                var price       = 1;//单位:分
                var xmlDataInfo = new TenPayV3UnifiedorderRequestData(WxOpenAppId, TenPayV3Info.MchId, body, sp_billno, price, Request.UserHostAddress, TenPayV3Info.TenPayV3Notify,
                                                                      TenPayV3Type.JSAPI, openId, TenPayV3Info.Key, nonceStr);

                var result = TenPayV3.Unifiedorder(xmlDataInfo);//调用统一订单接口

                var packageStr = "prepay_id=" + result.prepay_id;

                return(Json(new
                {
                    success = true,
                    prepay_id = result.prepay_id,
                    appId = TenPayV3Info.AppId,
                    timeStamp,
                    nonceStr,
                    package = packageStr,
                    //signType = "MD5",
                    paySign = TenPayV3.GetJsPaySign(WxOpenAppId, timeStamp, nonceStr, packageStr, TenPayV3Info.Key)
                }));
            }
            catch (Exception ex)
            {
                return(Json(new
                {
                    success = false,
                    msg = ex.Message
                }));
            }
        }
        public override async Task OnMessageReceiced(WebSocketHelper webSocketHandler, ReceivedMessage receivedMessage, string originalData)
        {
            if (receivedMessage == null || string.IsNullOrEmpty(receivedMessage.Message))
            {
                return;
            }

            var message = receivedMessage.Message;

            await webSocketHandler.SendMessage("originalData:" + originalData, webSocketHandler.WebSocket.Clients.Caller);

            await webSocketHandler.SendMessage("您发送了文字:" + message, webSocketHandler.WebSocket.Clients.Caller);

            await webSocketHandler.SendMessage("正在处理中(反转文字)...", webSocketHandler.WebSocket.Clients.Caller);

            await Task.Delay(1000);

            //处理文字
            var result = string.Concat(message.Reverse());
            await webSocketHandler.SendMessage(result, webSocketHandler.WebSocket.Clients.Caller);

            var appId = Config.SenparcWeixinSetting.WxOpenAppId;//与微信小程序账号后台的AppId设置保持一致,区分大小写。

            try
            {
                var sessionBag = SessionContainer.GetSession(receivedMessage.SessionId);

                //临时演示使用固定openId
                var openId = sessionBag != null ? sessionBag.OpenId : "onh7q0DGM1dctSDbdByIHvX4imxA";// "用户未正确登陆";

                //await webSocketHandler.SendMessage("OpenId:" + openId, webSocketHandler.WebSocket.Clients.Caller);
                //await webSocketHandler.SendMessage("FormId:" + formId);

                //群发
                await webSocketHandler.SendMessage($"[群发消息] [来自 OpenId:***{openId.Substring(openId.Length - 10, 10)},昵称:{sessionBag.DecodedUserInfo?.nickName}]:{message}", webSocketHandler.WebSocket.Clients.All);
            }
            catch (Exception ex)
            {
                var msg = ex.Message + "\r\n\r\n" + originalData + "\r\n\r\nAPPID:" + appId;

                await webSocketHandler.SendMessage(msg, webSocketHandler.WebSocket.Clients.Caller); //VS2017以下如果编译不通过,可以注释掉这一行

                WeixinTrace.SendCustomLog("WebSocket OnMessageReceiced()过程出错", msg);
            }
        }
Пример #8
0
        public void DecodeUserInfoBySessionIdTest()
        {
            var sessionId     = "ABCDEFG";
            var sessionKey    = "/mGmINZAe+7k6kNz32wxSw==";
            var encryptedData =
                "CFcsIXmH2r0v9ehjEhS+uUpJkr8qGQyt+Za3YkhjVNNA+xGj2WB2QFxDXdKVSzc10LukeB2maCxZCqpPQrWQx6CKF/VkEx96hXpPuBMpWBnnLzupoJpkRW9gJGRz7dcXDnqzstf2etRumDeAFDyjEKZ6bqs+KTE7qHauMsctxg4TXPbzzvWQm783j9PoWsCm/0A+aGNWCfZSFuJgi5G+LjTVqcGqP+mlAnLIFmgGLTo3vWrekz0//2vCMhgcgwKjPMR+VZTB7UItvnWfF4h4oOajcMuEiwTifaFkyn7l4NtLroMYjOfId16B6XCTK0BvPhTw9GI3wPMDopwWF2q3Op8M2fYWJuVGFKbrAZvVY/ILeIxYLaHuwHAOYULLre5Mg1kQpURlQ6I6e6GjraJUoL1BqsM38DayY5xRRFJsehZgrWkOySWICuN20Bte7+2N8D6PvhsaNyQz+4Lp4XY/Nn+clNGoM1v6aKTCv7PY2wo=";
            var iv = "ASJ0whjRyLK1tvgb7bAVSw==";

            SessionContainer.UpdateSession(sessionId, "OpenId", sessionKey);

            var userInfo = Senparc.Weixin.WxOpen.Helpers.EncryptHelper.DecodeUserInfoBySessionId(sessionId,
                                                                                                 encryptedData, iv);

            Assert.IsNotNull(userInfo);
            Assert.AreEqual("wxfcb0a0031394a51c", userInfo.watermark.appid);

            Console.WriteLine(SerializerHelper.GetJsonString(userInfo));
        }
Пример #9
0
        /// <summary>
        /// 比较签名是否正确
        /// </summary>
        /// <param name="sessionId"></param>
        /// <param name="rawData"></param>
        /// <param name="compareSignature"></param>
        /// <exception cref="WxOpenException">当SessionId或SessionKey无效时抛出异常</exception>
        /// <returns></returns>
        public static bool CheckSignature(string sessionId, string rawData, string compareSignature)
        {
            var sessionBag = SessionContainer.GetSession(sessionId);

            if (sessionBag == null)
            {
                throw new WxOpenException("SessionId无效");
            }

            if (string.IsNullOrEmpty(sessionBag.SessionKey))
            {
                throw new WxOpenException("SessionKey无效");
            }

            var signature = GetSignature(rawData, sessionBag.SessionKey);

            return(signature == compareSignature);
        }
        public void UpdateSessionTest()
        {
            var openId     = "openid";
            var sessionKey = "sessionKey";
            var unionId    = "unionId";
            var bag        = SessionContainer.UpdateSession(null, openId, sessionKey, unionId);

            Console.WriteLine("bag.Key:{0}", bag.Key);
            Console.WriteLine("bag.ExpireTime:{0}", bag.ExpireTime);

            var key = bag.Key;

            Thread.Sleep(1000);
            var bag2 = SessionContainer.GetSession(key);

            Assert.IsNotNull(bag2);
            Console.WriteLine("bag2.ExpireTime:{0}", bag2.ExpireTime);
        }
        private static GatewayStoreModel MockGatewayStoreModel(Func <HttpRequestMessage, Task <HttpResponseMessage> > sendFunc)
        {
            Mock <IDocumentClientInternal> mockDocumentClient = new Mock <IDocumentClientInternal>();

            mockDocumentClient.Setup(client => client.ServiceEndpoint).Returns(new Uri("https://foo"));

            GlobalEndpointManager endpointManager  = new GlobalEndpointManager(mockDocumentClient.Object, new ConnectionPolicy());
            ISessionContainer     sessionContainer = new SessionContainer(string.Empty);
            HttpMessageHandler    messageHandler   = new MockMessageHandler(sendFunc);

            return(new GatewayStoreModel(
                       endpointManager,
                       sessionContainer,
                       Cosmos.ConsistencyLevel.Eventual,
                       new DocumentClientEventSource(),
                       new JsonSerializerSettings(),
                       MockCosmosUtil.CreateCosmosHttpClient(() => new HttpClient(messageHandler))));
        }
Пример #12
0
        public ActionResult TemplateTest(string sessionId, string formId)
        {
            var templateMessageService = new TemplateMessageService();

            try
            {
                var sessionBag = templateMessageService.RunTemplateTest(WxOpenAppId, sessionId, formId);

                return(Json(new { success = true, msg = "发送成功,请返回消息列表中的【服务通知】查看模板消息。\r\n点击模板消息还可重新回到小程序内。" }));
            }
            catch (Exception ex)
            {
                var sessionBag = SessionContainer.GetSession(sessionId);
                var openId     = sessionBag != null ? sessionBag.OpenId : "用户未正确登陆";

                return(Json(new { success = false, openId = openId, formId = formId, msg = ex.Message }));
            }
        }
Пример #13
0
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            object[] objAllowedAnonymousArray =
                filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowedAnonymous), false);
            if (objAllowedAnonymousArray.Length > 0)
            {
                return;
            }

            UserContext = SessionContainer.GetUserContext(HttpContext) as ShellUserContext;

            if (UserContext == null)
            {
                //返回登录超时的消息
            }
        }
Пример #14
0
        public ActionResult OnLogin(string code)
        {
            var jsonResult = SnsApi.JsCode2Json(AppId, AppSecret, code);

            if (jsonResult.errcode == ReturnCode.请求成功)
            {
                //Session["WxOpenUser"] = jsonResult;//使用Session保存登陆信息(不推荐)
                //使用SessionContainer管理登录信息(推荐)
                var sessionBag = SessionContainer.UpdateSession(null, jsonResult.openid, jsonResult.session_key);

                //注意:生产环境下SessionKey属于敏感信息,不能进行传输!
                return(Json(new { success = true, msg = "OK", sessionId = sessionBag.Key, sessionKey = sessionBag.SessionKey }));
            }
            else
            {
                return(Json(new { success = false, msg = jsonResult.errmsg }));
            }
        }
Пример #15
0
        /// <summary>
        /// 解密消息(通过SessionId获取)
        /// </summary>
        /// <param name="sessionId"></param>
        /// <param name="encryptedData"></param>
        /// <param name="iv"></param>
        /// <exception cref="WxOpenException">当SessionId或SessionKey无效时抛出异常</exception>
        /// <returns></returns>
        public static string DecodeEncryptedDataBySessionId(string sessionId, string encryptedData, string iv)
        {
            var sessionBag = SessionContainer.GetSession(sessionId);

            if (sessionBag == null)
            {
                throw new WxOpenException("SessionId无效");
            }

            if (string.IsNullOrEmpty(sessionBag.SessionKey))
            {
                throw new WxOpenException("SessionKey无效");
            }

            var resultStr = DecodeEncryptedData(sessionBag.SessionKey, encryptedData, iv);

            return(resultStr);
        }
Пример #16
0
        public object Do_CheckCode(BaseApi baseApi)
        {
            CheckCodeParam checkCodeParam = JsonConvert.DeserializeObject <CheckCodeParam>(baseApi.param.ToString());

            if (checkCodeParam == null)
            {
                throw new ApiException(CodeMessage.InvalidParam, "InvalidParam");
            }
            string tSms = Utils.GetCache <string>(baseApi.token);

            if (tSms != null)
            {
                throw new ApiException(CodeMessage.SmsCodeError, "SmsCodeError");
            }

            Utils.SetCache(baseApi.token, "sms", 0, 0, 30);

            string      code        = new Random().Next(999999).ToString().PadLeft(6, '0');
            SessionBag  sessionBag  = SessionContainer.GetSession(baseApi.token);
            SessionUser sessionUser = JsonConvert.DeserializeObject <SessionUser>(sessionBag.Name);

            if (sessionUser == null)
            {
                throw new ApiException(CodeMessage.InvalidToken, "InvalidToken");
            }
            sessionUser.checkCode  = code;
            sessionUser.checkPhone = checkCodeParam.phone;
            sessionBag.Name        = JsonConvert.SerializeObject(sessionUser);
            SessionContainer.Update(sessionBag.Key, sessionBag, new TimeSpan(1, 0, 0));
            StringBuilder builder = new StringBuilder();

            builder.AppendFormat(Global.SMS_CODE_URL, Global.SMS_CODE, Global.SMS_TPL, code, checkCodeParam.phone);
            string url = builder.ToString();
            string res = Utils.GetHttp(url);

            SmsCodeRes smsCodeRes = JsonConvert.DeserializeObject <SmsCodeRes>(res);

            if (smsCodeRes == null || smsCodeRes.error_code != 0)
            {
                throw new ApiException(CodeMessage.SmsCodeError, (smsCodeRes == null ? "SmsCodeError" : smsCodeRes.reason));
            }

            return("");
        }
Пример #17
0
        public void DecodeEncryptedDataTest()
        {
            Init();

            var sessionId     = "ABCDEFG";
            var sessionKey    = "/mGmINZAe+7k6kNz32wxSw==";
            var encryptedData =
                "CFcsIXmH2r0v9ehjEhS+uUpJkr8qGQyt+Za3YkhjVNNA+xGj2WB2QFxDXdKVSzc10LukeB2maCxZCqpPQrWQx6CKF/VkEx96hXpPuBMpWBnnLzupoJpkRW9gJGRz7dcXDnqzstf2etRumDeAFDyjEKZ6bqs+KTE7qHauMsctxg4TXPbzzvWQm783j9PoWsCm/0A+aGNWCfZSFuJgi5G+LjTVqcGqP+mlAnLIFmgGLTo3vWrekz0//2vCMhgcgwKjPMR+VZTB7UItvnWfF4h4oOajcMuEiwTifaFkyn7l4NtLroMYjOfId16B6XCTK0BvPhTw9GI3wPMDopwWF2q3Op8M2fYWJuVGFKbrAZvVY/ILeIxYLaHuwHAOYULLre5Mg1kQpURlQ6I6e6GjraJUoL1BqsM38DayY5xRRFJsehZgrWkOySWICuN20Bte7+2N8D6PvhsaNyQz+4Lp4XY/Nn+clNGoM1v6aKTCv7PY2wo=";
            var iv = "ASJ0whjRyLK1tvgb7bAVSw==";

            var unionId = "";//TODO:需要添加真实的UnionId

            SessionContainer.UpdateSession(sessionId, "OpenId", sessionKey, unionId);


            var result = target.DecodeEncryptedData("userInfo", sessionId, encryptedData, iv);

            Assert.IsNotNull(result);
        }
Пример #18
0
        public IActionResult WxCheckSession(string token)
        {
            var key = token.Split('-').First();

            if (SessionContainer.GetSession(key) != null)
            {
                return(Json(new
                {
                    success = true,
                    message = "ok"
                }));
            }

            return(Json(new
            {
                success = false,
                message = "会话已过期"
            }));
        }
Пример #19
0
        public ActionResult OnLogin(string code, string shareNumber, string userId, string userName, string shareTime, string kindergartenName)
        {
            StatusReport sr         = new StatusReport();
            var          jsonResult = SnsApi.JsCode2Json(Comman.Appid, Comman.AppSecret, code);

            if (jsonResult.errcode == Senparc.Weixin.ReturnCode.请求成功)
            {
                //Session["WxOpenUser"] = jsonResult;
                var sessionBag = SessionContainer.UpdateSession(null, jsonResult.openid, jsonResult.session_key);
                Session[sessionBag.Key] = jsonResult;
                Session.Timeout         = 60;
                sr = WXUserDal.SetNewUser(jsonResult.openid, kindergartenName);
                if (sr.status == "Success")
                {
                    User   user       = (User)sr.data;
                    string receiverId = user.id;
                    if (!string.IsNullOrEmpty(shareNumber) && !string.IsNullOrEmpty(userId) && !string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(shareTime))
                    {
                        if (userId != receiverId)
                        {
                            sr = WXShareDal.SetShareInfo(receiverId, shareNumber, userId, userName, shareTime, kindergartenName);
                            using (StreamWriter sw = new StreamWriter("D:\\1_importTemp\\TestFile1.txt"))
                            {
                                sw.WriteLine(sr.result.ToString());
                            }
                        }
                    }
                    sr.data = new { success = true, msg = "OK", sessionId = sessionBag.Key, user = user };
                }
                else
                {
                    sr.data = new { success = true, msg = "OK", sessionId = sessionBag.Key };
                }
                return(Json(sr));
            }
            else
            {
                sr.status = "Fail";
                sr.data   = new { success = false, mag = jsonResult.errmsg, result = jsonResult };
                return(Json(sr));
                //return Json(new { success = false, mag = jsonResult.errmsg, result = jsonResult });
            }
        }
Пример #20
0
        public ActionResult OnGetKanyuanData(string kindergartenName, string sessionId)
        {
            StatusReport sr = new StatusReport();

            //如果未指定幼儿园,返回错误信息
            if (string.IsNullOrEmpty(kindergartenName))
            {
                sr.status = "Fail";
                sr.result = "未指定幼儿园";
                return(Json(sr));
            }

            //如果姓名或联系方式为空,返回错误信息
            //if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(phoneNumber))
            //{
            //    sr.status = "Fail";
            //    sr.result = "姓名和联系电话不能为空";
            //    return Json(sr);
            //}

            if (string.IsNullOrEmpty(sessionId))
            {
                sr.status     = "Fail";
                sr.result     = "sessionId不存在";
                sr.parameters = sessionId;
                return(Json(sr));
            }
            SessionBag sessionBag = null;

            sessionBag = SessionContainer.GetSession(sessionId);
            if (sessionBag == null)
            {
                sr.status = "Fail";
                sr.result = "session已失效";
                return(Json(sr));
            }
            string openId = sessionBag.OpenId;

            //如果提交的数据满足条件,调用KanyuanDataDal.GetKanyuanData方法,在数据库中获取满足条件的数据
            sr = KanyuanDataDal.GetKanyuanData(kindergartenName, openId);

            return(Json(sr));
        }
Пример #21
0
        public void TestSetSessionTokenDoesNothingOnEmptySessionTokenHeader()
        {
            SessionContainer sessionContainer = new SessionContainer("127.0.0.1");

            var    collectionResourceId = ResourceId.NewDocumentCollectionId(42, 129).DocumentCollectionId.ToString();
            string collectionFullname   = "dbs/db1/colls/collName";

            sessionContainer.SetSessionToken(
                collectionResourceId,
                collectionFullname + "/docs/42",
                new DictionaryNameValueCollection()
            {
                { HttpConstants.HttpHeaders.SessionToken, "range_0:1#100#4=90#5=1" }
            }
                );

            using (DocumentServiceRequest request = DocumentServiceRequest.Create(OperationType.Read, collectionResourceId, ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null))
            {
                string token = sessionContainer.ResolveGlobalSessionToken(request);

                HashSet <string> map = new HashSet <string>(token.Split(','));

                Assert.AreEqual(1, map.Count);
                Assert.IsTrue(map.Contains("range_0:1#100#4=90#5=1"));
            }

            sessionContainer.SetSessionToken(
                collectionResourceId,
                collectionFullname + "/docs/42",
                new DictionaryNameValueCollection()
                );

            using (DocumentServiceRequest request = DocumentServiceRequest.Create(OperationType.Read, collectionResourceId, ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null))
            {
                string token = sessionContainer.ResolveGlobalSessionToken(request);

                HashSet <string> map = new HashSet <string>(token.Split(','));

                Assert.AreEqual(1, map.Count);
                Assert.IsTrue(map.Contains("range_0:1#100#4=90#5=1"));
            }
        }
Пример #22
0
        /// <summary>
        /// 验证令牌
        /// </summary>
        /// <param name="baseApi">传入参数</param>
        /// <param name="route">API路径</param>
        /// <returns>验证结果,null为通过</returns>
        private Message CheckToken(BaseApi baseApi, bool needLogin, string route)
        {
            Message msg = null;

            if (baseApi.token != null)
            {
                SessionBag sessionBag = SessionContainer.GetSession(baseApi.token);
                if (sessionBag == null)
                {
                    msg = new Message(CodeMessage.InvalidToken, "InvalidToken");
                }
                else
                {
                    if (sessionBag.Name == null)
                    {
                        msg = new Message(CodeMessage.InvalidToken, "InvalidToken");
                    }
                    else
                    {
                        SessionUser sessionUser = JsonConvert.DeserializeObject <SessionUser>(sessionBag.Name);
                        if (sessionUser == null)
                        {
                            msg = new Message(CodeMessage.InvalidToken, "InvalidToken");
                        }


                        if (needLogin)
                        {
                            if (sessionUser.openid != sessionBag.OpenId)
                            {
                                msg = new Message(CodeMessage.NeedLogin, "NeedLogin");
                            }
                        }
                    }
                }
            }
            else
            {
                msg = new Message(CodeMessage.InvalidToken, "InvalidToken");
            }
            return(msg);
        }
        public void DecodeUserInfoBySessionIdTest2()
        {
            //测试 issue:https://github.com/JeffreySu/WeiXinMPSDK/issues/1825
            var sessionId     = "ABCDEFGHIJK";
            var sessionKey    = "0sVkQ4CtcaiYJtvoPLBecw==";
            var encryptedData =
                "GiW4s+17o7RSaPOwGX8Ir1+3c/RYbHKvRzBg8UFlmIIiArLtU0ctkzjq1LRR5MH5CSPs63Jt4qCoFScSlRKlQ4/RVXXJFQV+r/1L+qKv/PdHRvVDLb+8P6CvPTurEuHsxlLyXTnnlEIu6IFYFzZWBMIp6+SHEK85mEb1gw4BtMmEy9EitnMskNjsEnmpI3M9r8ItKyQ8hinJejuno0JPXn3trc+2gMheNt4+4NwMTM6mzzGVO6g40NP7NjK9Tl6+An2TjBe+GGVFdrkl5hpYDXE/YO2FsL909faX3Y08msSuCVk5AsMGMJiUwddiu44KODdxCYfwLxBaIgYJEY6xLygFmAMuDg/L2g4/wDabBrhA5BNsD6lrcRRbvrHK65Lu3xd1oTXyMGbfUGTD4GLlLSJUX2FhcG7ZmHwg1jQUuKFHJu/AMQgdoPa/JONAu5Hjp0hL7ahr5LC0ghwdTfTowg3X1Ko9IgRxxj755eGgXQK7AnsMwjXzt4X+4YpOYpCb2LVSrTV2t4QjVNPe+Rjmsg==";
            var iv      = "4y2ftkwAM2mF6Qc89HydpA==";
            var unionId = "";

            SessionContainer.UpdateSession(sessionId, "OpenId", sessionKey, unionId);

            var userInfo = Senparc.Weixin.WxOpen.Helpers.EncryptHelper.DecodeUserInfoBySessionId(sessionId,
                                                                                                 encryptedData, iv);

            Assert.IsNotNull(userInfo);
            Assert.AreEqual("wxfcb0a0031394a51c", userInfo.watermark.appid);

            Console.WriteLine(SerializerHelper.GetJsonString(userInfo));
        }
        public ActionResult Logout()
        {
            ConfigId.ClearStoreItem();
            //var cookieConfig = Request.Cookies["id_config"];
            //if (cookieConfig != null) cookieConfig.Expires = DateTime.Now;

            var cookieJob = Request.Cookies["id_job"];

            if (cookieJob != null)
            {
                cookieJob.Expires = DateTime.Now;
            }

            authenticationService.LogOff();
            SessionContainer.Remove();
            //var cookieFranchise = Request.Cookies["franchise_id"];
            //if (cookieFranchise != null) cookieFranchise.Expires = DateTime.Now.AddDays(7);

            return(Json(new { result = "success" }));
        }
Пример #25
0
        public void CheckSignatureTest()
        {
            //储存Session
            var sessionId  = "7f3f7489cb904d20bd4b5e9443f1bcab";
            var rawData    = "{\"nickName\":\"苏震巍\",\"gender\":1,\"language\":\"zh_CN\",\"city\":\"Suzhou\",\"province\":\"Jiangsu\",\"country\":\"CN\",\"avatarUrl\":\"http://wx.qlogo.cn/mmopen/vi_32/PiajxSqBRaEKXyjX4N6I5Vx1aeiaBeJ2iaTLy15n0HgvjNbWEpKA3ZbdgXkOhWK7OH8iar3iaLxsZia5Ha4DnRPlMerw/0\"}";
            var sessionKey = "lEIWEBVlmAj/Ng0t54iahA==";
            var unionId    = "";

            SessionContainer.UpdateSession(sessionId, "openId", sessionKey, unionId);

            var sessionBag = SessionContainer.GetSession(sessionId);

            Assert.IsNotNull(sessionBag);
            Assert.AreEqual(sessionKey, sessionBag.SessionKey);

            var compareSignature = "1149a88c75125de3146040c90d7bcc4b2a564a34";
            var result           = EncryptHelper.CheckSignature(sessionId, rawData, compareSignature);

            Assert.IsTrue(result);
        }
Пример #26
0
        private static GatewayStoreModel MockGatewayStoreModel(Func <HttpRequestMessage, Task <HttpResponseMessage> > sendFunc)
        {
            Mock <IDocumentClientInternal> mockDocumentClient = new Mock <IDocumentClientInternal>();

            mockDocumentClient.Setup(client => client.ServiceEndpoint).Returns(new Uri("https://foo"));

            GlobalEndpointManager endpointManager  = new GlobalEndpointManager(mockDocumentClient.Object, new ConnectionPolicy());
            ISessionContainer     sessionContainer = new SessionContainer(string.Empty);
            HttpMessageHandler    messageHandler   = new MockMessageHandler(sendFunc);

            return(new GatewayStoreModel(
                       endpointManager,
                       sessionContainer,
                       TimeSpan.FromSeconds(5),
                       ConsistencyLevel.Eventual,
                       new DocumentClientEventSource(),
                       new UserAgentContainer(),
                       ApiType.None,
                       messageHandler));
        }
Пример #27
0
        protected override async Task <AuthenticateResult> HandleAuthenticateAsync()
        {
            string tokens = Request.Headers["Authorization"];

            if (tokens.HasValue() && tokens.Split(' ').First() == "Wechat")
            {
                var items = tokens.Split(' ').Last().Split('-');

                // weopen直接验证通过,weapp检查会话是否超时
                if (items[1] == CryptoHelper.ComputeMD5("WEOPEN", items[0]) ||
                    SessionContainer.GetSession(items[1]) != null)
                {
                    // check right for later.
                    var ticket = Membership.AuthenticationTicket(items[0], "", "", true, Scheme.Name);
                    return(await Task.FromResult(AuthenticateResult.Success(ticket)));
                }
            }

            return(await Task.FromResult(AuthenticateResult.NoResult()));
        }
Пример #28
0
        public void TestResolveGlobalSessionTokenReturnsEmptyStringOnCacheMiss()
        {
            SessionContainer sessionContainer = new SessionContainer("127.0.0.1");

            var    collectionResourceId = ResourceId.NewDocumentCollectionId(42, 129).DocumentCollectionId.ToString();
            string collectionFullname   = "dbs/db1/colls1/collName";

            sessionContainer.SetSessionToken(
                collectionResourceId,
                collectionFullname,
                new DictionaryNameValueCollection()
            {
                { HttpConstants.HttpHeaders.SessionToken, "range_0:1#100#4=90#5=0" }
            }
                );

            using (DocumentServiceRequest request = DocumentServiceRequest.CreateFromName(OperationType.Read, "dbs/db1/colls/collName2/docs/42", ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null))
            {
                Assert.AreEqual(string.Empty, sessionContainer.ResolveGlobalSessionToken(request));
            }
        }
Пример #29
0
        public async Task <IActionResult> TemplateTest(string sessionId, string formId)
        {
            //注意:2020年01月10日起,新发布的小程序将不能使用模板消息,请迁移至“订阅消息”功能。

            var templateMessageService = new TemplateMessageService();

            try
            {
                //var sessionBag = await templateMessageService.RunTemplateTestAsync(WxOpenAppId, sessionId, formId);

                return(Json(new { success = true, msg = "2020年01月10日起,新发布的小程序将不能使用模板消息,请迁移至“订阅消息”功能。" }));
            }
            catch (Exception ex)
            {
                var sessionBag = await SessionContainer.GetSessionAsync(sessionId);

                var openId = sessionBag != null ? sessionBag.OpenId : "用户未正确登陆";

                return(Json(new { success = false, openId = openId, formId = formId, msg = ex.Message }));
            }
        }
        private string GetWechatSessionId(string weiXinCode)
        {
            if (environment.EnvironmentName == "dev" || environment.EnvironmentName == "qa")
            {
                var tag = SessionContainer.UpdateSession(null, "071TIDkB14xCof0eHekB1I4NkB1TIDk5", "071TIDkB14xCof0eHekB1I4NkB1TIDk5");
                return(tag.Key);
            }

            var jsonResult = SnsApi.JsCode2Json(wxConfiguration.AppId, wxConfiguration.AppSecret, weiXinCode);

            if (jsonResult.errcode == ReturnCode.请求成功)
            {
                SessionContainer.UpdateSession(null, jsonResult.openid, jsonResult.session_key);
                return(jsonResult.openid);
            }
            else
            {
                logger.LogError(JsonConvert.SerializeObject(jsonResult));
            }
            return(string.Empty);
        }
Пример #31
0
        /// <summary>
        /// 订阅消息
        /// </summary>
        /// <param name="sessionId"></param>
        /// <param name="templateId"></param>
        /// <returns></returns>
        public async Task <IActionResult> SubscribeMessage(string sessionId, string templateId = "xWclWkOqDrxEgWF4DExmb9yUe10pfmSSt2KM6pY7ZlU")
        {
            var sessionBag = SessionContainer.GetSession(sessionId);

            if (sessionBag == null)
            {
                return(Json(new { success = false, msg = "请先登录!" }));
            }

            await Task.Delay(1000);//停1秒钟,实际开发过程中可以将权限存入数据库,任意时间发送。

            var templateMessageData = new TemplateMessageData();

            templateMessageData["thing1"] = new TemplateMessageDataValue("微信公众号+小程序快速开发");
            templateMessageData["time5"]  = new TemplateMessageDataValue(SystemTime.Now.ToString("yyyy年MM月dd日 HH:mm"));
            templateMessageData["thing6"] = new TemplateMessageDataValue("盛派网络研究院");
            templateMessageData["thing7"] = new TemplateMessageDataValue("第二部分课程正在准备中,尽情期待");

            var page = "pages/index/index";

            //templateId也可以由后端指定

            try
            {
                var result = await Weixin.WxOpen.AdvancedAPIs.MessageApi.SendSubscribeAsync(WxOpenAppId, sessionBag.OpenId, templateId, templateMessageData, page);

                if (result.errcode == ReturnCode.请求成功)
                {
                    return(Json(new { success = true, msg = "消息已发送,请注意查收" }));
                }
                else
                {
                    return(Json(new { success = false, msg = result.errmsg }));
                }
            }
            catch (Exception ex)
            {
                return(Json(new { success = false, msg = ex.Message }));
            }
        }
Пример #32
0
        private IEnumerable<Combinator> Exchange(Combinator combinator)
        {
            _session.Salt = _settings.NonceNewNonceXor;
            var oc = new SessionContainer(_session.SessionId, combinator);

            EncryptedMessage encMessage = _session.PrepareRpcCall(oc);
            var call = new TcpTransport(_connection.PacketNumber++, encMessage.Serialize());

            _connection.Write(call.Serialize());
            Trace.TraceInformation("#Send: {0}", combinator);

            var buffer = _connection.Read();
            if (buffer.Length == 0)
                throw new DecodeException("Response is empty");

            var result = new List<Combinator>();// ReSharper disable once LoopCanBeConvertedToQuery
            foreach (SessionContainer container in ProcessInputBuffer(buffer))
            {
                Combinator c = Unwrap(container.Combinator, container.SessionId, _session.SessionId, combinator.Descriptor.type);
                if (c != null)
                    result.Add(c);
            }
            return result;
        }
Пример #33
0
        private IEnumerable<SessionContainer> ExtractCombinators(TcpTransport item)
        {
            var results = new List<SessionContainer>();

            // снимем шифрование               
            var em = new EncryptedMessage(_settings.AuthKey, item.Payload);

            // если контейнер - вскроем его
            int crc32 = em.GetConstructorCrc();

            // Если контейнер
            // Простой контейнер содержит несколько сообщений следующим образом:
            // msg_container#73f1f8dc messages:vector message = MessageContainer;
            // Здесь message обозначает любое сообщение вместе с длиной и с msg_id:
            // message msg_id:long seqno:int bytes:int body:Object = Message;
            if (crc32 == 0x73f1f8dc)
            {
                // Распарсим все входные ответы
                using (var data = new MemoryStream(em.Data.MessageData))
                using (var br = new BinaryReader(data))
                {
                    br.ReadInt32(); // конструктор
                    int count = br.ReadInt32(); // количество сообщений внутри

                    for (int i = 0; i < count; i++)
                    {
                        br.ReadInt64();
                        br.ReadInt32();
                        int msgLength = br.ReadInt32();
                        byte[] msg = br.ReadBytes(msgLength);

                        // Внутри конструктора ожидаются следующие системные типы
                        //rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult;
                        //rpc_error#2144ca19 error_code:int error_message:string = RpcError;
                        //gzip_packed#3072cfa1 packed_data:string = Object;
                        // msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

                        // Сформируем инстанс комбинатора и внесем его в очередь
                        var temp = new SessionContainer(em.Data.SessionId, msg);
                        results.Add(temp);
                    }
                }
            }
            else // простое сообщение
            {
                results.Add(new SessionContainer(em.Data.SessionId, em.Data.MessageData));
            }
            return results;
        }