微信网页授权操作逻辑封装-C#实例

一、微信网页授权登录

前提:

1.已经获取的接口权限,如果是测试账号就已经有权限了

2.配置接口的授权域名

更多说明可以参考:http://blog.csdn.net/u011127019/article/details/44698233

或者官网API:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

步骤:

1.用户同意授权,获取code

2.根据code 获取access_token及当前操作用户的openid、unionid

3.根据openid获取用户基本信息(如果需要的话)

注:如果想在网站使用扫一扫,授权登录,可以讲 _oauth.GetCodeUrl() 授权地址生成二维码来使用

C#封装微信网页授权登录使用实例:

string appid = "wx145b4a8fd07b24e8";
string appsecrect = "fe6951dcb99772411c42f724b1336065";
string redirect_url = "配置域名下的回调地址";
OAuthManage _oauth = null;
/// <summary>
///控制器构造函数
/// </summary>
public UserController()
{
    _oauth = new OAuthManage(appid, appsecrect, redirect_url);
}
/// <summary>
/// 授权登录
/// </summary>
/// <returns></returns>
public ActionResult AuthLogin()
{
    ViewBag.url = _oauth.GetCodeUrl();
    return View();
}
/// <summary>
/// 回调处理
/// </summary>
/// <returns></returns>
public ActionResult OAuthHandle()
{
    string result = "";
    //注册事件处理
    _oauth.OnError = (e) =>
    {
        string msg = "";
        Exception inner = e;
        while (inner != null)
        {
            msg += inner.Message;
            inner = inner.InnerException;
        }
        result = msg;
        LogOperate.Write(msg);
    };
    _oauth.OnGetTokenSuccess = (token) =>
    {
        result += "<br/>";
        result += token.ToJsonString();
    };
    _oauth.OnGetUserInfoSuccess = (user) =>
    {
        result += "<br/>";
        result += user.ToJsonString();
    };
    //第二步
    _oauth.GetAccess_Token();
    //第三步
    _oauth.GetUserInfo();
    //显示结果
    ViewBag.msg = result;
    return View();
}

封装代码类定义:

namespace WXPackage
{
    /// <summary>
    /// 网页授权逻辑处理,
    /// 处理三步操作,处理成功,返回用户基本信息
    /// </summary>
    public class OAuthManage
    {
        #region 基本信息定义
        /// <summary>
        /// 公众号的唯一标识
        /// </summary>
        private string appid;
        /// <summary>
        /// 公众号的appsecret
        /// </summary>
        private string secret;
        /// <summary>
        /// 回调url地址
        /// </summary>
        private string redirect_uri;
        /// <summary>
        /// 获取微信用户基本信息使用snsapi_userinfo模式
        /// 如果使用静默授权,无法获取用户基本信息但可以获取到openid
        /// </summary>
        private string scope;
        public OAuthManage(string appid, string appsecret, string redirect_uri, bool IsUserInfo = true)
        {
            this.appid = appid;
            this.secret = appsecret;
            this.redirect_uri = redirect_uri;
            this.scope = IsUserInfo ? "snsapi_userinfo" : "snsapi_base";
        }
        #endregion

        #region 请求过程信息
        /// <summary>
        /// 第一步获取到的Code 值
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 第二步获取到的access_token及相关数据
        /// </summary>
        public OAuthAccess_Token TokenData = null;
        #endregion

        #region 事件定义
        /// <summary>
        /// 当处理出现异常时,触发
        /// </summary>
        public Action<Exception> OnError = null;
        /// <summary>
        /// 当获取AccessToken成功是触发
        /// </summary>
        public Action<OAuthAccess_Token> OnGetTokenSuccess = null;
        /// <summary>
        /// 当获取用户信息成功时触发
        /// </summary>
        public Action<OAuthUser> OnGetUserInfoSuccess = null;
        #endregion

        #region 第二步,回调处理
        /// <summary>
        /// 第二步,通过code换取网页授权access_token
        /// </summary>
        public void GetAccess_Token()
        {
            try
            {
                //1.处理跳转
                this.Code = ReqHelper.GetString("code");
                if (string.IsNullOrEmpty(this.Code))
                    throw new Exception("获取code参数失败或用户禁止授权获取基本信息");
                //1.发送获取access_token请求
                string url = GetAccess_TokenUrl();
                string result = NetHelper.Get(url);

                //2.解析相应结果
                TokenData = JsonConvert.DeserializeObject<OAuthAccess_Token>(result);
                if (TokenData == null)
                    throw new Exception("反序列化结果失败,返回内容为:" + result);
                //3.获取成功
                if (OnGetTokenSuccess != null)
                    OnGetTokenSuccess(TokenData);
            }
            catch (Exception ex)
            {
                Error("第二步,通过code换取网页授权access_token异常", ex);
            }
        }
        /// <summary>
        /// 刷新当前access_token
        /// </summary>
        public OAuthAccess_Token RefreshAccess_Token()
        {
            try
            {
                //1.发送请求
                string url = GetReferesh_TokenUrl();
                string result = NetHelper.Get(url);
                //2.解析结果
                OAuthAccess_Token token = JsonConvert.DeserializeObject<OAuthAccess_Token>(result);
                if (token == null)
                    throw new Exception("反序列化结果失败,返回内容:" + result);
                return token;
            }
            catch (Exception ex)
            {
                Error("刷新当前access_token失败", ex);
                return null;
            }
        }
        #endregion

