最新做一些项目都有微信登录注册什么的,今天就把自己整理的demo提供给大家

微信认证流程(我自己简称三次握手):

1、用户同意授权,获取code

2、通过code换取网页授权access_token,用户openId等信息

3、通过access_token和用户的openId获取该用户的用户信息

因为第一步必须要经过微信的登录授权,不能网页后端请求,所以先要经过用户同意,通过页面网页请求组装的微信请求链接。请求该链接,

获取code后,后端模拟请求。获取用户信息。

微信三次握手的方法(代码)

public class WeiXinOAuth
{
/// <summary>
/// 获取微信Code
/// </summary>
/// <param name="appId">微信AppId</param>
/// <param name="appSecret">微信AppSecret</param>
/// <param name="redirectUrl">返回的登录地址,要进行Server.Un编码</param>
/// <param name="isWap">true=微信内部登录 false=pc网页登录</param>
public string GetWeiXinCode(string appId, string appSecret, string redirectUrl,bool isWap)
{
var r = new Random();
//微信登录授权
//string url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
//微信OpenId授权
//string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
//微信用户信息授权
var url="";
if (isWap)
{
url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" +
redirectUrl + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
}
else
{
url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + appId + "&redirect_uri=" + redirectUrl +
"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
}
return url;
}
/// <summary>
/// 通过code获取access_token
/// </summary>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="code"></param>
/// <returns></returns>
public WeiXinAccessTokenResult GetWeiXinAccessToken(string appId, string appSecret, string code)
{
string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret +
"&code=" + code + "&grant_type=authorization_code";
string jsonStr = UtilsHelper.GetHttp(url);
var result = new WeiXinAccessTokenResult();
if (jsonStr.Contains("errcode"))
{
var errorResult = JsonHelper.JsonDeserialize<WeiXinHelper.WeiXinErrorMsg>(jsonStr);
result.ErrorResult = errorResult;
result.Result = false;
}
else
{
var model = JsonHelper.JsonDeserialize<WeiXinAccessTokenModel>(jsonStr);
result.SuccessResult = model;
result.Result = true;
}
return result;
}
/// <summary>
/// 拉取用户信息
/// </summary>
/// <param name="accessToken"></param>
/// <param name="openId"></param>
/// <returns></returns>
public WeiXinHelper.WeiXinUserInfoResult GetWeiXinUserInfo(string accessToken, string openId)
{
string url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "⟨=zh_CN";
string jsonStr = UtilsHelper.GetHttp(url);
var result = new WeiXinHelper.WeiXinUserInfoResult();
if (jsonStr.Contains("errcode"))
{
var errorResult = JsonHelper.JsonDeserialize<WeiXinHelper.WeiXinErrorMsg>(jsonStr);
result.ErrorMsg = errorResult;
result.Result = false;
}
else
{
var userInfo = JsonHelper.JsonDeserialize<WeiXinHelper.WeiXinUserInfo>(jsonStr);
result.UserInfo = userInfo;
result.Result = true;
}
return result;
}

  

/// <summary>
/// 通过code获取access_token 请求成功的实体
/// </summary>
public class WeiXinAccessTokenModel
{
/// <summary>
/// 接口调用凭证
/// </summary>
public string access_token { get; set; }
/// <summary>
/// access_token接口调用凭证超时时间,单位(秒)
/// </summary>
public int expires_in { get; set; }
/// <summary>
/// 用户刷新access_token
/// </summary>
public string refresh_token { get; set; }
/// <summary>
/// 授权用户唯一标识
/// </summary>
public string openid { get; set; }
/// <summary>
/// 用户授权的作用域,使用逗号(,)分隔
/// </summary>
public string scope { get; set; }
}

  

public class WeiXinAccessTokenResult
{
public WeiXinAccessTokenModel SuccessResult { get; set; }
public bool Result { get; set; } public WeiXinHelper.WeiXinErrorMsg ErrorResult { get; set; }
}

  

/// <summary>
/// 微信帮助类
/// </summary>
public class WeiXinHelper
{
/// <summary>
/// 微信错误访问的情况
/// </summary>
public class WeiXinErrorMsg
{
/// <summary>
/// 错误编号
/// </summary>
public int errcode { get; set; }
/// <summary>
/// 错误提示消息
/// </summary>
public string errmsg { get; set; }
} /// <summary>
/// 获取微信用户信息
/// </summary>
public class WeiXinUserInfoResult
{
/// <summary>
/// 微信用户信息
/// </summary>
public WeiXinUserInfo UserInfo { get; set; }
/// <summary>
/// 结果
/// </summary>
public bool Result { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public WeiXinErrorMsg ErrorMsg { get; set; }
} /// <summary>
/// 微信授权成功后,返回的用户信息
/// </summary>
public class WeiXinUserInfo
{
/// <summary>
/// 用户的唯一标识
/// </summary>
public string openid { get; set; }
/// <summary>
/// 用户昵称
/// </summary>
public string nickname { get; set; }
/// <summary>
/// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
/// </summary>
public string sex { get; set; }
/// <summary>
/// 用户个人资料填写的省份
/// </summary>
public string province { get; set; }
/// <summary>
/// 普通用户个人资料填写的城市
/// </summary>
public string city { get; set; }
/// <summary>
/// 国家,如中国为CN
/// </summary>
public string country { get; set; }
/// <summary>
/// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
/// </summary>
public string headimgurl { get; set; }
/// <summary>
/// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
/// </summary>
public string[] privilege { get; set; }
}
}

  

以上代码,直接在一个类库里面建相应的类就可以,直接封装就ok

下面是前台使用的代码

//获取appId,appSecret的配置信息
string appId = ConfigHelper.GetConfigString("WwAppId");
string appSecret = ConfigHelper.GetConfigString("WwAppSecret"); var weixinOAuth = new WeiXinOAuth();
//微信第一次握手后得到的code 和state
string code = FytRequest.GetQueryString("code");
string state = FytRequest.GetQueryString("state");
if (code == "" || code == "authdeny")
{
if (code == "")
{
//发起授权(第一次微信握手)
string authUrl = weixinOAuth.GetWeiXinCode(appId, appSecret, Server.UrlEncode(Request.Url.ToString()),true);
Response.Redirect(authUrl, true);
}
else
{
// 用户取消授权
Response.Redirect("~/Error.html", true);
}
}
else
{
//获取微信的Access_Token(第二次微信握手)
var modelResult = weixinOAuth.GetWeiXinAccessToken(appId, appSecret, code);
//获取微信的用户信息(第三次微信握手)
var userInfo = weixinOAuth.GetWeiXinUserInfo(modelResult.SuccessResult.access_token, modelResult.SuccessResult.openid);
//用户信息(判断是否已经获取到用户的微信用户信息)
if (userInfo.Result && userInfo.UserInfo.openid != "")
{
//根据OpenId判断数据库是否存在,如果存在,直接登录即可
var oauthUser =
OperateContext<tb_UserLoginOauth>.SetServer.GetModel(m => m.OpenId == userInfo.UserInfo.openid);
if (oauthUser != null)
{
//直接登录即可 根据授权ID,查询用户信息
if (HttpContext.Session != null) HttpContext.Session["FytUser"] = oauthUser.tb_User;
UtilsHelper.WriteCookie("FytUserId",
DESEncrypt.Encrypt(oauthUser.tb_User.ID.ToString(CultureInfo.InvariantCulture)));
}
else
{
//注册操作
OauthReg(userInfo);
}
//授权成功后,直接返回到首页
return RedirectToAction("Index", "MHome");
}
else
{
return Content("授权失败,请返回重新操作!");
}
}

  

网站微信登录授权 ASP.NET的更多相关文章

