微信受权错误:"errcode":40163,"errmsg":"codebeenused 微信受权错误:"errcode":40163,"errmsg":"codebeenused

转自:微信受权错误:"errcode":40163,"errmsg":"codebeenused

 

微信网页受权获取code值回调两次的问题

1.说是域名缘由,目前未测试,没有正确的域名html

  1. 问题描述:在调用微信网页受权获取openid值时,先获取的code值,可是code值的接口 会走两次回调。而code在6分钟内只能用一次,因此处出现code失效的问题,问题显示错误码:{‘errcode’:40029,’errmsg’:’invalid code, hints: [ req_id: 0407ns44 ]’}
  2. 解决办法: 出现这个问题是由于域名的问题,本人先使用的花生壳的内网穿透,可是花生壳的免费域名应用的是第三方代理域名,因此在向微信服务器发送请求的时候,微信回调时,会认为你的域名请求不一致,会回调两次,重定向你的服务器两次,只需更改正式域名便可。就会回调一次。(网上说的返回值结束二次回调,和301重定向 都是坑人的,折腾一天仍是域名问题

2.说须要一个参数 &connect_redirect=1,这个是解决40029的错误数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//实际使用生成url的代码 <br>string UrlUserInfo = OAuthApi.GetAuthorizeUrl(AppId,
                 "http://2a20h48668.imwork.net/weixin/UserInfoCallback?returnUrl="  + returnUrl.UrlEncode(),
                 state, OAuthScope.snsapi_userinfo);
       // 摘要:
         //     获取验证地址的API,以及参数说明
         //
         // 参数:
         //   appId:
         //     公众号的惟一标识
         //
         //   redirectUrl:
         //     受权后重定向的回调连接地址,请使用urlencode对连接进行处理
         //
         //   state:
         //     重定向后会带上state参数,开发者能够填写a-zA-Z0-9的参数值,最多128字节
         //
         //   scope:
         //     应用受权做用域,snsapi_base (不弹出受权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出受权页面,可经过openid拿到昵称、性别、所在地。而且,即便在未关注的状况下,只要用户受权,也能获取其信息)
         //
         //   responseType:
         //     返回类型,请填写code(或保留默认)
         //
         //   addConnectRedirect:
         //     加上后能够解决40029-invalid code的问题(测试中)
         public  static  string  GetAuthorizeUrl( string  appId,  string  redirectUrl,  string  state, OAuthScope scope,  string  responseType =  "code" bool  addConnectRedirect =  true );

  最终网址结果api

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd84d9cb4875236c9&redirect_uri=http%3A%2F%2F2a20h48668.imwork.net%2Fweixin%2FUserInfoCallback%3FreturnUrl%3D%252FWeixinJSSDK%252Findex&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect

3.访问的地址是缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/// <summary>
        /// OAuthScope.snsapi_userinfo方式回调
        /// </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( "您拒绝了受权!" );
            }
            var  orginState = data.getState();
 
            if  (state != orginState)
            {
                //这里的state实际上是会暴露给客户端的,验证能力很弱,这里只是演示一下,
                //建议用完以后就清空,将其一次性使用
                //实际上能够存任何想传递的数据,好比用户ID,而且须要结合例以下面的Session["OAuthAccessToken"]进行验证
                return  Content( "验证失败!请从正规途径进入!" );
            }
 
            OAuthAccessTokenResult result =  null ;
 
            //经过,用code换取access_token
            try
            {
                result = OAuthApi.GetAccessToken(AppId, AppSecret, code);
            }
            catch  (Exception ex)
            {
                return  Content(ex.Message);
            }
            if  (result.errcode != ReturnCode.请求成功)
            {
                return  Content( "错误:"  + result.errmsg);
            }
            //下面2个数据也能够本身封装成一个类,储存在数据库中(建议结合缓存)
            //若是能够确保安全,能够将access_token存入用户的cookie中,每个人的access_token是不同的
            HttpContext.Session.SetString( "OAuthAccessTokenStartTime" , DateTime.Now.ToString());
            HttpContext.Session.SetString( "OAuthAccessToken" , result.ToJson());
 
            //由于第一步选择的是OAuthScope.snsapi_userinfo,这里能够进一步获取用户详细信息
            try
            {
                if  (! string .IsNullOrEmpty(returnUrl))
                {
                    return  Redirect(returnUrl);
                }
 
                OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid);
                return  View(userInfo);
            }
            catch  (ErrorJsonResultException ex)
            {
                return  Content(ex.Message);
            }
        }

  //建议将result存入数据库中,确保值访问一次安全

相关文章
相关标签/搜索