        #region 第三步,获取用户基本信息
        /// <summary>
        /// 第三步,获取基本信息
        /// </summary>
        public void GetUserInfo()
        {
            try
            {
                //1.发送get请求
                string url = GetUserInfoUrl();
                string result = NetHelper.Get(url);
                //2.解析结果
                OAuthUser user = JsonConvert.DeserializeObject<OAuthUser>(result);
                if (user == null)
                    throw new Exception("反序列化结果失败,返回内容:" + result);
                //3.获取成功
                if (OnGetUserInfoSuccess != null)
                    OnGetUserInfoSuccess(user);
            }
            catch (Exception ex)
            {
                Error("第三步、获取用户基本信息异常", ex);
            }
        }
        #endregion

        #region 静态方法
        /// <summary>
        /// 验证授权凭证是否有效
        /// </summary>
        /// <param name="access_token">access_token</param>
        /// <param name="openid">用户针对当前公众号的openid</param>
        /// <returns></returns>
        public static bool CheckWebAccess_Token(string access_token, string openid)
        {
            try
            {
                string url = string.Format("https://api.weixin.qq.com/sns/auth?access_token={0}&openid={1}",
             access_token,
             openid);
                string result = NetHelper.Get(url);
                JObject obj = JObject.Parse(result);
                int errcode = (int)obj["errcode"];
                return errcode == 0;
            }
            catch (Exception ex)
            {
                throw new Exception("," + ex.Message);
            }
        }
        #endregion

        #region 获取请求连接
        /// <summary>
        /// 获取Code的url 地址
        /// </summary>
        /// <returns></returns>
        public string GetCodeUrl()
        {
            string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect",
                this.appid,
                SecurityHelper.UrlEncode(this.redirect_uri),
                this.scope);
            return url;
        }
        /// <summary>
        /// 获取access_token的url地址
        /// </summary>
        /// <returns></returns>
        private string GetAccess_TokenUrl()
        {
            string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code",
                this.appid,
                this.secret,
                this.Code);
            return url;
        }
        /// <summary>
        /// 获取刷新AccessToke的地址
        /// </summary>
        /// <returns></returns>
        private string GetReferesh_TokenUrl()
        {
            string url = string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}",
                this.appid,
                this.TokenData.refresh_token
                );
            return url;
        }
        /// <summary>
        /// 获取用户基本信息地址
        /// </summary>
        /// <returns></returns>
        private string GetUserInfoUrl()
        {
            string url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN",
                this.TokenData.access_token,
                this.TokenData.openid);
            return url;
        }
        #endregion
        private void Error(string msg, Exception inner)
        {
            if (this.OnError != null)
            {
                this.OnError(new Exception(msg, inner));
            }
        }
    }
    /// <summary>
    /// 授权之后获取用户基本信息
    /// </summary>
    public class OAuthUser
    {
        public string openid { get; set; }
        public string nickname { get; set; }
        public int sex { get; set; }
        public string province { get; set; }
        public string city { get; set; }
        public string country { get; set; }
        public string headimgurl { get; set; }
        /// <summary>
        /// 用户特权信息,json 数组
        /// </summary>
        public JArray privilege { get; set; }
        public string unionid { get; set; }
    }
    /// <summary>
    /// 获取Access_Token或者刷新返回的数据对象
    /// </summary>
    public class OAuthAccess_Token
    {
        public string access_token { get; set; }
        public int expires_in { get; set; }
        public string refresh_token { get; set; }
        /// <summary>
        /// 用户针对当前公众号的唯一标识
        /// 关注后会产生,返回公众号下页面也会产生
        /// </summary>
        public string openid { get; set; }
        public string scope { get; set; }
        /// <summary>
        /// 当前用户的unionid,只有在用户将公众号绑定到微信开放平台帐号后
        /// </summary>
        public string unionid { get; set; }
    }
}

更多:

QQ登陆,获取QQ用户信息

新浪微博登陆,获取微博用的信息

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值