  1. 关于微信登录授权获取unionid的方法

    前言:微信登录授权是目前普遍存在于小程序的,还有一种静默授权方式是微信提供的但是不推荐使用,由于不同设备登录openid是不同的那么我们应该怎样拿到一个唯一的ID呢,下面做分享 wxml代码 < ...

  2. 混合应用 微信登录授权 微信登录认证失败 ios PGWXAPI错误-1 code:-100 / 安卓 message:invalid appsecret innerCode:40125

    最近项目需要做微信登录,于是利用HTML5+ API Reference的OAuth模块管理客户端的用户登录授权验证功能,允许应用访问第三方平台的资源.(链接:https://www.dcloud.i ...

  3. mui APP 微信登录授权

    一.在微信平台上申请appid.appsecret. 二.app --> manifest.json-->SDK配置(填写申请好的appid和appsecret) 三.在登录页,点击微信登 ...

  4. 网站微信登录-python 实现

    最近微信登录开放公测,为了方便微信用户使用,我们的产品也决定加上微信登录功能,然后就有了这篇笔记. 根据需求选择相应的登录方式 微信现在提供两种登录接入方式 移动应用微信登录 网站应用微信登录 这里我 ...

  5. Vue-router hash模式微信登录授权验证,#号处理

    微信授权登录验证会把网址中的#号去掉,这样在跳转的时候Vue拿不到Code.所以做了以下处理 let href = window.location.href; if (href.includes(&q ...

  6. Java 微信登录授权后获取微信用户信息昵称乱码问题解决

    String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_toke ...

  7. java集成网站微信,微博,qq登录

    微信 WechatConfig.java package com.meeno.chemical.common.sdk.wechat.config; import org.springframework ...

  8. apicloud 第三方登录授权、微信、扣扣、微博登录授权

    授权登录.接入第三方的配置 例如:微信的登录授权. 首先在模块里面添加 wx 这个模块,然后在项目的配置文件里面进行配置. 配置的时候要现在微信开放平台 https://open.weixin.qq. ...

  9. uni-app微信小程序登录授权

    微信小程序授权是非常简单和常用的功能,但为了方便,还是在此记录一下要点: 首先是需要用到一个授权按钮来触发获取用户信息授权: 关键在于 open-type 为 getUserInfo , 然后有个@g ...

随机推荐

  1. Linux CentOS 7通过yum命令安装Mono4.0.1

    前言 上一篇中提到的快照方式安装Mono,该方式并不稳定,需要做各种配置,各种修改才能与jexus搭配运行. 一.安装源 rpm --import "http://keyserver.ubu ...

  2. Thinkphp源码分析系列(五)–系统钩子实现

    Thinkphp的插件机制主要依靠的是Hook.class.php这个类,官方文档中在行为扩展也主要依靠这个类来实现.下面我们来具体看看tp是怎么利用这个类来实现行为扩展的. 首先,行为扩展是什么?有 ...

  3. bond汇总

    七种bond模式说明: 第一种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略)特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就 ...

