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); }
/// <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 })); } }
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); } }
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(""); }
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 ? "通过" : "不通过") })); }
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); } }
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)); }
/// <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)))); }
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 })); } }
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) { //返回登录超时的消息 } }
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 })); } }
/// <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); }
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(""); }
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); }
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 = "会话已过期" })); }
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 }); } }
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)); }
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")); } }
/// <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" })); }
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); }
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)); }
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())); }
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)); } }
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); }
/// <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 })); } }
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; }
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; }