/// <summary> /// 通过code获取用户拉取微信授权登录信息 以上两步可以合为一步 方便调用 但是返回errcode和系统自定义的不同步 /// </summary> /// <param name="code"></param> /// <returns></returns> public async Task <AuthUserInfoModel> GetUserInfoAsync(string providerName, string code) { var authLoginProviderModel = this.Providers.FirstOrDefault(p => p.ProviderName == providerName); if (authLoginProviderModel == null) { throw new Exception("未知的授权登录方式:" + providerName); } AuthAccessTokenModel tokenModel = await this.GetAccessTokenAsync(authLoginProviderModel, code); if (tokenModel.errcode == 0) { var authUserInfo = await this.GetUserInfoByAccessTokenAsync(tokenModel.access_token, tokenModel.openid); return(authUserInfo); } else if (tokenModel.errcode == 40163 || tokenModel.errcode == 40029) { tokenModel.errmsg = "code已被使用或者无效"; throw new Exception(new { tokenModel.errcode, tokenModel.errmsg }.ToJson()); } else { throw new Exception(new { tokenModel.errcode, tokenModel.errmsg }.ToJson()); } }
/// <summary> /// 获取授权登录的AccessToken 开发步骤 1.验证服务器是有有效 2.获取code 这两部直接在控制器或者api里调用 3.直接调用GetUserInfo /// </summary> /// <param name="providerInfo"></param> /// <param name="code"></param> /// <param name="grant_type"></param> /// <returns></returns> public async Task <AuthAccessTokenModel> GetAccessTokenAsync(AuthLoginProviderModel providerInfo, string code, string grant_type = "authorization_code") { string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type={3}".FormatWith(providerInfo.AppId, providerInfo.AppSecret, code, grant_type); string resJson = await WebHelper.HttpGetAsync(url); AuthAccessTokenModel tokenModel = resJson.ToObject <AuthAccessTokenModel>(); return(tokenModel); }