  4. 使用onclick跳转到其他页面/跳转到指定url

    ☆如果是本页显示可以直接用location,方法如下: ①onclick="javascript:window.location.href='URL'" ②onclick=&quo ...

  5. 安装zabbix报错configure: error: libcurl library not found

    libcurl 和libcurl-devel都已经安装 且大于7.13.1 但还是报错,这时需要在configure 指定curl路径即可 ./configure --prefix=/usr/loca ...

  6. opencv嫁接vlfeat densesift

    #include <opencv2/opencv.hpp> #include <iostream> extern "C" { #include <vl ...

  7. Nginx启动报错: could not open error log file: open() &q

    启动nginx报如下错误: nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error ...

  8. VMware 虚拟机桥接网络设置

    一.桥接的基本原理    配置成桥接网络连接模式的虚拟机就当作主机所在以太网的一部分,虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑,可以像主机一样可以访问以太网中的所有共享资源和网络连 ...

  9. Sql Server中不常用的表运算符之UNPIVOT

    在Sql Server中不常用的表运算符之PIVOT中,介绍了PIVOT表运算符,现在来说说与之相对应的另一个表运算符UNPIVOT. 从名字可以看出,这个运算符的作用与PIVOT刚好相反,是将一行的 ...

  10. vs2010 打开 vs2012 的解决方案

    vs2010 打开 vs2012 的解决方案   vs2012 出来了,但是MS还是一如既往的向下兼容. 废话不多说,直接主题 要使用vs2010打开vs2012的解决方案必须得改2个东西,解决方案 ...