.net oauth 微信开发

2016-10-25 14:33:05 jiangcsc 阅读数 5326

微信网页授权我相信做微信开发的小伙伴都可能遇见过这样的问题

1.我们要明白微信网页授权主要是用来做什么?

用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信 息, 进 而实现业务逻辑。

网页授权分以下几步
1. 配置网页授权回调域名
2. 用户同意授权,获取code
3. 通过code换取网页授权access_token
4. 刷新access_token(如果需要)
5. 拉取用户信息(需scope为 snsapi_userinfo)

1. 配置网页授权回调域名
现在微信高级接口列表中并没有-OAuth2.0 微信修改了配置地方
公共号设置=>功能设置=>网页授权域名 的设置选项中,修改授权回调域名
这里写图片描述!这里写图片描述这里写图片描述
这里图片弄的比较小,小伙伴们可以登录公共微信号后台自己看
关于网页授权回调域名的说明:

1、这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头
2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.htmlhttp://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.comhttp://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权

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

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

https://open.weixin.qq.com/connect/oauth2/authorizeappid=APPID&

redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

这里写图片描述

这里写图片描述

redirect_uri:就是当网页获取code之后需要跳转的页面地址
1.例如http://www.xxxx.net/index.aspx我当前页面要进行网页授权, 则填写redirect_uri
http://www.xxxx.net/index.aspx

3. 通过code换取网页授权access_token

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

请求方法 获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

这里写图片描述这里写图片描述

4. 刷新access_token(如果需要)
这里可以参照微信公共平台提供的
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_CN[这里写链接内容]
5. 拉取用户信息(需scope为 snsapi_userinfo)
想必大家看到这里看到烦了 都是一些纸上谈兵的事情,上代码了
比如我http://www.xxxx.net/index.aspx想进行网页授权
这里我微信公共后台的数据AppID,Appsecret…等一些数据是放在了数据库

比如现在通过ID来读取读取数据库数据,但是在项目中为了安全可能只是传一个ID,大家更具项目需求来写吧!

