zoukankan      html  css  js  c++  java
  • 微信授权错误:"errcode":40163,"errmsg":"codebeenused

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

     

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

    1.说是域名原因,目前未测试,没有正确的域名

    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);

      最终网址结果

    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存入数据库中,确保值访问一次

  • 相关阅读:
    js拖动窗口 用层模拟可移动的小窗口
    tar命令详解
    linux内核编译过程的最终总结版
    用C#写ASP.NET搜索蜘蛛代码程序
    ID 为 333 的事件被添加到基于 Windows Server 2003 的计算机上的系统日志中的补丁下载地址
    简单实用的C#分词源代码(含词库素材下载)
    CSS截取固定长度字符串
    javascript 常用代码技巧大收集
    C# 特性(Attribute)
    关于iis HTTPERR日志
  • 原文地址:https://www.cnblogs.com/feiquan/p/10902536.html
Copyright © 2011-2022 走看看