1. 将目标url作为redirectUrl,产生一个oAuthUrl
string oAuthUrl = string.Format(
"https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}#wechat_redirect",
APPID,
HttpUtility.UrlEncode(redirectUrl),
SCOPE,
transmitData == null ? "" : HttpUtility.UrlEncode(transmitData)
);
注:
(1)并不是任意Url都可以作为redirectUrl,该Url的域名需要在微信公众平台管理页面进行配置:OAuth2.0网页授权,修改,授权回调页面域名。
(2)微信的oAuthUrl只能在微信浏览器中使用。
(3)SCOPE = "snsapi_base",表示不弹出用户确认框,来获取用户信息。
(4)transmitData表示要传递过去的参数,redirectUrl中可以使用Request["state"]来拿到。
2. 目标url页面获取OpenID
(1)从查询参数中拿到oAuthCode = Request["code"]。
(2)通过以下方式拿到AccessToken。
string getAccessTokenUrl = string.Format(
"https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code",
APPID,
APPSECRET,
oAuthCode
);
(3)解析这个getAccessTokenUrl返回的json字符串,拿到OpenID
public sealed class AccessToken
{
public string access_token { get; set; }
public long expires_in { get; set; }
public string refresh_token { get; set; }
public string openid { get; set; }
public string scope { get; set; }
}
注:
(1)在目标url中,只能使用oAuthCode一次,否则就会过期,显示“redirect_uri参数错误”。
(2)只要用户访问oAuthUrl就可以拿到对应于APPID,APPSECRET这个公众号的OpenID。所以,既可以让用户来点击这个oAuthUrl,也可以直接重定向过去。