流程图
我们需要判断是否存在 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 个大模块
获取 OPENID
获取用户信息
这里我将这 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://xxxx.com/Home/LoadCode";
- 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 切 整个授权过程到次结束
来源: https://www.cnblogs.com/suitao/p/9038547.html