微信OAuth授权,偶然出现invalid code,invalid token

时间:2020-12-16 04:52:53
OAuth授权出现少数人报 40029错误,一直授权不成功。贴上代码,求大神指教。

if (LWRequest.GetString("code") != "")
                {
                    OAuthUserInfo infos = null;
                    try
                    {
                        DataTable result = GetToken(LWRequest.GetString("code"), Appid, Ksy);
                        if (result.Columns.Contains("errcode"))
                        {
                            Prompt("" + result.Rows[0]["errmsg"].ToString());
                            return;
                        }
                        infos = OAuthApi.GetUserInfo(result.Rows[0]["access_token"].ToString(), result.Rows[0]["openid"].ToString());
                    }
                    catch 
                    {
                        Response.Redirect("/500error.html");
                    }
                    if (infos != null)
                    {
                        
                    }
                }
                else
                {
                    string u = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Appid + "&redirect_uri=" + System.Web.HttpContext.Current.Server.UrlEncode(url) + "&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect";
                    Response.Redirect(u);
                }

17 个解决方案

#1


if (string.IsNullOrEmpty(Request.QueryString["code"]))
{
string urlStr = OAuthApi.GetAuthorizeUrl(AppId, "你的授权方法/UserOAuth?url=" + urlCallBack, "1", OAuthScope.snsapi_base, "code");
Redirect(urlStr)
}
else
{
//如果用户已经授权,那么这里添加代码
}

public void UserOAuth(string url,string code)
{
这里是授权方法。
}

#2


来个人啊 亲。十万火急

#3


http://tieba.baidu.com/p/4142016680?pid=78559049209&cid=0#78559049209

之前在贴吧写的。25楼开始,是授权,希望对你有点帮助

#4


引用 1 楼 hanjun0612 的回复:
if (string.IsNullOrEmpty(Request.QueryString["code"]))
{
string urlStr = OAuthApi.GetAuthorizeUrl(AppId, "你的授权方法/UserOAuth?url=" + urlCallBack, "1", OAuthScope.snsapi_base, "code");
Redirect(urlStr)
}
else
{
//如果用户已经授权,那么这里添加代码
}

public void UserOAuth(string url,string code)
{
这里是授权方法。
}

授权方法里边根据code获取token偶尔会出现invalid code  和这种问题 微信OAuth授权,偶然出现invalid code,invalid token

#5


可能是你调用错了。
授权的token和普通token不是同一个。
微信OAuth授权,偶然出现invalid code,invalid token

#6


抓包,把错误的包的请求拿出来分析下

#7


引用 5 楼 hanjun0612 的回复:
可能是你调用错了。
授权的token和普通token不是同一个。
微信OAuth授权,偶然出现invalid code,invalid token

Token是同一个
微信OAuth授权,偶然出现invalid code,invalid token

#8


引用 7 楼 peng2739956 的回复:
Quote: 引用 5 楼 hanjun0612 的回复:

可能是你调用错了。
授权的token和普通token不是同一个。
微信OAuth授权,偶然出现invalid code,invalid token

Token是同一个
微信OAuth授权,偶然出现invalid code,invalid token

关键是同一套代码,有些人能授权成功,有些人就不行,而且token 出问题,那也应该 try catch到,但是直接程序奔溃了。

#9


 var result = OAuthApi.GetAccessToken(AppId, AppSecret, code);

程序崩溃还真不知道了。你看一下我刚才给你的贴吧地址,里面我写了一些代码的。
我看你写的代码,好像没什么问题。

#10


引用 9 楼 hanjun0612 的回复:
 var result = OAuthApi.GetAccessToken(AppId, AppSecret, code);

程序崩溃还真不知道了。你看一下我刚才给你的贴吧地址,里面我写了一些代码的。
我看你写的代码,好像没什么问题。


代码差不多,我也是用的senparc的SDK,代码就几行,出现这种问题连原因都没分析出来 微信OAuth授权,偶然出现invalid code,invalid token

#11