“`第一次打开网页的时候:http://www.xxxx.net/index.aspx?ID=xxxx

protected string toopenid { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
        DAL da = new DAL();
        var appid = string.Empty;
        var appsecret = string.Empty;
        var code = Request.QueryString["Code"];
        var ID= Request.QueryString["ID"];
        if (string.IsNullOrEmpty(code))  //在网页授权之后会回调该页面 如果有值就不需要在去获取code
        {
            if (!string.IsNullOrWhiteSpace(ID))
            {
                DataRow shopdataRow = da.GetAppID(ID);
                if (shopdataRow != null)
                {
                     appid = (String)shopdataRow["appid"];
                     Response.Redirect(BuildWebCodeUrl(appid, "http://www.xxxx.net/index.aspx?appid =" + appid, "snsapi_base",
                      "a-zA-Z0-9"));
                     //这步用户同意授权,获取code,获取之后回调当我当前页面
                     //大家有要问了为什么这里需要传递appID呢?这个appID是当我获取完之后通过appID来查询数据来获取appsecret

                }

            }


        }
        else
        {
            if (!string.IsNullOrWhiteSpace(appid ))
            {
                DataRow shopdataRow = da.Getappsecret(appid );
                if (shopdataRow != null)
                {
                    appsecret = (String)shopdataRow["appsecret"];
                 }
            }
            //Post 这里就是一个Post方法来获取用户的openid而已
            WebCredential theWebCredential = Post(appid, appsecret, code);

            toopenid = theWebCredential.openid;
          }

WeiXin.BuildWebCodeUrl:说明
///
/// 得到获取code的Url
///
/// 公众号的唯一标识
/// 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
/// 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
/// 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值
///
public static string BuildWebCodeUrl(string appid, string redirect, string scope, string state = “”)
{

  return string.Format("https://open.weixin.qq.com/connect/oauth2/
  authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=       {3}#wechat_redirect", appid, redirect, scope, state);
 }

如果是用Asp。net做的可以下载
https://github.com/loogn/WeiXinSDK/tree/master/Loogn.WeiXinSDK
这个是一个微信开发的C#包

写的不好,大家多原谅哈

2016-06-22 12:22:46 fxj805835819 阅读数 8775

随着越来越多的微信公众号开发需求,很多人看微信公众平台的说明文档,都觉得有点是懂非懂的感觉,关键在于,微信开发调试比较困难。

针对这个现象,我来说一下.NET怎么获取用得较多的微信openid(获取头像等功能也类似)。

获取微信OpenID的前提是,你拥有认证过的微信服务号(公众号)或者订阅号,具体服务号、订阅号的功能区别可以看微信接口权限说明文档(详细接口权限说明文档)。

以认证过的微信服务号为例,我们来获取一下微信Openid。

第一步,设置网页回调域名,下面是微信的说明文字

1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 

2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、

http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权 

3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可 

我们要做的就是在“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。回调域名可以是www.****.com或者二级域名(如pay.****.com)。

第二步,获取code。https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 

其中redirect_uri的地址就要指向你需要获取到code(OpenID)的页面,该页面的域名地址必须在之前授权回调域名下。appid就是你公众号的应用ID(在开发-基本配置中;另一个应用密钥AppSecret在后面要用到)。

第三步,通过code获取到access_token和OpenID(https://api.weixin.qq.com/sns/oauth2/access_token?appid=&secret=&code=&grant_type=authorization_code),

其中appid就是应用ID,secret是应用密钥,code就是第二步获取到的值。其实很简单,请求一下就获取到返回值就可以了。


在Page_Load中写事件,把这个页面放到回调域名中,在微信中打开链接就可以

https://open.weixin.qq.com/connect/oauth2/authorize?appid=输入你的应用ID&redirect_uri=回调域名详细到指定页面&

response_type=code&scope=SCOPE&state=STATE#wechat_redirect)。


2019-03-04 10:28:00 weixin_30925411 阅读数 14
2018-06-21 15:19:00 weixin_30362233 阅读数 272

  获取openid流程为首先根据微信开发参数构造AuthorizeUrl认证链接,用户跳转到该链接进行授权,授权完成将跳转到回调页(首次认证需要授权,后面将直接再跳转至回调页),此时回调页中带上一个GET参数code,使用该code请求微信接口得到用户的openid。话不多说,直接上代码。

1.编写认证类OAuth

public class OAuth
    {
        public static HttpClient httpClient = new HttpClient();
        public static string GetAuthorizeUrl(string appId, string redirectUrl, string state= "state", string scope = "snsapi_base", string responseType = "code")
        {
            if (!string.IsNullOrEmpty(redirectUrl))
            {
                redirectUrl = HttpUtility.UrlEncode(redirectUrl, System.Text.Encoding.UTF8);
            }
            else
            {
                redirectUrl = null;
            }
            object[] args = new object[] { appId, redirectUrl, responseType, scope, state };
            return string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type={2}&scope={3}&state={4}#wechat_redirect", args);
        }

        public static string GetOpenIdUrl(string appId, string secret, string code, string grantType = "authorization_code")
        {
            object[] args = new object[] { appId, secret, code, grantType };
            string requestUri = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type={3}", args);
            return requestUri;
        }

        /// <summary>
        /// 获取openid
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="secret"></param>
        /// <param name="code"></param>
        /// <param name="grantType"></param>
        /// <returns></returns>
        public static string GetOpenid(string appId, string secret, string code, string grantType = "authorization_code")
        {
            string requestUri = GetOpenIdUrl(appId, secret, code, grantType);
            var responseStr = httpClient.GetAsync(requestUri).Result.Content.ReadAsStringAsync().Result;
            var obj = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseStr);
            string openid = string.Empty;
            if (!obj.TryGetValue("openid", out openid))
            {
                Log.Info($"获取openid失败appId={appId},secret={secret},code={code}");
            }
            return openid;
        }
    }

  2.在控制器中使用认证类获取用户openid,注意:访问该控制器地址确保微信回调时候也能访问到该地址

/// <summary>
       /// 获取微信openid
       /// </summary>
       /// <param name="code"></param>
       /// <returns></returns>
       [HttpGet]
        public IActionResult GetWxOpenid(string code)
        {
            WxPayConfig wxPayConfig = new WxPayConfig();
            //首先构造微信请求授权url,重定向到该url中,其中redirectUrl是回调地址,必须保证该地址在公网上能访问,本例子构造的是返回到本控制器的方法。
            //若是从微信授权返回进入该方法,则会带上一个参数,code就不为空,若code为空则跳转微信授权
            if (string.IsNullOrEmpty(code))
            {
                var redirectUrl = OAuth.GetAuthorizeUrl(wxPayConfig.appid, "回调地址到公网本Action");
                return Redirect(redirectUrl);
            }
            else
            {
                //根据code和微信参数得到openid
                var openId = OAuth.GetOpenid(wxPayConfig.appid, wxPayConfig.appSecret, code);
                //业务处理
                
            }
            return View();
        }

  通过使用OAuth类轻松的就能获取用户的Openid

附上写日志的一个老师傅写类库Sky.Logger,在项目中添加引用即可使用日志:链接: https://pan.baidu.com/s/1eHdNGZN0pmNHsO_yHzgE_g 密码: ta2x

转载于:https://www.cnblogs.com/jomzhang/p/9209241.html