1.说是域名缘由,目前未测试,没有正确的域名数据库
2.说须要一个参数 &connect_redirect=1,这个是解决40029的错误api
//实际使用生成url的代码
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.访问的地址是安全
/// <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存入数据库中,确保值访问一次服务器