不抓包拿出来分析,盯着代码瞪眼有用?就算你去找对方技术,别人也是让你拿数据来,你给他们看代码,有用?

#12


引用 10 楼 peng2739956 的回复:
Quote: 引用 9 楼 hanjun0612 的回复:

 var result = OAuthApi.GetAccessToken(AppId, AppSecret, code);

程序崩溃还真不知道了。你看一下我刚才给你的贴吧地址,里面我写了一些代码的。
我看你写的代码,好像没什么问题。


代码差不多,我也是用的senparc的SDK,代码就几行,出现这种问题连原因都没分析出来 微信OAuth授权,偶然出现invalid code,invalid token


我总觉得是代码问题,因为我这里访问,好像还没出过这个情况。。。。。
但是根据楼主的代码,也分析不出原因

#13


这是多次回调的问题

#14


楼主解决了吗?我也是这个问题 找不到答案

#15


开启调试,你会发现你在同页面有2次获取Code,避免点击某些按钮,发生再次回传获取CODE,NET的话请把第一次获取放到
        if (!IsPostBack)
        {
             放到这里,避免点击按钮时又一次获取
        }

#16


你这个主要原因还是出在微信的code上面!因为微信对code说明是 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 页面授权将跳转至 redirect_uri填写的url的时候会带上code和state,因为code只能使用一次,所以当用户刷新当前页面的时候code就会失效,就会出现oauth_code invalid code报错信息。

#17


你这个主要原因还是出在微信的code上面!因为微信对code说明是 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 页面授权将跳转至 redirect_uri填写的url的时候会带上code和state,因为code只能使用一次,所以当用户刷新当前页面的时候code就会失效,就会出现oauth_code invalid code报错信息。解决办法是当页面授权将跳转至 redirect_uri填写的url的时候会带上code和state,利用code换取openid和页面access_token等,在带上这些参数又重定向对当前页面代码如下$weixin = new TPWechat($this->options);
        if (isset($_GET['code'])) {
            $re = $weixin->getOauthAccessToken();
            if (!$re) {
                $error = \Com\Wechat\ErrorCode::getErrText($weixin->errCode);
                echo ($error . "\n" . $weixin->errMsg);
                die;
            }
            redirect(U('Index/viewsaaa?openid=' . $re['openid'] . '&access_token=' . $re['access_token'] . '&refresh_token=' . $re['refresh_token']));
        } else {
            $this->assign(array(
                'openid' => I('get.openid'),
                'token' => I('get.access_token'),
                'refresh_token' => I('get.refresh_token'),
            ));
            $this->display('views');
        }

#1


if (string.IsNullOrEmpty(Request.QueryString["code"]))
{
string urlStr = OAuthApi.GetAuthorizeUrl(AppId, "你的授权方法/UserOAuth?url=" + urlCallBack, "1", OAuthScope.snsapi_base, "code");
Redirect(urlStr)
}
else
{
//如果用户已经授权,那么这里添加代码
}

public void UserOAuth(string url,string code)
{
这里是授权方法。
}

#2


来个人啊 亲。十万火急

#3


http://tieba.baidu.com/p/4142016680?pid=78559049209&cid=0#78559049209

之前在贴吧写的。25楼开始,是授权,希望对你有点帮助

#4


引用 1 楼 hanjun0612 的回复:
if (string.IsNullOrEmpty(Request.QueryString["code"]))
{
string urlStr = OAuthApi.GetAuthorizeUrl(AppId, "你的授权方法/UserOAuth?url=" + urlCallBack, "1", OAuthScope.snsapi_base, "code");
Redirect(urlStr)
}
else
{
//如果用户已经授权,那么这里添加代码
}

public void UserOAuth(string url,string code)
{
这里是授权方法。
}

授权方法里边根据code获取token偶尔会出现invalid code  和这种问题 微信OAuth授权,偶然出现invalid code,invalid token

#5


可能是你调用错了。
授权的token和普通token不是同一个。
微信OAuth授权,偶然出现invalid code,invalid token

#6


抓包,把错误的包的请求拿出来分析下

