Пример #1
0
        /// <summary>
        /// 获取微信用户信息
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="openId"></param>
        /// <returns></returns>
        public UserInfo GetUserInfo(int appId, string openId)
        {
            //判断appId是否合法
            var appInfo = _appInfoRepository.GetAppInfo(appId);

            if (appInfo == null)
            {
                throw new Exception(string.Format("获取用户信息失败:通过参数{0}获取到的公众号信息为空", appId));
            }

            var userInfoFromDb = _userRepository.GetUserInfo(appId, openId);
            //如果从数据库获取用户为空,则需要重新从微信更新
            string tokenErrorMessage;
            var    accessToken = new AccessTokenService().GetAccessToken(appId, out tokenErrorMessage);

            if (accessToken == null || !string.IsNullOrEmpty(tokenErrorMessage))
            {
                throw new Exception(string.Format("获取用户信息失败:", tokenErrorMessage));
            }
            if (userInfoFromDb != null)
            {
                return(userInfoFromDb);
            }

            var newUserInfoFromWeiXin = UserApi.Info(accessToken.Ticket, openId);

            if (newUserInfoFromWeiXin == null)
            {
                throw new Exception("获取用户信息失败:从微信获取到的用户为空");
            }
            var newUserInfo = new UserInfo
            {
                AppId      = appId,
                Openid     = newUserInfoFromWeiXin.openid,
                City       = newUserInfoFromWeiXin.city,
                Country    = newUserInfoFromWeiXin.country,
                Groupid    = newUserInfoFromWeiXin.groupid,
                Headimgurl = newUserInfoFromWeiXin.headimgurl,
                Language   = newUserInfoFromWeiXin.language,
                Nickname   = newUserInfoFromWeiXin.nickname,
                Province   = newUserInfoFromWeiXin.province,
                Remark     = newUserInfoFromWeiXin.remark,
                Sex        = newUserInfoFromWeiXin.sex,
                //Subscribe = newUserInfoFromWeiXin.subscribe,
                SubscribeTime = newUserInfoFromWeiXin.subscribe_time
            };

            //缓存到数据库
            _userRepository.Add(newUserInfo);

            return(newUserInfo);
        }
Пример #2
0
        public JsApiTicket GetJsApiTicket(int wid, out string errorMessage)
        {
            lock (Obj)
            {
                try
                {
                    var appInfo = _appInfoRepository.GetAppInfo(wid);
                    if (appInfo == null)
                    {
                        errorMessage = string.Format("当前系统无wid为{0}相应公众号的配置", wid);
                        return(null);
                    }
                    if (string.IsNullOrEmpty(appInfo.AppId) || string.IsNullOrEmpty(appInfo.AppSecret))
                    {
                        errorMessage = string.Format("当前系统wid为{0}相应公众号的配置不完整,AppId或者AppSecret未填写完全,请在[我的公众帐号]里补全信息!", wid);
                        return(null);
                    }

                    var jsApiTicketFromDb = _jsApiTicketRepository.GetJsApiTicket(appInfo);

                    //判断是否存在或者是否过期
                    if (jsApiTicketFromDb == null || jsApiTicketFromDb.IsExpired())
                    {
                        //更改已过期的数据
                        _jsApiTicketRepository.SetJsApiTicketExpire(jsApiTicketFromDb);

                        //重新从微信申请ticket
                        string tokenErrorMessage;
                        var    token = new AccessTokenService().GetAccessToken(wid, out tokenErrorMessage);
                        if (token == null || !string.IsNullOrEmpty(tokenErrorMessage))
                        {
                            throw new Exception(string.Format("获取JsApiTicket失败:{0}", tokenErrorMessage));
                        }

                        var result         = OneGulp.WeChat.MP.CommonAPIs.CommonApi.GetTicket(token.Ticket);
                        var newJsApiTicket = new JsApiTicket()
                        {
                            Id          = Guid.NewGuid(),
                            AppId       = wid,
                            Ticket      = result.ticket,
                            Expires     = result.expires_in,
                            SysDateTime = DateTime.Now
                        };

                        _jsApiTicketRepository.Add(newJsApiTicket);

                        errorMessage = string.Empty;
                        return(newJsApiTicket);
                    }

                    errorMessage = string.Empty;
                    return(jsApiTicketFromDb);
                }
                catch (Exception exception)
                {
                    errorMessage = exception.Message;
                    return(null);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// 获取当前账号的AccessToken
        /// </summary>
        /// <param name="wid"></param>
        /// <param name="errorMessage"></param>
        /// <returns></returns>
        public AccessToken GetAccessToken(int wid, out string errorMessage)
        {
            lock (_obj)
            {
                try
                {
                    var appInfo = _appInfoRepository.GetAppInfo(wid);
                    if (appInfo == null)
                    {
                        errorMessage = string.Format("当前系统无wid为{0}相应公众号的配置", wid);
                        return(null);
                    }
                    if (string.IsNullOrEmpty(appInfo.AppId) || string.IsNullOrEmpty(appInfo.AppSecret))
                    {
                        errorMessage = string.Format("当前系统wid为{0}相应公众号的配置不完整,AppId或者AppSecret未填写完全,请在[我的公众帐号]里补全信息!",
                                                     wid);
                        return(null);
                    }

                    //从数据库中获取Token
                    var tokenFromDb = _accessTokenRepository.GetAccessToken(appInfo.Id);
                    //如果不存在
                    if (tokenFromDb == null || tokenFromDb.IsExpired())
                    {
                        //设置已存的AccessToken过期
                        _accessTokenRepository.SetAccessTokenExpire(tokenFromDb);

                        //从微信重新获取AccessToken
                        var accessTokenResult = CommonApi.GetToken(appInfo.AppId, appInfo.AppSecret);
                        var newAccessToken    = new AccessToken
                        {
                            Id          = Guid.NewGuid(),
                            AppId       = appInfo.Id,
                            SysDateTime = DateTime.Now,
                            Ticket      = accessTokenResult.access_token,
                            Expires     = accessTokenResult.expires_in
                        };

                        //缓存新获取到的AccessToken到数据库
                        _accessTokenRepository.Add(newAccessToken);

                        errorMessage = string.Empty;
                        return(newAccessToken);
                    }

                    errorMessage = string.Empty;

                    return(tokenFromDb);
                }
                catch (Exception exception)
                {
                    errorMessage = exception.Message;
                    return(null);
                }
            }
        }
Пример #4
0
 public AppInfo GetAppInfo(int wid)
 {
     return(wid == 0 ? null : _appInfoRepository.GetAppInfo(wid));
 }