Jacinth 2018-05-14
流程图
我们需要判断是否存在OPENID 首先我们得先定义一个全局的OPENID 类似于普通账号密码登录系统的 当前登录用户ID 因为我是MVC 框架 我这里定义一个控制器基类BaseController 然后将OPENID定义在BaseController中
public class BaseController : Controller { public string openid { get { return Session["openid"].ToString(); } set { Session["openid"] = value; } } }
然后定义一个HomeController 写一个 测试登录功能
public class HomeController : BaseController { // GET: Home public ActionResult Login() { if (string.IsNullOrEmpty(openid)) //openid不存在 跳转授权 { //此处忽略10万行授权相关代码 } //此处忽略3000行获取用户信息相关 return View(); } }
以上为一个大概 忽略大部分无关紧要代码后的微信授权登录功能代码 当然很多人要的都不是这些 接下来 是一些更详细的代码 大概分为2个大模块
这里我将这2个模块写成2个方法定义在WXHelper类中
public class WXHelper { public string GetOpenID() { return "openid"; } public User_UserInfo GetUserInfo() { User_UserInfo model_UserInfo = new User_UserInfo(); return model_UserInfo; } }
然后之前的Login Action 可以改成这样
public ActionResult Login() { if (string.IsNullOrEmpty(openid)) //openid不存在 跳转授权 { openid = WXHelper.GetOpenID(); } //LoginUserInfo 是我当前登录用户信息 你们自行找方式存 Session 或者全局变量之类的 LoginUserInfo = WXHelper.GetUserInfo(); return View(); }
下面我们开始实现第一个方法 GetOpenID官方API
这里具体请求我就不 多说了 主意 几个地方 这里我是采用的 方式为 scope=snsapi_base
因为这里回调地址 无法写本地地址进行调试 所以我采用 手动记录code 并在有效期内手动在本地写入code 继续往下调试
不情愿的贴上代码
/// <summary> /// 获取code 方法 /// </summary> private static void GetWeChat_Code() { string urlhead = "https://"; string rediretUrl = "https%3a%2f%2fxxxx.com%2fHome%2fLoadCode"; string strUrl = $"{urlhead}open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={rediretUrl}&response_type=code&scope=snsapi_base&state=qwe12e12e#wechat_redirect"; //此处省略n行get请求方法 }
细心的朋友可能会发现上面的redireUrl 地址指向的是Home 控制器下面 LoadCode 这个 方法 SO
#region 微信授权回调 public ActionResult LoadCode(string code, string state) { return View(); } #endregion
因为MVC 的参数映射 所以我只需要把 code 和state 写成方法参数即可 这里我就可以获取到code方法了 然后我们直接通过code 获取OPENID
#region 获取OpenID public static string GetOpenId(string code) { string urlhead = "https://"; string strUrl = $"{urlhead}api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code"; Access_openid token = new Access_openid(); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl); //用GET形式请求指定的地址 req.Method = "GET"; using (WebResponse wr = req.GetResponse()) { //HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse(); StreamReader reader = new StreamReader(wr.GetResponseStream(), Encoding.UTF8); string content = reader.ReadToEnd(); reader.Close(); reader.Dispose(); //在这里对Access_token 赋值 token = JsonConvert.DeserializeObject<Access_openid>(content); } return token.openid; } #endregion
如果有人对这个Access_openid 对象感到懵逼的话 这里说一下 这个对象就是下图中 红框 获取到的JSON数据 的对象 这里我们是 snsapi_base 所以只需要 openid 切 整个授权过程到次结束