授权错误:errcode:40163,errmsg:codebeenused
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//实际使⽤⽣成url的代码 <br>string UrlUserInfo = OAuthApi.GetAuthorizeUrl(AppId,
2 "2a20h48668.imwork/weixin/UserInfoCallback?returnUrl=" + returnUrl.UrlEncode(),
3 state, OAuthScope.snsapi_userinfo);
4 // 摘要:
5 // 获取验证地址的API,以及参数说明
6 //
7 // 参数:
8 // appId:
9 // 的唯⼀标识
10 //
11 // redirectUrl:
12 // 授权后重定向的回调链接地址,请使⽤urlencode对链接进⾏处理
13 //
14 // state:
15 // 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
16 //
17 // scope:
18 // 应⽤授权作⽤域,snsapi_base (不弹出授权页⾯,直接跳转,只能获取⽤户openid),snsapi_userinfo (弹出授权页⾯,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要⽤户授权,也能获取其信息)
19 //
20 // responseType:
21 // 返回类型,请填写code(或保留默认)
22 //
23 // addConnectRedirect:
24 // 加上后可以解决40029-invalid code的问题(测试中)
25public static string GetAuthorizeUrl(string appId, string redirectUrl, string state, OAuthScope scope, string responseType = "code", bool addConnectRedirect = true);
最终⽹址结果
open.weixin.qq/connect/oauth2/authorize?appid=wxd84d9cb4875236c9&redirect_uri=http%3A%2F%2F2a20h48668.imwork%2Fweixin%2FUserInfoCallback%3FreturnUrl%3D%252FWeixinJSSDK%252Findex&response_type=code 3.访问的地址是
1/// <summary>
2/// OAuthScope.snsapi_userinfo⽅式回调
3/// </summary>
4/// <param name="code"></param>
5/// <param name="state"></param>
6/// <param name="returnUrl">⽤户最初尝试进⼊的页⾯</param>
7/// <returns></returns>
8public ActionResult UserInfoCallback(string code, string state, string returnUrl)
9 {
10if (string.IsNullOrEmpty(code))
11 {
12return Content("您拒绝了授权!");
13 }
14var orginState = State();
15
16if (state != orginState)
17 {
18//这⾥的state其实是会暴露给客户端的,验证能⼒很弱,这⾥只是演⽰⼀下,
19 //建议⽤完之后就清空,将其⼀次性使⽤
20 //实际上可以存任何想传递的数据,⽐如⽤户ID,并且需要结合例如下⾯的Session["OAuthAccessToken"]进⾏验证
21return Content("验证失败!请从正规途径进⼊!");
22 }
23
24 OAuthAccessTokenResult result = null;
25
26//通过,⽤code换取access_token
27try
28 {
29 result = OAuthApi.GetAccessToken(AppId, AppSecret, code);
30 }
31catch (Exception ex)
32 {
33return Content(ex.Message);
34 }
35if (de != ReturnCode.请求成功)
36 {
37return Content("错误:" + sg);
38 }
39//下⾯2个数据也可以⾃⼰封装成⼀个类,储存在数据库中(建议结合缓存)
40 //如果可以确保安全,可以将access_token存⼊⽤户的cookie中,每⼀个⼈的access_token是不⼀样的
41 HttpContext.Session.SetString("OAuthAccessTokenStartTime", DateTime.Now.ToString());
42 HttpContext.Session.SetString("OAuthAccessToken", result.ToJson());
43
44//因为第⼀步选择的是OAuthScope.snsapi_userinfo,这⾥可以进⼀步获取⽤户详细信息
45try
46 {
47if (!string.IsNullOrEmpty(returnUrl))
48 {
49return Redirect(returnUrl);
50 }
51
52 OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid);
53return View(userInfo);
54 }
网55catch (ErrorJsonResultException ex)
56 {
57return Content(ex.Message);
58 }
59 }
//建议将result存⼊数据库中,确保值访问⼀次
发布评论