コード例 #1
0
ファイル: CustomMessageHandler.cs プロジェクト: wyh0395/Berry
        ///// <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);
            }
        }
コード例 #2
0
        /// <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("机构不存在,无法拉取授权!"));
            }
        }
コード例 #3
0
        /// <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));
        }
コード例 #4
0
        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("未找到当前机构微信配置信息!"));
            }
        }
コード例 #5
0
 public ActionResult SaveForm(string keyValue, WechatConfigEntity entity)
 {
     wechatconfigbll.SaveForm(keyValue, entity);
     return(Success("操作成功。"));
 }
コード例 #6
0
        /// <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));
            }
        }