///// <summary> ///// Event事件类型请求之subscribe ///// </summary> ///// <param name="requestMessage"></param> ///// <returns></returns> //public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage) //{ // var responseMessage = this.CreateResponseMessage<ResponseMessageText>(); // responseMessage.Content = "欢迎关注-DSX用于测试的消息"; // return responseMessage; //} /// <summary> /// Event事件类型请求之subscribe /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage) { if (_wechatConfig == null) { string orgId = ConfigHelper.GetValue("OrgId"); _wechatConfig = wechatConfigBll.GetEntityByOrgId(orgId); } if (_wechatConfig != null) { var responseMessage = this.CreateResponseMessage <ResponseMessageNews>(); string regUrl = string.Format("{0}/base_info", _wechatConfig.WxDomainUrl); var container = new MessageContainer <Article> { new Article() { Title = "感谢您的关注", Description = "绑定帐号后即可享受健康信息推送服务", Url = regUrl, PicUrl = string.Format("{0}/static/img/register.png", _wechatConfig.WxDomainUrl) } }; responseMessage.Articles = container; return(responseMessage); } else { var responseMessage = this.CreateResponseMessage <ResponseMessageText>(); responseMessage.Content = "感谢您的关注!"; return(responseMessage); } }
/// <summary> /// 获取授权URL,SCOPE为snsapi_userinfo /// </summary> public ActionResult GetAuthorizeUrlWithUserInfo(string orgId, string returnUrl) { if (string.IsNullOrEmpty(orgId)) { return(Content("机构ID为空,无法拉取授权!")); } WechatConfigEntity wechatConfig = wechatconfigbll.GetEntityByOrgId(orgId); if (wechatConfig != null) { if (!string.IsNullOrEmpty(wechatConfig.AppId) && !string.IsNullOrEmpty(wechatConfig.AppSecret) && !string.IsNullOrEmpty(wechatConfig.AuthDomainUrl)) { var state = DateTime.Now.Millisecond.ToString() + "_" + orgId; //随机数,用于识别请求可靠性 Session["State"] = state; //储存随机数到Session string callback = wechatConfig.AuthDomainUrl + "/WxOpenOAuth/UserInfoCallback?returnUrl=" + returnUrl.UrlEncode(); string authUrl = Senparc.Weixin.MP.AdvancedAPIs.OAuthApi.GetAuthorizeUrl(wechatConfig.AppId, callback, state, OAuthScope.snsapi_userinfo); ViewData["UrlUserInfo"] = authUrl; return(Redirect(authUrl)); } else { return(Content("授权信息未配置,无法拉取授权!")); } } else { return(Content("机构不存在,无法拉取授权!")); } }
/// <summary> /// 获取用户注册状态 /// </summary> /// <param name="userId"></param> /// <param name="orgId"></param> /// <param name="returnUrl"></param> /// <returns></returns> public ActionResult GetUserRegisterStatus(string userId, string orgId, string returnUrl) { if (string.IsNullOrEmpty(userId)) { return(Content("用户ID不能为空,无法进行授权")); } //获取微信配置信息 WechatConfigEntity wechatConfig = wechatConfigBll.GetEntityByOrgId(orgId); if (wechatConfig == null) { return(Content("系统尚未配置微信授权信息,无法进行授权")); } //TODO 自己的实际业务 return(Redirect(returnUrl)); }
public ActionResult Post(PostModel postModel) { //WeixinTrace.Log("请求到达(Post),数据包:" + postModel.TryToJson()); logHelper.Info("请求到达(Post),数据包:" + postModel.TryToJson()); if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return(Content("参数错误!")); } if (_wechatConfig == null) { string orgId = ConfigHelper.GetValue("OrgId"); _wechatConfig = wechatConfigBll.GetEntityByOrgId(orgId); logHelper.Info("微信配置信息:" + _wechatConfig.TryToJson()); } if (_wechatConfig != null) { #region 打包 PostModel 信息 postModel.Token = Token; //根据自己后台的设置保持一致 postModel.EncodingAESKey = EncodingAESKey; //根据自己后台的设置保持一致 postModel.AppId = _wechatConfig.AppId; //根据自己后台的设置保持一致 #endregion //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制 var maxRecordCount = 10; //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount); #region 设置消息去重 /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/ messageHandler.OmitRepeatedMessage = true; //默认已经开启,此处仅作为演示,也可以设置为false在本次请求中停用此功能 #endregion try { //messageHandler.SaveRequestMessageLog(); //记录 Request 日志(可选) #region 记录 Request 日志 var logPath = Server.MapPath(string.Format("~/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd"))); if (!Directory.Exists(logPath)) { Directory.CreateDirectory(logPath); } //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。 messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}_{2}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName, messageHandler.RequestMessage.MsgType))); if (messageHandler.UsingEcryptMessage) { messageHandler.EcryptRequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}_{2}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName, messageHandler.RequestMessage.MsgType))); } #endregion messageHandler.Execute(); //执行微信处理过程(关键) //messageHandler.SaveResponseMessageLog(); //记录 Response 日志(可选) #region 记录 Response 日志 //测试时可开启,帮助跟踪数据 //if (messageHandler.ResponseDocument == null) //{ // throw new Exception(messageHandler.RequestDocument.ToString()); //} if (messageHandler.ResponseDocument != null) { messageHandler.ResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_{1}_{2}.txt", _getRandomFileName(), messageHandler.ResponseMessage.ToUserName, messageHandler.ResponseMessage.MsgType))); } if (messageHandler.UsingEcryptMessage && messageHandler.FinalResponseDocument != null) { //记录加密后的响应信息 messageHandler.FinalResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}_{2}.txt", _getRandomFileName(), messageHandler.ResponseMessage.ToUserName, messageHandler.ResponseMessage.MsgType))); } #endregion //return Content(messageHandler.ResponseDocument.ToString());//v0.7- //return new WeixinResult(messageHandler);//v0.8+ return(new FixWeixinBugWeixinResult(messageHandler)); //为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可 } catch (Exception ex) { WeixinTrace.Log(string.Format("MessageHandler错误:{0}", ex.Message)); return(Content("")); } } else { return(Content("未找到当前机构微信配置信息!")); } }
public ActionResult SaveForm(string keyValue, WechatConfigEntity entity) { wechatconfigbll.SaveForm(keyValue, entity); return(Success("操作成功。")); }
/// <summary> /// OAuthScope.snsapi_base方式回调 /// </summary> /// <param name="code"></param> /// <param name="state"></param> /// <param name="returnUrl"></param> /// <returns></returns> public ActionResult UserInfoCallback(string code, string state, string returnUrl) { if (string.IsNullOrEmpty(code)) { return(Content("您拒绝了授权,暂时无法使用该系统!")); } if (string.IsNullOrEmpty(state) || state != Session["State"] as string) { //这里的state其实是会暴露给客户端的,验证能力很弱,这里只是演示一下, //建议用完之后就清空,将其一次性使用 //实际上可以存任何想传递的数据,比如用户ID,并且需要结合例如下面的Session["OAuthAccessToken"]进行验证 return(Content("验证失败!请从正规途径进入!")); } OAuthAccessTokenResult result = null; string orgId = state.Split('_')[1]; WechatConfigEntity wechatConfig = wechatconfigbll.GetEntityByOrgId(orgId); //通过,用code换取access_token try { result = OAuthApi.GetAccessToken(wechatConfig.AppId, wechatConfig.AppSecret, code); } catch (Exception ex) { return(Content(ex.Message)); } if (result.errcode != ReturnCode.请求成功) { return(Content("错误:" + result.errmsg)); } //下面2个数据也可以自己封装成一个类,储存在数据库中(建议结合缓存) //如果可以确保安全,可以将access_token存入用户的cookie中,每一个人的access_token是不一样的 Session["OAuthAccessTokenStartTime"] = DateTime.Now; Session["OAuthAccessToken"] = result; //因为第一步选择的是OAuthScope.snsapi_userinfo,这里可以进一步获取用户详细信息 try { OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); Uri uri = new Uri(returnUrl); try { //TODO 保存用户基本信息 } catch (Exception ex) { return(Content("保存用户基础信息失败!错误:" + ex.Message)); } if (!string.IsNullOrEmpty(returnUrl)) { //return Redirect(returnUrl); string callbackUrl = string.Format("{0}{1}{2}", returnUrl, string.IsNullOrEmpty(uri.Query) ? "?" : "&", "userId=" + userInfo.openid); //ViewData["CallbackUrl"] = callbackUrl; AccessTokenContainer.Register(wechatConfig.AppId, wechatConfig.AppSecret); return(Redirect(callbackUrl)); } return(Content("未能正确打开页面,请联系管理员!")); } catch (ErrorJsonResultException ex) { return(Content(ex.Message)); } }