#7


引用 5 楼 hanjun0612 的回复:
可能是你调用错了。
授权的token和普通token不是同一个。
微信OAuth授权,偶然出现invalid code,invalid token

Token是同一个
微信OAuth授权,偶然出现invalid code,invalid token

#8


引用 7 楼 peng2739956 的回复:
Quote: 引用 5 楼 hanjun0612 的回复:

可能是你调用错了。
授权的token和普通token不是同一个。
微信OAuth授权,偶然出现invalid code,invalid token

Token是同一个
微信OAuth授权,偶然出现invalid code,invalid token

关键是同一套代码,有些人能授权成功,有些人就不行,而且token 出问题,那也应该 try catch到,但是直接程序奔溃了。

#9


 var result = OAuthApi.GetAccessToken(AppId, AppSecret, code);

程序崩溃还真不知道了。你看一下我刚才给你的贴吧地址,里面我写了一些代码的。
我看你写的代码,好像没什么问题。

#10


引用 9 楼 hanjun0612 的回复:
 var result = OAuthApi.GetAccessToken(AppId, AppSecret, code);

程序崩溃还真不知道了。你看一下我刚才给你的贴吧地址,里面我写了一些代码的。
我看你写的代码,好像没什么问题。


代码差不多,我也是用的senparc的SDK,代码就几行,出现这种问题连原因都没分析出来 微信OAuth授权,偶然出现invalid code,invalid token

#11


不抓包拿出来分析,盯着代码瞪眼有用?就算你去找对方技术,别人也是让你拿数据来,你给他们看代码,有用?

#12


引用 10 楼 peng2739956 的回复:
Quote: 引用 9 楼 hanjun0612 的回复:

 var result = OAuthApi.GetAccessToken(AppId, AppSecret, code);

程序崩溃还真不知道了。你看一下我刚才给你的贴吧地址,里面我写了一些代码的。
我看你写的代码,好像没什么问题。


代码差不多,我也是用的senparc的SDK,代码就几行,出现这种问题连原因都没分析出来 微信OAuth授权,偶然出现invalid code,invalid token


我总觉得是代码问题,因为我这里访问,好像还没出过这个情况。。。。。
但是根据楼主的代码,也分析不出原因

#13


这是多次回调的问题

#14


楼主解决了吗?我也是这个问题 找不到答案

#15


开启调试,你会发现你在同页面有2次获取Code,避免点击某些按钮,发生再次回传获取CODE,NET的话请把第一次获取放到
        if (!IsPostBack)
        {
             放到这里,避免点击按钮时又一次获取
        }

#16


你这个主要原因还是出在微信的code上面!因为微信对code说明是 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 页面授权将跳转至 redirect_uri填写的url的时候会带上code和state,因为code只能使用一次,所以当用户刷新当前页面的时候code就会失效,就会出现oauth_code invalid code报错信息。

#17


你这个主要原因还是出在微信的code上面!因为微信对code说明是 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 页面授权将跳转至 redirect_uri填写的url的时候会带上code和state,因为code只能使用一次,所以当用户刷新当前页面的时候code就会失效,就会出现oauth_code invalid code报错信息。解决办法是当页面授权将跳转至 redirect_uri填写的url的时候会带上code和state,利用code换取openid和页面access_token等,在带上这些参数又重定向对当前页面代码如下$weixin = new TPWechat($this->options);
        if (isset($_GET['code'])) {
            $re = $weixin->getOauthAccessToken();
            if (!$re) {
                $error = \Com\Wechat\ErrorCode::getErrText($weixin->errCode);
                echo ($error . "\n" . $weixin->errMsg);
                die;
            }
            redirect(U('Index/viewsaaa?openid=' . $re['openid'] . '&access_token=' . $re['access_token'] . '&refresh_token=' . $re['refresh_token']));
        } else {
            $this->assign(array(
                'openid' => I('get.openid'),
                'token' => I('get.access_token'),
                'refresh_token' => I('get.refresh_token'),
            ));
            $this->display('views');
        }